åã®èšäºã§ã¯ãMistãŠã©ã¬ããã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãä»ããã³ã³ãã©ã¯ãã®å±éãšããããšã®çžäºäœçšã«ã€ããŠèª¬æããŸããããããã¯å®éã®éçºã«ã¯é©ããŠããŸããã ãŠãŒã¶ãŒã¢ããªã±ãŒã·ã§ã³ã³ãŒããããããã¯ãã§ãŒã³ãæäœã§ããã©ã€ãã©ãªãå¿
èŠã§ãã ãã®èšäºã§ã¯ãWeb3.jsã©ã€ãã©ãªãŒãç°¡åã«èŠãŠãGethã³ã³ãœãŒã«ããæããŸãã ãããŠãããããéçºè
ã ãã§ãªãæœåšçãªé¡§å®¢ã«ãé¢å¿ãããå¥ã®éèŠãªãããã¯-ãããã¯ãã§ãŒã³ã®ãã©ã³ã¶ã¯ã·ã§ã³ã«ã¯ã©ããããã®è²»çšãããããŸããïŒ

Mistããå¥çŽãå±éããæ¹æ³ã¯ãã§ã«ç¥ã£ãŠããŸãã ããããMistã¯äž»ãªæ©èœãžã®ã°ã©ãã£ã«ã«ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããåãªãã¢ããªã±ãŒã·ã§ã³ã§ãã Gethã¯ã©ã€ã¢ã³ãã«åºã¥ããŠåäœããŸãã Gethã¯ãEthereumãããã³ã«ã®Goå®è£
ã®äžéšã§ãã Goå®è£
ã¯1ã€ã ãã§ã¯ãããŸãããæãäžè¬çãªå®è£
ã®1ã€ã¯ãããšãã°ãããªãã£-ãã³å®è£
ã§ãã Parityã§ã¯ãå¥ã®ãã¹ããããã¯ãŒã¯ã䜿çšã§ããããšã«æ³šæããŠãã ãã-Kovanã¯ãProof-of-Authorityã䜿çšããŸã-ããã¯ãRokkebyã®ãããã¯ã®äœæäœæ¥ã忣ããããã®åãã¢ã«ãŽãªãºã ã§ãïŒRopstenã®Proof-of-Workã®ä»£ããã«ïŒã ããã«ãParityã¯Mistã䜿çšãããWebã€ã³ã¿ãŒãã§ãŒã¹äžã®ãŠã©ã¬ããã䜿çšããŸãã ãã ããåœé¢ã¯Goã®å®è£
ã«çŠç¹ãåœãŠãŸãã Gethã¯ãã€ãŒãµãªã¢ã ãããã¯ãŒã¯ãžã®ãšã³ããªãã€ã³ãã§ãã ãã®åäœã瀺ãããã«ãæäŸãããŠããã³ãã³ãã©ã€ã³ã䜿çšã§ããŸãã ã³ãã³ãã©ã€ã³ã¯éåžžã®JavaScriptãè§£éããŸãã åã®èšäºã§Mistã䜿çšããŠäœæãããã®ãšåãã³ã³ãã©ã¯ãã«ã¢ã¯ã»ã¹ããŠã¿ãŸãããã ãŸããå¥çŽã®äœæãšã€ã³ã¿ãŒãã§ãŒã¹ããã¡ã€ã«ã«ä¿åããŸãããããã¯åŸã§å¿
èŠã«ãªããŸãã Mistã¯Gethã䜿çšããŠãããããç«¶åãçºçããªãããã«MistãéããŸãïŒããã¯ãMistã®Windowså®è£
ã«ã¯é©çšãããŸããã
ãããã«ã¡ã¯ã³ãã³ãã©ã€ã³ïŒã
ã³ã³ãœãŒã«ã§gethãå®è¡ããŸãïŒgethã®ã€ã³ã¹ããŒã«æ¹æ³ã¯
ãã¡ãã§ç¢ºèªã§ã
ãŸã ïŒã
$ geth console --testnet 2>>geth.log
--testnet
ãã©ã°ã¯ãç§ãã¡ãRopstenãã¹ããããã¯ãŒã¯ã«æ¥ç¶ããŸãã Rinkebyã«æ¥ç¶ããã«ã¯ã
--rinkeby
ãã©ã°ã
--rinkeby
ãŸãã ããã«ãæšæºã®gethã¹ããªãŒã ïŒstderrïŒããgeth.logãã¡ã€ã«ã«ã¡ãã»ãŒãžããªãã€ã¬ã¯ãããŸããããããªããšãã³ã³ãœãŒã«ã§å¹²æžããŸãã
ããŒã ã®çµæãšããŠããŠã§ã«ã«ã ã¡ãã»ãŒãžã衚瀺ãããŸãã ãŸããæ¬¡ã®ã³ãã³ãã䜿çšããŠãŠã©ã¬ããã®æ®é«ã調ã¹ãŠã¿ãŸãããïŒå¿
ãããä»ã®ãã®ã䜿çšããããšã¯ã§ããŸããããã¢ãã¬ã¹ããããŸãïŒã³ã€ã³ããŒã¹ãšåŒã°ããæšæ¶ã«è¡šç€ºãããŸãïŒã
> eth.getBalance(eth.coinbase)
çµæã®äŸïŒ
22159430784000000000
ãšãŒãã«ã§ã¯ãªããwei-ãšãŒãã«ã®éã®å¯èœãªéãæå°ã®æž¬å®åäœã§è¡šç€ºãããããããã®æ°ã¯éåžžã«å€§ããããšãŒãã«ãæäœãããšãã«ã³ãŒãã§ã䜿çšãããŸãã MistãŠã©ã¬ããã®ããã«ãéåžžã®ãšãŒãã«ã§çªå·ã衚瀺ããã«ã¯ã倿ã远å ã§ããŸãã
> web3.fromWei( eth.getBalance(eth.coinbase) ) 22.159430784
å¥çŽãéå§ããŸãã å¥çŽã®ã¢ãã¬ã¹ã倿°ã«å²ãåœãŠãŸãã
> var address = "0x65cA73D13a2cc1dB6B92fd04eb4EBE4cEB70c5eC";
ã³ã³ãã©ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã倿°ã«å²ãåœãŠãŸãã
> var abi = [ { "constant": false, "inputs": [ { "name": "newString", "type": "string" } ], "name": "setString", "outputs": [], "payable": false, "type": "function" }, { "constant": true, "inputs": [], "name": "getString", "outputs": [ { "name": "", "type": "string", "value": "Hello World!" } ], "payable": false, "type": "function" } ];
å¥çŽãªããžã§ã¯ããäœæããŸãã
> var contract = web3.eth.contract(abi);
ãã®ãªããžã§ã¯ãã䜿çšããŠãæ¢åã®ã³ã³ãã©ã¯ããéããããæ°ããã³ã³ãã©ã¯ããå±éãããã§ããŸãã ãã®å Žåãæåã®ãã®ãå¿
èŠã§ãããã®ããã«ã³ãã³ããå®è¡ããŸãïŒ
> var stringHolder = contract.at(address)
åã³ãã³ãã®åºåã¯
undefined
-泚æããªãã§ãã ããã ã¢ãã¬ã¹ãšã€ã³ã¿ãŒãã§ã€ã¹ã®å€ã眮ãæããŸãããµã³ãã«ãäœæãããšããšåããã¹ããããã¯ãŒã¯ïŒRopstenïŒã«ããå Žåã¯ãã³ã³ãã©ã¯ãã䜿çšã§ããŸãã å¥çŽã®æ©èœãåŒã³åºããŸãã
> stringHolder.getString() "Hello World!" > stringHolder.setString("Hello my baby, hello my honey!"); Error: invalid address at web3.js:3879:15 at web3.js:3705:20 at web3.js:4948:28 at map (<native code>) at web3.js:4947:12 at web3.js:4973:18 at web3.js:4998:23 at web3.js:4061:16 at apply (<native code>) at web3.js:4147:16
getString
ã¡ãœãããæ£ããæ©èœãã
setString
ããšã©ãŒãåŒãèµ·ãããããšãããããŸãã ãã®å Žåãèªç©ºã§æ¯æãããšãã§ããå£åº§ããååŒãå®è¡ããå¿
èŠãããããããã®ãšã©ãŒãçºçããŸãã æ¬¡ã®ã³ãã³ãã䜿çšããŠã¢ã«ãŠã³ãã®ãããã¯ãè§£é€ãïŒãã©ã€ããŒãããŒã®ãã¹ã¯ãŒããå
¥åããå¿
èŠããããŸãïŒããã©ã³ã¶ã¯ã·ã§ã³ãå®è¡ããã¢ã«ãŠã³ããèšå®ãã远å ãªãã·ã§ã³ã䜿çšããŠ
setString
å床å®è¡ããŸãã
> web3.personal.unlockAccount(eth.coinbase); Unlock account 0x< > Passphrase: true > stringHolder.setString("Hello my baby, hello my honey!", {from: eth.coinbase}); "0x5f9c3a61c79df36776713f7373b902feea802cf6d3903195f8070ff2d376c669"
ãã©ã³ã¶ã¯ã·ã§ã³çªå·ãè¿ãããŸãã ãã®çªå·ã䜿çšããŠãetherscan Webãµã€ãã§ãã©ã³ã¶ã¯ã·ã§ã³ã远跡ã§ããŸã
ãRopstenã®å Žåã¯ropsten.etherscan.ioãRinkebyã®å Žåã¯
rinkeby.etherscan.io ãæ€çŽ¢ã§ãã©ã³ã¶ã¯ã·ã§ã³çªå·ãå
¥åããããã³ãã³ããå®è¡ããŸãã
> web3.eth.getTransaction("0x5f9c3a61c79df36776713f7373b902feea802cf6d3903195f8070ff2d376c669");
ç§ãã¡ã®ä»£ããã«ããªãã®ååŒçªå·ã眮ãæããããšãå¿ããªãã§ãã ããã
ãã©ã³ã¶ã¯ã·ã§ã³ã®è©³çްãå«ãæ§é ãåç
§ããŠãã ããã ããã§
getString
ãå®è¡ããŠãè¡ã倿Žãããããšã確èªã§ããŸãã
> stringHolder.getString(); "Hello my baby, hello my honey!"
ã¬ã¹ã¯ã©ã®ããã«æ¶è²»ãããŸãã
åã®èšäºã§ãç§ãã¡ã¯ãã§ã«ã¬ã¹ãšã¯äœããæžããŸããã 䟿å®äžã以äžãæãåºããŠãã ããã
ãšãŒãã«ã¯ãããŒã¿å€æŽæäœã«å¿
èŠã§ãããããããã¬ã¹ã®ä»£åãšãªããŸããããã¯ããã©ã³ã¶ã¯ã·ã§ã³ãå®äºããããã«å¿
èŠãªäœæ¥ãè©äŸ¡ããã®ã«åœ¹ç«ã€æœè±¡çãªæž¬å®åäœã§ãã ãã®è©äŸ¡ããšãŒãã«ã®çŸåšã®åžå ŽäŸ¡å€ããç¬ç«ãããããã«å¿
èŠã§ãã ãã©ã³ã¶ã¯ã·ã§ã³ãéä¿¡ãããšãã«ãã¬ã¹ã®åãŠãããã«å¯ŸããŠæ¯æããšãŒãã«ã®éãšãæ¯æãææã®ããã¬ã¹ã®æå€§éãæå®ã§ããŸãã å²ãåœãŠãéãå€ãã»ã©ãæœåšçãªãã€ããŒã®ãã©ã³ã¶ã¯ã·ã§ã³ã®åªå
床ãé«ããªããŸãã å®éãæ¬è³ªçã«ãã¬ã¹æéã¯ãååŒãå®äºããŠæ¬¡ã®ãããã¯ã«å«ããããã®é±å€«ã®ä»äºã®æ¯æãã§ãã ãããã£ãŠãæ¡ææã«ãèŠã€ãã£ããããã¯ã®åºå®æéã«å ããŠ-å·çæç¹ã§ã¯5ãšãŒãã«ã§ã-é±å€«ããã©ã³ã¶ã¯ã·ã§ã³æéïŒéåžžã¯ãšãŒãã«ã®æ°çŸåã®1ïŒãåãåããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ãããã®ã¬ã¹ã®éã¯ãããŒã¿æäœã®èšç®ã®è€éãã«äŸåããŸãã
ãã©ã³ã¶ã¯ã·ã§ã³äžã«æ¯æããšã¬ã¹æ¶è²»ãã©ã®ããã«çºçããããæç¢ºã«ç€ºãããã«ãæ°ããå¥çŽãäœæããŸãã åæã«ãå¥ã®ã³ã³ãã€ã«ããã³å±éæ¹æ³ã䜿çšããŸã-ã³ãã³ãã©ã€ã³ã䜿çšããŸãã
1.ãã¢ã³ã¹ãã¬ãŒã·ã§ã³çšã®å¥çŽã®å±é
次ã®å¥çŽãæ€èšããŠãã ããã
pragma solidity ^0.4.10; contract UselessWorker { int public successfullyExecutedIterations = 0; function doWork(int _iterations) { successfullyExecutedIterations = _iterations; for (int i = 0; i < _iterations; i++) { keccak256(i); } } }
ã³ã³ãã©ã¯ãã«ã¯ã1ã€ã®
doWork
颿°ã®ã¿ãå«ãŸããŸãããã®é¢æ°ã¯ããã©ã¡ãŒã¿ãŒãšããŠååŸ©åæ°
int _iterations
ããã®åŸã«ãŒãã«ãŠã³ã¿ãŒããã®
keccak256
ããã·ã¥ãèæ
®ããŸãã ãã®ãããç°ãªãäœæ¥éãäžããŠãå¿
èŠãªã¬ã¹éãããã«ã©ã®ããã«äŸåãããã確èªã§ããŸãã ã³ã³ãã©ã¯ãã«æ ŒçŽãããŠããå¯äžã®å€æ°-successfulExecutedIterations-ã¯ãæåŸã®éå§æã«å®äºãããµã€ã¯ã«ã®æ°ãä¿åããããã«äœ¿çšãããŸãã ã¬ã¹æµéãè¶
ããå Žåã«äœãèµ·ãããã瀺ãããã«å¿
èŠã§ãã
å¥çŽã®ããã¹ãããã¡ã€ã«UselessWorker.solã«ä¿åããŸãã ã³ã³ãã€ã«ã«ã¯ãsolc-solidityã³ã³ãã€ã©ã䜿çšããŸãïŒã€ã³ã¹ããŒã«æé ã¯
ãªã³ã¯ã«ãããŸã ïŒã
$ solc --bin --abi UselessWorker.sol
--abi
ãš
--abi
ã䜿çšããŠããã€ããªã³ãŒããšã€ã³ã¿ãŒãã§ã€ã¹ãçæããããã³ã³ãã€ã©ãŒã«æç€ºãããšã次ã®ãããªå¿çãã³ãã³ãã«å¯ŸããŠçºè¡ãããŸãã
======= UselessWorker.sol:UselessWorker ======= Binary: Contract JSON ABI [{"constant":true,"inputs":[],"name":"successfullyExecutedIterations","outputs":[{"name":"","type":"int256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_iterations","type":"int256"}],"name":"doWork","outputs":[],"payable":false,"type":"function"}]
gethãå®è¡ããŠå±éãå®è¡ããŸãã
$ geth console --testnet 2>>geth.log
æåã«ãã³ã³ãã€ã©ãŒåºåãã倿°ãã³ããŒããŠããã€ããªã³ãŒããšã€ã³ã¿ãŒãã§ã€ã¹ã倿°ã«å²ãåœãŠãŸãã
ãã€ããªã³ãŒãã®åã«0xã远å ããå¿
èŠãããããšã«æ³šæããŠãã ãã ã
> var bin = ""; > var abi = [{"constant":true,"inputs":[],"name":"successfullyExecutedIterations","outputs":[{"name":"","type":"int256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_iterations","type":"int256"}],"name":"doWork","outputs":[],"payable":false,"type":"function"}];
éãå Žåãšåæ§ã«ãå¥çŽãªããžã§ã¯ããäœæããŸãã
> var contract = web3.eth.contract(abi);
å¥çŽã®å±éãå®è¡ããŸãããã ãããã€ã¡ã³ãã¯ãç¹å®ã®ã¢ã«ãŠã³ãã«ä»£ãã£ãŠå®è¡ããå¿
èŠããããã©ã³ã¶ã¯ã·ã§ã³ã§ãããã¬ã¹ãæ¶è²»ããåŸ
æ©ããå¿
èŠããããŸãã ãããã£ãŠããã®å Žåã¯å¿
èŠã§ã¯ãªãã³ã³ã¹ãã©ã¯ã¿ãŒåŒæ°ãšãã©ã¡ãŒã¿ãŒã®é
åïŒfromãdataãgasïŒã«å ããŠãã³ã³ãã©ã¯ãã®å±éã¯ã³ãŒã«ããã¯ïŒãã®å Žåããšã©ãŒããã¹ããŸãã¯ã³ã³ãã©ã¯ãã®ã¢ãã¬ã¹ã®ãããããçºè¡ããæãåçŽãªãã®ïŒãåãå
¥ããŸãã ãã ããæåã«ã¢ã«ãŠã³ãã®ããã¯ãè§£é€ããå¿
èŠããããŸãã
> web3.personal.unlockAccount(eth.coinbase);
次ã«ããã®ã¢ã«ãŠã³ãããéä¿¡ãããã©ã³ã¶ã¯ã·ã§ã³ã§ã³ãã³ããå®è¡ã§ããŸãã
> var uselessWorker = contract.new( {from: eth.coinbase, data: bin, gas: 1000000}, function(e, contract) { if (e) { console.log(e); } else { if (contract.address) { console.log ("mined " + contract.address); } } });
次ã«ãåæ§ã®çããæåŸ
ããŸãã
mined 0xaad3bf6443621f24099ee4f51a22c8d7e9f63548
ããã¯ãå¥çŽãä¿®æ£ãããããšãæå³ãããã®å¥çŽã®æ©èœãåŒã³åºãããšãã§ããŸãã
> uselessWorker.successfullyExecutedIterations(); 0
å¥çŽã§ã¯ãã®ãããªæ©èœã説æããŠããŸãããã
public
ãã£ãŒã«ãããšã«èªåçã«äœæãããããšã«æ³šæããŠãã ããã
2.ã¬ã¹æ¶è²»å®éš
颿°ãåŒã³åºããšãã«å¿
èŠãšãªãããããã®ã¬ã¹ã®éãèšç®ããããšããå§ããŸãããããããè¡ãã«ã¯ã察象ã®ã¡ãœããã®ãã©ã¡ãŒã¿ããã©ã¡ãŒã¿ãšããŠguessGasã«æž¡ãããŠããéã«ã察象ã®ã³ã³ãã©ã¯ãã¡ãœããã§
estimateGas()
ã¡ãœãããåŒã³åºããŸãã ãã®å Žåãæ¬¡ã®ããã«åŒã³åºãããšãã§ããŸãã
> uselessWorker.doWork.estimateGas(1); 41801 > uselessWorker.doWork.estimateGas(2); 41914 > uselessWorker.doWork.estimateGas(3); 42027
èšç®ã«ãããšãåãµã€ã¯ã«ã¯113ã¬ã¹ãæ¶è²»ããã¯ãã§ãã æŸéæã¯ãããã§ããïŒ ãããè¡ãã«ã¯ã䜿çšããã¬ã¹ã®äŸ¡æ Œãç¥ãå¿
èŠããããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ã®éä¿¡æã«æå®ãããŠããªãå Žåãããã©ã«ãå€ã衚瀺ãããŸãïŒããã«ãšãŒãã«ã«å€æãããŸãïŒïŒ
> web3.fromWei( eth.gasPrice ); 1e-7
ããã¯ããã®å Žåãããã©ã«ãã§1ã¬ã¹ã®ã³ã¹ãã0.0000001ãšãŒãã«ã§ããããšãæå³ããŸãã ãã®äŸ¡æ Œã¯ãçŸåšã®ã³ãã³ããã©ã®ããã«å®è¡ãããã®éçšã§ãåºå®ãããã倿Žããããããããšã¯ãããŸããã ãããã£ãŠãå€ã¯ç°ãªãå¯èœæ§ããããŸãã ãã®æ¹æ³ã§ã®ååŒææ°æã¯ãã¬ã¹ã®äŸ¡æ Œã«ã¬ã¹ã®éãä¹ãããã®ã«çãããªããŸãã 1ãµã€ã¯ã«ã®äŸ¡æ Œãèšç®ããŸãïŒäŸ¡æ Œã«ã¯ãµã€ã¯ã«èªäœã ãã§ãªãããã©ã³ã¶ã¯ã·ã§ã³ãåãå
¥ããããã®åæäŸ¡æ Œãå«ãŸããŸãïŒã
> web3.fromWei( eth.gasPrice * uselessWorker.doWork.estimateGas(1) ); "0.0041801"
ãã®äŸ¡æ Œã§ã¯ãçŽ10,000ãµã€ã¯ã«ã§ãšãŒãã«ã®10åã®1ã®é åã§ææ°æãçºçããŸãã ãã§ãã¯ïŒ
> web3.fromWei( eth.gasPrice * uselessWorker.doWork.estimateGas(10000) ); "0.1171752"
æ¬åœã«ã ãããã10000ã§ã¯ãªããããšãã°1,000,000ãæå®ãããšã©ããªããŸããïŒ çµæã¯æ¬¡ã®ããã«ãªããŸãã
> web3.fromWei( eth.gasPrice * uselessWorker.doWork.estimateGas(1000000) ); "0.4704624"
ãã®äžåè¡¡ã¯ãæ¶è²»ã§ããã¬ã¹ã®æå€§éããããšããäºå®ããçããŸãã ãã®æ°éã«ãããã©ã«ãå€ããããŸããããã®å Žåã¯è¡šç€ºã§ããŸããã æ¯æãæºåãã§ããŠããã¬ã¹å¶éãæç€ºçã«èšå®ãããšã©ããªããèŠãŠã¿ãŸãããã ãã ãããŸããäŸ¡æ Œã倿Žããããã©ããã確èªããŸãã
> web3.fromWei( eth.gasPrice ); 2.8e-7
ããã¯ã»ãŒ3åã«æé·ããŸããïŒç§ãã¡ã®åœã§ã¯ããã¯30å以å
ã«èµ·ãããŸããïŒã ããã©ã«ãäŸ¡æ Œã¯åžå ŽäŸ¡æ Œãšã¿ãªããããããåçã«å€åããŸãã æåã«äœ¿çšããã®ãšåãäŸ¡æ Œã®èŠç©ãããä¿æããããã«ãã¬ã¹ã®äŸ¡æ ŒïŒweiã§ïŒã倿°ã«å²ãåœãŠãŸãã
> var fixedGasPrice = 100000000000;
äŸ¡æ Œã§10äžãµã€ã¯ã«ã®äŸ¡æ Œãèšç®ããŸãïŒ100äžãµã€ã¯ã«ã«ã¯æéãããããããå ŽåããããŸãïŒããã¬ã¹å¶éïŒãã©ã¡ãŒã¿ãŒgasïŒã倿ŽããŸãã
> web3.fromWei( fixedGasPrice * uselessWorker.doWork.estimateGas(100000, {gas: 100000000}) ); "1.1341816"
ã¬ã¹ã®éã1000ã«å¶éããŸãã
> web3.fromWei( fixedGasPrice * uselessWorker.doWork.estimateGas(100000, {gas: 1000}) ); "0.0001"
ãã®å ŽåãæäŸããããã¹ãŠã®ã¬ã¹ãæ¶è²»ãããŸãã 倿Žã¯ãããã¯ãã§ãŒã³ã«ä¿åãããŸããããé±å€«ã¯ã¬ã¹ããªããªããŸã§äœæ¥ãè¡ã£ããããæ¯æããåãåããŸãã ãããã£ãŠãã¬ã¹å¶éãæ£ãã瀺ãããšãéèŠã§ãã å®è¡ã¯ãããã¯ãã§ãŒã³ã®çŸåšã®ç¶æ
ã«åºã¥ããŠããããã
estimateGas
颿°ã¯åžžã«ä¿¡é Œã§ããããŒã¿ãæäŸã§ããããã§ã¯ãããŸãããããã¯ããã®ãã©ã³ã¶ã¯ã·ã§ã³ã®å®è¡äžã«ç°ãªãå Žåããããç°ãªãã¬ã¹æ¶è²»ã䌎ããŸãã
ã¡ãœããã®å®éã®å®è¡ãšãäºæž¬å€ãšã®æ¯èŒã«ç§»ããŸãããã ãŸããã¢ã«ãŠã³ãã®æ®é«ãèŠãŠèŠããŠã¿ãŸãããã
> initialBalance = eth.getBalance(eth.coinbase); 5006820644000000000
10ãµã€ã¯ã«ãå®äºãããšããŸãã ãã®åŒã³åºãã«å¿
èŠãªã¬ã¹éãèšç®ããŸãã
> uselessWorker.doWork.estimateGas( 10 ); 42818
ãã®æäœã«ã¯
fixedGasPrice
äŸ¡æ Œã䜿çšããŸãããã¬ã¹ã®æå€§éã42000ã«èšå®ããŸãïŒäºæž¬å€ãããäœããããããã¯ããããååã§ã¯ãããŸããïŒã ãããã£ãŠãæäŸããããã¹ãŠã®ã¬ã¹ã®æ¶è²»ãèæ
®ããæ¯æãã¯ãweiã§è¡ãå¿
èŠããããŸãã
> predictedCost = 42000 * fixedGasPrice; 4200000000000000
äœãæŸéãããŸããïŒ
> web3.fromWei(predictedCost); "0.0042"
å¶éãšäŸ¡æ Œã®ã¿ã¹ã¯ã§ãã©ã³ã¶ã¯ã·ã§ã³ãå®äºããŸãïŒãã ãããã®åã«ã¢ã«ãŠã³ãã®ããã¯ãè§£é€ããŸãïŒã
> web3.personal.unlockAccount(eth.coinbase); > transaction = uselessWorker.doWork( 10, { from: eth.coinbase, gas: 42000, gasPrice: fixedGasPrice } ); "0xc0590a2cf39c3e4339253ecf11d124177b75502cea368adcf30d1b7d6933ef5a"
ãã©ã³ã¶ã¯ã·ã§ã³çªå·ã«ãã£ãŠãæ¬¡ã®æäœãè¡ãããšã§ã¹ããŒã¿ã¹ã远跡ã§ããŸãã
> result = web3.eth.getTransactionReceipt(transaction);
çµæã¯æ¬¡ã®ãããªæ§é ã«ãªããŸãã
{ blockHash: "0x91b63b43856e62fd26ad7f401bfe556cc100e8adf4b5ac510261e91adb9953a3", blockNumber: 1375978, contractAddress: null, cumulativeGasUsed: 740323, from: "0x334731990b420d7fe77347545c45a689becfca08", gasUsed: 42000, logs: [], logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", root: "0x07dc7178ac2abaa2460cd94d5eb7bf6d7ed9ed09e3e74a4b53321b5c210932c0", to: "0xaad3bf6443621f24099ee4f51a22c8d7e9f63548", transactionHash: "0xc0590a2cf39c3e4339253ecf11d124177b75502cea368adcf30d1b7d6933ef5a", transactionIndex: 1 }
çµæã
nil
å Žåããã©ã³ã¶ã¯ã·ã§ã³ã¯ãŸã ãããã¯ã«è¿œå ãããŠããªããããåŸ
æ©ããŠã³ãã³ããå詊è¡ããå¿
èŠããããŸãã
ãã®æ§é ã§ã¯ãäºæ³éãã
gasUsed
ã¬ã¹
gasUsed
ã42,000ã§ããããšã
gasUsed
ã æ®é«ã倿Žããããã©ããã確èªããŸãã
> web3.fromWei( initialBalance - eth.getBalance(eth.coinbase) ); "0.0042"
äºæ³ã©ãããæ¶è²»éã¯0.0042ãšãŒãã«ã§ããã å¥çŽã®ããŒã¿ã倿Žããããã©ããã確èªããŸãã
> uselessWorker.successfullyExecutedIterations(); 0
ã³ã³ãã©ã¯ãã®å²ãåœãŠãã«ãŒãã®åã«å®è¡ããããšããäºå®ã«ããããããã倿°ã«ã¯äœãä¿åãããŸããã§ããã ãããã£ãŠãã¬ã¹äžè¶³ã®å Žåã倿Žã¯å®å
šã«ããŒã«ããã¯ãããããšãããããŸãã ãã ããäœæ¥ãå®äºããŠããããããã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯ãããã¯ã«è¿œå ããããŸãŸã§ããããããããã¯çªå·ãšä»ã®ãã¹ãŠã®æ
å ±ã確èªã§ããŸãã ãã ããæ
å ±ã§ã¯ããã¹ãŠã®ã¬ã¹ãæ¶è²»ãããããšãé€ããŠãä»ã®ãšã©ãŒã®å
åã¯èŠãããŸããã ãã¹ãŠã®ã¬ã¹ã䜿ãæããããããããå¿
èŠã§ã¯ãªããªã£ãããŸãã ãå¯èœæ§ã®ããã±ãŒã¹ã§ãã©ã³ã¶ã¯ã·ã§ã³ã®ã¹ããŒã¿ã¹ã倿ããæ¹æ³ æ®å¿µãªããããµã€ãã調ã¹ãïŒããšãã°ã
ããã«ãã©ã³ã¶ã¯ã·ã§ã³
ã®ãªã³ã¯ããããŸããä»ã®ãã©ã³ã¶ã¯ã·ã§ã³ãæ€çŽ¢ãããšã©ãŒã§å®äºãããã©ããã確èªã§ããŸãïŒããŸãã¯ãããã°ããŒã«ã䜿çšããŠåããã©ã³ã¶ã¯ã·ã§ã³ã®éä¿¡ãåã·ãã¥ã¬ãŒããããããç°¡åãªæ¹æ³ã¯ãŸã ãããŸããã
ããã§ãäºæ³ãããããã«å€ãå¶éãæå®ããå Žåã«äœãèµ·ãããã確èªããŸãããã åæãã©ã³ã¹ãç¶æããŸãã
> initialBalance = eth.getBalance(eth.coinbase); 5002620644000000000
ä»åã¯43,000ã®ã¬ã¹ãå²ãåœãŠããã©ã³ã¹ã®å€åãæåŸ
ã§ããŸã
> 43000 * fixedGasPrice; 4300000000000000
æ°ããå¶éã§ãã©ã³ã¶ã¯ã·ã§ã³ãå®äºããŸãããïŒ
> web3.personal.unlockAccount(eth.coinbase); > transaction = uselessWorker.doWork( 10, { from: eth.coinbase, gas: 43000, gasPrice: fixedGasPrice } );
ãããŠããã®å®è¡ã®çµæãååŸããŸãã
> result = web3.eth.getTransactionReceipt(transaction);
{ blockHash: "0xe9793206faf5e923042488d4312d542db2c5189d25a0014d894179fce222705d", blockNumber: 1376028, contractAddress: null, cumulativeGasUsed: 131780, from: "0x334731990b420d7fe77347545c45a689becfca08", gasUsed: 42817, logs: [], logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", root: "0x51fd139db608c2fa833e5de205497368362853b8e778787e85180e1cde206151", to: "0xaad3bf6443621f24099ee4f51a22c8d7e9f63548", transactionHash: "0xd69e46cbb9c139cc2c56ae4860b2e73e4581a97fc016c2848dc6bd399e9b5196", transactionIndex: 2 }
äœ¿çšæžã¿42817ã¬ã¹ïŒäºæž¬ãã1å°ãªãïŒã
ãšãŒãã«æ¶è²»ïŒ
> web3.fromWei( initialBalance - eth.getBalance(eth.coinbase) ); "0.0042817"
äœ¿çšæžã¿ã¬ã¹ã®æ¯æãã«å¿
èŠãªã ãæ£ç¢ºã«ã
å¥çŽã®å€æŽã¯ä¿åãããŸããïŒ
> uselessWorker.successfullyExecutedIterations(); 10
ã¯ããä¿åããŸããã
ç¶ã
ä»ã®ãšãããã¹ãŠã§ãã Gethã®ããã¥ã¡ã³ãã¯
ããã§èŠãããšãã§ã
ãŸã ã
å
ç¢æ§ããã¥ã¡ã³ãã
Gethã¯web3.jsã©ã€ãã©ãªã䜿çšããŸãããã®ããã¥ã¡ã³ãã¯
ãã¡ãã§ã芧
ããã ããŸã ã
ããã¯ãã€ãŒãµãªã¢ã ãããã¯ãã§ãŒã³ã«æ¥ç¶ããããã®æãäžè¬çãªã©ã€ãã©ãªã®1ã€ã§ãã Ruby on Railsã§ã®éçºãå°éãšããŠãããããé©åãªrubyã€ã³ã¿ãŒãã§ãŒã¹ãèŠã€ãããšããç®æšãèšå®ããŸããã æ¬¡ã®èšäºã§ã¯ããããã©ããªããã説æããŸãã
â
ããŒã1ãžã®ãªã³ã¯