I did one small event registration smart contract (By using solidity()) in that I purchased a ticket for an event by giving the details of my email id and no.of tickets I want. Finally, I want to know how can I get back what are the details I was given. I am using testrpc, truffle, and private net. After clicking on purchase I got these details in tetrpc terminal
Transaction: 0x35e92857102b0dbacd43234d1ea57790405eb9bef956b245c6b7737bc23d011b
Gas usage: 106532 Block Number: 5 Block Time: Sat Feb 03 2018 12:05:57 GMT+0530 (IST)
I decode the transaction id like:
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)>
but I didn't get the details I was given while purchasing. Please tell me how can I do this?
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
});