如何从以太坊区块链中的块中检索数据?

时间:2018-02-03 07:03:26

标签: blockchain ethereum

我做了一个小型活动注册智能合约(通过使用solidity()),因为我通过提供我的电子邮件ID和我想要的门票的详细信息购买了活动门票。最后,我想知道如何才能找回给出的详细信息。我正在使用testrpc,松露和私人网络。 点击购买后,我在tetrpc终端获得了这些细节

  

交易:   0x35e92857102b0dbacd43234d1ea57790405eb9bef956b245c6b7737bc23d011b
  燃气使用:106532编号:5封锁时间:2018年2月3日星期六   格林尼治标准时间12:05:57 + 0530(IST)

我解码了交易ID,如:

gopi145@ubuntu:~/EventRegistration-POC/EventRegistration$ truffle console
truffle(development)> web3.eth.getTransaction('0x35e92857102b0dbacd43234d1ea57790405eb9bef956b245c6b7737bc23d011b')
{ hash: '0x35e92857102b0dbacd43234d1ea57790405eb9bef956b245c6b7737bc23d011b',
  nonce: 4,
  blockHash: '0x7c790dae57babfe40d68d8aad94913c2b748501c5734aec86cc3fcf0afc4f154',
  blockNumber: 5,
  transactionIndex: 0,
  from: '0x031e060414a0d2573f5b10bc75c0894d72288292',
  to: '0xa88a366e888bbccfb78092957ffc7760bc7c6db1',
  value: BigNumber { s: 1, e: 18, c: [ 60000 ] },
  gas: 200000,
  gasPrice: BigNumber { s: 1, e: 0, c: [ 1 ] },
  input: '0xa28f161c00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000b6d40676d61696c2e636f6d000000000000000000000000000000000000000000' }
truffle(development)> 

但我没有得到我在购买时给出的细节。请告诉我该怎么做?

1 个答案:

答案 0 :(得分:2)

web3.eth.getTransaction(txHash) will returns transaction details like blockHash, transactionIndex, from, to, etc.

It will take some time to miner to mine block and add to blockchain. So its not instant.

If you want to know any storage value is added/modified in blockchain to outside world, then we need to raise en event in smart contract.

Using Web3JS(JSON-RPC/WS-RPC) you need to register and listen for an event. When your transaction get mined you will receive an event.

Event will store as a log, and its very cheap when compare to storage. No one can able to modify event data.

Below code for the same.

Solidity code:

pragma solidity ^0.4.17;
//Contract for storing ticket info
contract TicketRes {

  event on_success_booking(address userId, string bookingId, string emailId);
  //Ticket info having two storage values i.e email and userID
  struct BookingInfo{
     string emailId;
     address userId;
  }
  //Map for saving all the info, assuming all ticket has unique id as key. Value is ticket info
  mapping(bookingId=>BookingInfo) internal info;
  function Book() public {
  }
   //Method will save all basic info, and will raise event.
  function onBookingCompleted(address id, string bookingId, string emailId) public {
       info[bookingId] = BookingInfo(emailId,userId);

       on_success_booking(id, bookingId, emailId);
  }
 //You can get info by using bookingid at any point of time. 
 function getBookingInfo(string bookingId) public constant returns(string, address){
       return (info[bookingId].emailId, info[bookingId].userId);
 }

}

Now Javascript code:

// Contract deployed address.
var contractAddress = "0x06433f4fc50423f71329597f50fb0a42cfecb11f"; 

if (typeof web3 !== 'undefined') {
     web3 = new Web3(web3.currentProvider);
} else {
     // set the provider you want from Web3.providers
     web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545"));
}

//Open build folder and you will find contact json file copy the appropriate JSON and paste it there.
var contractABI = web3.eth.contract(/** ABI Here **/);

//Connected contract to your local network
var contract = contractABI.at(contractAddress);

//Loading booking event function.
var booking_event = web3.sha3('on_success_booking(address,string,string)');

//Watching events, when onBookingCompleted() tran's mined then event get triggered. You can get all previous events also. for that need to apply filters.
booking_event.watch((error, result) => {
   if(error){
       console.log("error",error);
   }
   console.log("Result", result); //result.args holds values, result.args.id, result.args.bookingId and result.args.emailid
 });