ãã®èšäºã¯ãEthereumãããã¯ãã§ãŒã³ã®Solidityã¹ããŒãã³ã³ãã©ã¯ãéçºç°å¢ããã°ããã»ããã¢ããããã®ã«åœ¹ç«ã€å°ããªå®çšçãªã¬ã€ãã§ãã æåã®å¥çŽãå ¬éããRinkebyãã¹ããããã¯ãã§ãŒã³ã«ä¿åããŠãå¥çŽã®ã¡ãœãããåŒã³åºãæ¹æ³ãåŠç¿ããŸãã ããã¯ãåæ£åDAppïŒåæ£åã¢ããªã±ãŒã·ã§ã³ïŒãäœæããããã®æåã®ã¹ãããã«ãªããŸãã
ãã®èšäºã®ãããã¯ã«é¢ããæ¬ãèšäºãããã¥ã¢ã«ã¯è±å¯ã«ãããŸãããæ°èŠåå ¥è ãå¥çŽã®çºè¡ãšãããã®äœ¿çšãéå§ããããšã¯éåžžã«å°é£ã§ãã æ¬ãããã¥ã¢ã«ãèšäºã«ã€ããŠäœããããããšãããšãäŸãããŸãããããããŒã ãç解ã§ããªããšã©ãŒãè¿ãããšããããããŸãã ãã®èšäºã§ã¯ãã€ãŒãµãªã¢ã ã®ç 究ã§ã®çµéšãåæ ããŠãéçºã®ç¬¬1段éãå€å°ç°¡ç¥åããããšããŸãã
ãã®ãããã¯ã«é£ã³èŸŒããšãã¯ãMicrosoft Windowsç°å¢ã§Mistã¢ããªã±ãŒã·ã§ã³ïŒãã©ãŠã¶ãŒïŒã䜿çšããUbuntuç°å¢ã§ã¯EthereumããŒãã®Gethã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŸããã ãã®èšäºã§ã¯ãGethã§ã®äœæ¥ãšãNode.jsããã³ã³ãã©ã¯ãã¡ãœãããåŒã³åºãæ¹æ³ã«ã€ããŠå°ã説æããŸãã
æè¬ã®æã蟌ããŠãEthereumãããã¯ãã§ãŒã³ãSolidityèšèªã§ã®å¥çŽã®éçºãDAppã¢ããªã±ãŒã·ã§ã³ã«é¢ãããããªãèšäºã«é¢ããã³ã¡ã³ããšææ¡ãåãå ¥ããŸãã
ãããã¯ã«é£ã³èŸŒã
ã¹ããŒãã³ã³ãã©ã¯ãã®äœæãéå§ããåã«ããããã¯ãã§ãŒã³ãã¯ãããžãŒãå匷ããããšããå§ãããŸãã ããšãã°ãåå¿è åãã«ã¯ãHabréã§å ¬éãããŠããèšäºã Webéçºè åãã®ãããã¯ãã§ãŒã³ã®èª¬æ ããèªãããšãã§ããŸãã
Ethereumã¯ãã¹ããŒãã³ã³ãã©ã¯ããéçºããããããåæ£åDAppã¢ããªã±ãŒã·ã§ã³ãäœæããããã®åæ£åãã©ãããã©ãŒã ã§ãã Ethereum Webãµã€ãã¯https://www.ethereum.org/ã«ãããŸã ã ããã«ã¯ãããªãã«ãšã£ãŠåœ¹ç«ã€äž»ãªãªãœãŒã¹ãžã®ãªã³ã¯ããããŸãã
ããšãã°ããã©ãããã©ãŒã ã®ããã¥ã¡ã³ãã¯http://www.ethdocs.org/en/latest/ã§å ¬éãããŠããŸã ã
Solidityèšèªã¬ã€ãã¯ãã¡ãã§ãã ãã·ã¢èªãžã®ç¿»èš³ããããŸãããå ã®ææžããé ããŠããå ŽåããããŸãã
è³æã®ãã¬ãŒã³ããŒã·ã§ã³ã®éçšã§ãç¹å®ã®ãªãœãŒã¹ãžã®ãªã³ã¯ãäœæããŸãã
Ubuntuä»®æ³ãã·ã³ãžã®ã€ãŒãµãªã¢ã ããŒãã®ã€ã³ã¹ããŒã«
å¥çŽãå ¬éããã€ãŒãµãªã¢ã ãšé£æºããå Žåãéåžžã®ã³ã³ãã¥ãŒã¿ãŒãŠãŒã¶ãŒã¯Microsoft Windowsã®ããžã¥ã¢ã«ã€ã³ã¿ãŒãã§ã€ã¹ã§Mistãã©ãŠã¶ãŒã䜿çšããæ¹ãç°¡åã§ãã ãã ããäœãèµ·ããŠããããç解ãããœãããŠã§ã¢éçºè ïŒãœãããŠã§ã¢ïŒã¯ãã³ãã³ãã©ã€ã³ãåŠçããæ¹ã䟿å©ã§ãã
Goã§äœæãããEthereumãããã³ã«ã®3ã€ã®ãªãªãžãã«å®è£ ã®1ã€ã§ããGo Ethereumãã€ã³ã¹ããŒã«ããŸãïŒC ++ããã³Pythonã®å®è£ ã¯ãŸã ãããŸãïŒã
Go Ethereumã¯ãUbuntuãArch Linuxãããã³FreeBSDãµãŒããŒãã©ãããã©ãŒã ã«ã€ã³ã¹ããŒã«ã§ããŸãã Ubuntuãéžãã ã®ã¯ãDebianã«äŒŒãŠããããã§ããªã³ã©ã€ã³ã¹ãã¢ãµãŒãã¹ã§Debianã䜿çšããŠããŸãã å®éšã®ããã«ãVMWare Workstationãå®è¡ããŠããä»®æ³ãã·ã³ã«Ubuntu 17.10 OSãã€ã³ã¹ããŒã«ããŸããã
Ubuntuãã€ã³ã¹ããŒã«ããçŽåŸã«ãSSHçµç±ã§æ¥ç¶ããæ©èœãè¿œå ããå¿ èŠããããŸãã ããã«ãVimãšãã£ã¿ãŒãã€ã³ã¹ããŒã«ããŸããã
sudo apt-get install ssh sudo apt-get install vim
次ã«ãGo Ethereumã®å®å®çãªãªãŒã¹ãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã
sudo add-apt-repository -y ppa:ethereum/ethereum sudo apt-get update sudo apt-get install ethereum
ãã®ããã»ã¹å šäœã«ã€ããŠã¯ã ããã§èª¬æããŸã ã
ããã§ãRinkebyãã¹ããããã¯ãŒã¯ã®ãã«ããŒããã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã ããŸããŸãªã¿ã€ãã®ããŒãã®èª¬æã¯ã https ïŒ //www.rinkeby.io/#gethã«ãããŸã ã å®å šãªããŒãã«ã¯ããã®åœä»€ã®ãããã¯ãå¿ èŠã§ãã
ãŸãã次ã®å Žæããrinkeby.jsonãã¡ã€ã«ãããŒã ãã£ã¬ã¯ããªã«ã³ããŒããŸãïŒ https ://www.rinkeby.io/rinkeby.json
次ã«ãæåã®ã³ã³ãœãŒã«ãŠã£ã³ããŠãéããããŒã ãã£ã¬ã¯ããªã«rinkebyãã©ã«ããŒãäœæããŠãã³ãã³ããå®è¡ããŸãã
geth --datadir=/home/frolov/rinkeby init rinkeby.json
ãã®ã³ãã³ãã¯ãåæåäžã«äžåºŠã ãå®è¡ãããŸãã ããã§ã¯ãããŒãããŒã¿ã¯/ home / frolov / rinkebyãã£ã¬ã¯ããªã«æ ŒçŽãããrinkeby.jsonãã¡ã€ã«ã¯/ home / frolov /ãã£ã¬ã¯ããªã«æ ŒçŽããããšæ³å®ããŠããŸãã ãã¡ãããå¥ã®ãã£ã¬ã¯ããªã®å Žæãéžæã§ããŸãã
åæåãå®äºããããåããŠã£ã³ããŠã§æ¬¡ã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠgethãå®è¡ããŸãïŒshop2youã®ä»£ããã«ãethstatsãã©ã¡ãŒã¿ãŒã«äžæã®ååãæå®ããŸãïŒ
geth --networkid=4 --datadir=/home/frolov/rinkeby --rpc --rpcaddr "0.0.0.0" --rpcapi "admin,debug,miner,shh,txpool,personal,eth,net,web3" --ethstats='shop2you:Respect my authoritah!@stats.rinkeby.io' --bootnodes=enode://a24ac7c5484ef4ed0c5eb2d36620ba4e4aa13b8c84684e1b4aab0cebea2ae45cb4d375b77eab56516d34bfbd3c1a833fc51296ff084b770b94fb9028c4d25ccf@52.169.42.101:30303
gethã³ãã³ãã®ãã©ã¡ãŒã¿ãŒã®èª¬æã¯ã httpsïŒ//github.com/ethereum/go-ethereum/wiki/Command-Line-Optionsã«ãããŸã ã 次ã®ã³ãã³ãã䜿çšããŠãgethãã©ã¡ãŒã¿ãŒã«é¢ãããã«ãã衚瀺ããããšãã§ããŸãã
geth --help
--networkid = 4ãã©ã¡ãŒã¿ãŒã¯ãRââinkebyãã¹ããããã¯ãŒã¯ã䜿çšããŠããããšã瀺ããŸãã --datadirãã©ã¡ãŒã¿ãŒã䜿çšããŠããã¹ãããŒã¿ããŒã¹ãšããŒãä¿åãããã£ã¬ã¯ããªã®å Žæãæå®ããŸãã
--rpcãªãã·ã§ã³ã¯ãHTTP-RPCãµãŒããŒãæå¹ã«ããŸãã ãã®ãµãŒããŒãä»ããŠã2çªç®ã®ã³ã³ãœãŒã«ãŠã£ã³ããŠããããŒãã«æ¥ç¶ããŸãã --rpcaddrãã©ã¡ãŒã¿ãŒã䜿çšããŠããµãŒããŒããã¹ãã®ãã¹ãŠã®ãããã¯ãŒã¯ã€ã³ã¿ãŒãã§ã€ã¹ã§å®è¡ãããããšã瀺ããŸãïŒããã©ã«ãã§ã¯ãlocalhostã®ã¿ïŒã --rpcapiãã©ã¡ãŒã¿ãŒã䜿çšããŠãHTTP-RPCã€ã³ã¿ãŒãã§ãŒã¹ãä»ããŠäœ¿çšã§ããAPIãæå®ããŸãã
--ethstatsãã©ã¡ãŒã¿ãŒã¯ãethstatsãµãŒãã¹ã¬ããŒãã®URLãæå®ããnodenameïŒsecret @ hostïŒportã®åœ¢åŒã§æå®ãããŸãã æåŸã«ã-bootnodesãã©ã¡ãŒã¿ãŒã¯P2PããŠã³ããŒãã®URLãèšå®ããŸãïŒP2Pãã£ã¹ã«ããªããŒãã¹ãã©ããã®ã³ã³ãåºåãã®enode URLïŒã
ããã§ãæåã®ã³ã³ãœãŒã«ãŠã£ã³ããŠã§Rinkebyãããã¯ãŒã¯ã®Go EthereumããŒããèµ·åããŸããã 2çªç®ã®ã³ã³ãœãŒã«ãŠã£ã³ããŠã§ã次ã®ã³ãã³ãã䜿çšããŠãã®ããŒãã«æ¥ç¶ããŸãã
geth --networkid=4 --datadir=/home/frolov/rinkeby attach ipc://home/frolov/rinkeby/geth.ipc
æ¥ç¶ãããšãgethãŠãŒãã£ãªãã£ã®ããã³ããã衚瀺ãããŸãã 次ã®ã³ãã³ããå ¥åããŸãã
> web3.version { api: "0.20.1", ethereum: "0x3f", network: "4", node: "Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9.1", whisper: undefined, getEthereum: function(callback), getNetwork: function(callback), getNode: function(callback), getWhisper: function(callback) }
ãã®ã³ãã³ãã¯ãå¥çŽã§äœ¿çšããWeb3ãœãããŠã§ã¢ã€ã³ã¿ãŒãã§ã€ã¹ã®ããŒãžã§ã³ãgethããŒãžã§ã³ãããã³Rinkebyã®ãããã¯ãŒã¯çªå·ïŒ4ïŒã衚瀺ããŸãã
ããŒãåæ
ç¶è¡ããåã«ãããŒãã®åæãå®äºãããŸã§åŸ ã€å¿ èŠããããŸãã 2çªç®ã®ãŠã£ã³ããŠã§ãgethããã³ããã§eth.syncingã³ãã³ããå®è¡ããŸãã
> eth.syncing { currentBlock: 404158, highestBlock: 1402511, knownStates: 1974866, pulledStates: 1962021, startingBlock: 0 }
ãããã£ãŠãåæããã»ã¹ã¯éå§ããŸããïŒèªåçã«éå§ããå¿ èŠããããŸãïŒããã³ãã³ããæã ç¹°ãè¿ãããšã«ãããããã»ã¹ã®é²è¡ç¶æ³ã远跡ã§ããŸãã åæãå®äºãããšãã³ãã³ãã¯falseãè¿ããŸãã
> eth.syncing false
åæããã»ã¹ã¯ãGo EthereumããŒããèµ·åããæåã®ã³ã³ãœãŒã«ãŠã£ã³ããŠã§ç¢ºèªã§ããŸãã
... INFO [12-13|10:00:37] Imported new chain segment blocks=1 txs=1 mgas=0.123 elapsed=21.839ms mgasps=5.610 number=1408525 hash=bd6e8bâŠ745ca3 INFO [12-13|10:00:51] Imported new chain segment blocks=1 txs=22 mgas=1.379 elapsed=188.490ms mgasps=7.317 number=1408526 hash=924b25âŠb292de INFO [12-13|10:00:51] Imported new chain segment blocks=1 txs=22 mgas=1.379 elapsed=162.386ms mgasps=8.493 number=1408526 hash=c05478âŠ70b24c INFO [12-13|10:00:51] Imported new chain segment blocks=1 txs=22 mgas=1.379 elapsed=165.818ms mgasps=8.317 number=1408526 hash=8961b4âŠ48d0a4 INFO [12-13|10:01:07] Imported new chain segment blocks=1 txs=2 mgas=0.063 elapsed=4.120ms mgasps=15.347 number=1408527 hash=a5e658âŠ22d300 ...
gethããŒããéå§ãããçŽåŸã«åæãéå§ãããããã§ã¯ãªããRinkebyãããã¯ãŒã¯ã§å®äºãããŸã§ã«æ°ååçšåºŠãããããšããããŸãã
ã¢ã«ãŠã³ããè¿œå ãã
æ°ãããµã€ããã€ã³ã¹ããŒã«ããçŽåŸã«ããã®ãµã€ãã«ã¢ã«ãŠã³ããè¿œå ããå¿ èŠããããŸãïŒæ¢ã«ä»ã®ãµã€ãã«ã¢ã«ãŠã³ããããå Žåã¯ãæ°ãããµã€ãã«è»¢éã§ããŸãïŒã
ã¢ã«ãŠã³ããè¿œå ããã«ã¯ãgethããã³ããã§personal.newAccountïŒïŒã³ãã³ããå ¥åããŸãã
> personal.newAccount() Passphrase: Repeat passphrase: "0x7d9006e7f24bd6d90dd8cc63764ab0b92b77d9b3"
ããã§ããã¹ã¯ãŒããå ¥åããå¿ èŠããããŸãã ãã¹ããããŠããªãå®éã®ã€ãŒãµãªã¢ã ãããã¯ãŒã¯ã䜿çšããå Žåã¯ãç¹ã«ãã¹ã¯ãŒãã®ä¿åã«æ³šæããå¿ èŠããããŸãã æå·åããããã©ã€ãã§ãã£ãŠããã³ã³ãã¥ãŒã¿ãŒã«ãã¹ã¯ãŒããæžã蟌ãŸãªãããšããå§ãããŸãã äºå®ããŠã€ã«ã¹ãŸãã¯ããã€ã®æšéŠ¬ã¯æå·åããããã£ã¹ã¯ãããã¹ã¯ãŒããçãããšãã§ããããã§ãã ãã£ã¹ã¯ãæäœãããšããã®å 容ãå©çšå¯èœã«ãªããŸãã ããŒããŒããããã¹ã¯ãŒããå ¥åãããšãã«ãã¹ã¯ãŒããååã§ããããŒãã¬ãŒããããŸãã
ãã¹ã¯ãŒãã¯ç§å¯éµãä¿è·ããŸãã æ»æè ãã³ã³ãã¥ãŒã¿ãããã¹ã¯ãŒããšç§å¯éµãçãããšãã§ããå Žåãæ»æè ã¯ãã®ã¢ã«ãŠã³ããæã€ãã¹ãŠã®æ段ãææããŸãã ãšããã§ããã¹ã¯ãŒããå埩ããæ¹æ³ã¯ãªãããããã¹ã¯ãŒãã倱ãããšã¯ã§ããŸããã
ãã¹ã¯ãŒããå ¥åãããšãã¢ã«ãŠã³ãã¢ãã¬ã¹ãã³ã³ãœãŒã«ã«è¡šç€ºãããŸãããã®å Žåãã0x7d9006e7f24bd6d90dd8cc63764ab0b92b77d9b3ãã§ãïŒå¥ã®ã¢ãã¬ã¹ã«ãªããŸãïŒã äœæãããã¢ã«ãŠã³ãã®ã¢ãã¬ã¹ãèšé²ããå¿ èŠããªãããšã«æ³šæããŠãã ããã ãããã¯eth.accountsã³ãã³ãã䜿çšããŠè¡šç€ºã§ããŸãã
> eth.accounts ["0x7d9006e7f24bd6d90dd8cc63764ab0b92b77d9b3"]
ãã®æ¹æ³ã§è€æ°ã®ã¢ã«ãŠã³ããè¿œå ã§ããŸãã ãã®å Žåãã³ãã³ãã¯ãã¹ãŠã®ã¢ã«ãŠã³ãã®èå¥åã®é åãåºåããŸãã
> eth.accounts ["0xa15862b34abfc4b423fe52f153c95d83f606cc97", "0x7d9006e7f24bd6d90dd8cc63764ab0b92b77d9b3", "0x957f5272eadf4e284aade9b2cb2a41f475936d07"]
ã¢ã«ãŠã³ãããšã«ç§å¯éµãäœæãããŸãã ãã®å Žåããã¹ãŠã®ããŒã¯ãã£ã¬ã¯ããª/ home / frolov / rinkeby / keystoreã«ãããŸãã ç¹ã«ãã¹ããããã¯ãŒã¯ã§ã¯ãªãã¡ã€ã³ã®ã¢ã«ãŠã³ãã«é¢é£ããå Žåã¯ããããã®ããŒãå®å šãªå Žæã«ä¿ç®¡ããããšããå§ãããŸãã
ãã£ãŒãžã¢ããã¢ã«ãŠã³ã
ã³ã³ãã©ã¯ããå ¬éãããã®ã¡ãœãããåŒã³åºãããšãã§ããããã«ããã«ã¯ããŠã©ã¬ããã«ãšãŒãã«ïŒãšãŒãã«ïŒãè£å ããå¿ èŠããããŸãã çŸåšã®æ®é«ã¯ã次ã®ã³ãã³ãã§ç¢ºèªã§ããŸãã
> web3.fromWei( eth.getBalance(eth.coinbase) ) 0
ãã®ã³ãã³ãã«ã¯ãã¢ã«ãŠã³ãèå¥åãå²ãåœãŠãããšãã§ããŸãã
> web3.fromWei( eth.getBalance("0x7d9006e7f24bd6d90dd8cc63764ab0b92b77d9b3") ) 10.428648202959703389
Rinkebyãã¹ããããã¯ãŒã¯ã§ãŠã©ã¬ãããè£å ããã«ã¯ãå®éã®çŽå¹£ãæå·é貚ã¯å¿ èŠãããŸããã ãµã€ãhttps://faucet.rinkeby.io/ã䜿çšããŸã ã ãŸããGoogle +ãFacebookããŸãã¯Twitterã¢ã«ãŠã³ããå¿ èŠã§ãã
0x7d9006e7f24bd6d90dd8cc63764ab0b92b77d9b3ãªã©ãã¢ã«ãŠã³ãã®ã¢ãã¬ã¹ãå«ããªã¹ãããããœãŒã·ã£ã«ãããã¯ãŒã¯ã®1ã€ã«å ¬éããŸãïŒå¥ã®ã¢ãã¬ã¹ã«ãªããŸãïŒã
次ã«ã ã€ãŒãµ ãªã¢ã ã¢ãã¬ã¹ãå«ããœãŒã·ã£ã«ãããã¯ãŒã¯URLãã£ãŒã«ãã®å ¬éã¢ãã¬ã¹ãã³ããŒãããªã¹ããç§ã«ã€ãŒãµãããå€ã®1ã€ãéžæããŸãã
ããã§ã¯ã8æéããšã«3ã€ã®ãšãŒãã«ãæ¯æ¥7.5ã®ãšãŒãã«ããŸãã¯3æ¥ããšã«18.75ã®ãšãŒãã«ãåãåãããšãã§ããŸãã 3ãšãŒãã«ã§ååã§ãã®ã§ãæåã®ãªãã·ã§ã³ãéžæã§ããŸãã
ãã¹ãŠãæ£ãããã°ããã°ããããŠããšãŒãã«åŽåè ããããªãã®ã¢ã«ãŠã³ãã«è¡ããŸãã ãã¡ããããããã®è³éã¯Rinkebyãã¹ããããã¯ãŒã¯ã§ã®ã¿äœ¿çšã§ããŸãã
åºçå¥çŽ
ãã¹ãŠãã€ã³ã¹ããŒã«ããŠç¢ºèªããã¢ã«ãŠã³ããè£å ããã®ã§ãå¥çŽã®å ¬éãéå§ã§ããŸãã éåžžã«ã·ã³ãã«ãªHelloSolã³ã³ãã©ã¯ãã䜿çšããŸãã Solidityã®ãœãŒã¹ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
pragma solidity ^0.4.10; contract HelloSol { string savedString; uint savedValue; function setString( string newString ) public { savedString = newString; } function getString() public constant returns( string ) { return savedString; } function setValue( uint newValue ) public { savedValue = newValue; } function getValue() public constant returns( uint ) { return savedValue; } }
ãã®ã³ã³ãã©ã¯ãã«ãããããã¹ãæååãšæ°å€ãä¿åã§ããŸãã setStringã¡ãœãããšgetStringã¡ãœããã䜿çšãããšãããããæååãèªã¿æžãã§ããŸãã åæ§ã®setValueããã³getValueã¡ãœãããæ°å€ã«å¯ŸããŠæäŸãããŠããŸãã
3ã€ã®ãã¹ãã¢ã«ãŠã³ããäœæããŸããã
> eth.accounts ["0xa15862b34abfc4b423fe52f153c95d83f606cc97", "0x7d9006e7f24bd6d90dd8cc63764ab0b92b77d9b3", "0x957f5272eadf4e284aade9b2cb2a41f475936d07"]
å¥çŽãå ¬éããã«ã¯ãã¢ãã¬ã¹0x957f5272eadf4e284aade9b2cb2a41f475936d07ã®æåŸã®ã¢ãã¬ã¹ã䜿çšããŸãã ãã®ã¢ãã¬ã¹ã¯æ¬¡ã®ããã«åç §ã§ããŸãã
> web3.eth.accounts[2] "0x957f5272eadf4e284aade9b2cb2a41f475936d07"
ã¢ã«ãŠã³ãã¢ã«ãŠã³ã[2]ã«è³éãããããšã確èªããŸãã
> web3.fromWei( eth.getBalance(web3.eth.accounts[2])); 1.49157544347657552
å¥çŽãå ¬éããåã«ïŒããã³ããŒã¿ãå€æŽããå¥çŽã¡ãœãããåŒã³åºãåã«ïŒãã¢ã«ãŠã³ãã®ããã¯ã解é€ããå¿ èŠããããŸãã ããã¯ãpersonal.unlockAccountã¡ãœããã䜿çšããŠå®è¡ã§ããŸãã
> personal.unlockAccount(eth.accounts[2]) Unlock account 0x957f5272eadf4e284aade9b2cb2a41f475936d07 Passphrase: true
ã¢ã«ãŠã³ãã®äœææã«æå®ãããã¹ã¯ãŒãã®å ¥åãæ±ããããŸãã
å¥çŽç·šé
次ã«ãå¥çŽã®ããããã¢ããªã±ãŒã·ã§ã³ãã€ããªã€ã³ã¿ãŒãã§ã€ã¹ïŒABIïŒãäœæããSolidityã§èšè¿°ãããå¥çŽã®ãœãŒã¹ããã¹ããã³ã³ãã€ã«ããå¿ èŠããããŸãã
ABIã€ã³ã¿ãŒãã§ãŒã¹ã¯ãå¥çŽãšã€ãŒãµãªã¢ã ã·ã¹ãã ãšã®çžäºäœçšã®ä»æ§ããŸãã¯ããç°¡åã«èšãã°ãå¥çŽã¡ãœããã®ãã©ã¡ãŒã¿ãŒãšæ»ãå€ã®ä»æ§ã§ãã 詳现ã«ã€ããŠã¯ãã¡ããã芧ãã ãã ã
Solidityã§æžãããå¥çŽã®ãœãŒã¹ããã¹ããã³ã³ãã€ã«ããçµæãEthereumãããã¯ãŒã¯ã®ãã¹ãŠã®ããŒãã§ä»®æ³ãã·ã³ãå®è¡ããããã°ã©ã ã®ãã€ããªã³ãŒããååŸããå¿ èŠããããŸãã ç§ãã¡ã®å Žåãããã¯Rinkebyãã¹ããããã¯ãŒã¯ã®ã¿ã«ãªããŸãã
ããã°ã©ã ã®ABIã€ã³ã¿ãŒãã§ã€ã¹ãšãã€ããªã³ãŒãã¯ã httpsïŒ//remix.ethereum.orgããå ¥æã§ããIDE Remixãã©ãŠã¶ããŒã«ã䜿çšããŠååŸããã®ãæãç°¡åã§ãã Remixã®äœ¿çšã¬ã€ãã¯ãã¡ãã«ãããŸã ã
ãã©ãŠã¶ã§Remix IDEãéãã次ã®å³ã«ç€ºãããã«ãHelloSolã³ã³ãã©ã¯ãã®ã³ãŒãããœãŒã¹ãŠã£ã³ããŠã«ã³ããŒããŸãã
ããã©ã«ãã§ã¯ãã³ãŒãã¯æ¬¡ã®ããã«ããã«ã³ã³ãã€ã«ãããŸã èªåã³ã³ãã€ã«ããã§ãã¯ãããŸãã ABIãšãã€ããªãååŸããã«ã¯ã[ 詳现 ]ãã¿ã³ãã¯ãªãã¯ããŸãã 衚瀺ããããŠã£ã³ããŠã§web3Deployãããã¯ãèŠã€ããŸãã
[ å€ãã¯ãªããããŒãã«ã³ã㌠]ãã¿ã³ã䜿çšããŠããããã³ãŒããããã¯ãã³ããŒãããã®ããã¹ããããã¹ããšãã£ã¿ãŒãããšãã°Vimãšãã£ã¿ãŒã«è²Œãä»ããŸãã
å¥çŽã®å ¬è¡š
ã³ã³ãã©ã¯ããå ¬éããã«ã¯ãRemixããã³ããŒããã³ãŒããããã¯ãã¯ãªããããŒããã貌ãä»ããEnterããŒãæŒããŸãã
ãããè¡ãåã«ãweb3.eth.accounts [0]ã®è¡ãç·šéããweb3.eth.accounts [2]ã®è¡ã«çœ®ãæããŸããã ããã¯ãè³éãããweb3.eth.accounts [2]ã¢ã«ãŠã³ãããå ¬éããããã«è¡ãããŸããã ã¢ã«ãŠã³ãã1ã€ã ãäœæãããšãŒãã«ã§è£å ããå Žåã¯ãRemixããã³ããŒããããã¹ããããã³ããã§gethããã°ã©ã ã®ã³ã³ãœãŒã«ãŠã£ã³ããŠã«è²Œãä»ããã ãã§ãäœãç·šéããå¿ èŠã¯ãããŸããã
> var browser_ballot_sol_hellosolContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"getValue","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newValue","type":"uint256"}],"name":"setValue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newString","type":"string"}],"name":"setString","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getString","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]); undefined > var browser_ballot_sol_hellosol = browser_ballot_sol_hellosolContract.new( ... { ...... from: web3.eth.accounts[2], ...... data: '', ...... gas: '4700000' ...... }, function (e, contract){ ...... console.log(e, contract); ...... if (typeof contract.address !== 'undefined') { ......... console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash); ......... } ...... })
ããã¹ããã³ããŒãããšããã«ãã³ã³ãœãŒã«ã«æ¬¡ã衚瀺ãããŸãã
null [object Object] undefined > null [object Object]
ããã¯æ£åžžã§ãã ããã§ãå¥çŽãå ¬éããããŸã§åŸ ã€å¿ èŠããããŸãã ãã¹ãŠãæ£ããè¡ããããšãæ°ååŸã«ã³ã³ãœãŒã«ã«ã¡ãã»ãŒãžã衚瀺ãããŸãã
Contract mined! address: 0x11c63c5ebc2c6851111d881cb58c213c609c92d4 transactionHash: 0xe79342277d7e95cedf0409e0887c2cddb3ebc5f0d952b9f7c1c1c5cef845cb97
ããã§ãå¥çŽãRinkebyãããã¯ãŒã¯ã§å ¬éãããã¢ãã¬ã¹0x11c63c5ebc2c6851111d881cb58c213c609c92d4ãå²ãåœãŠãããŸããã ãã®ã¢ãã¬ã¹ã䜿çšãããšãRinkebyãããã¯ãŒã¯ã®ãã¹ãŠã®ãŠãŒã¶ãŒãã¡ãœãããåŒã³åºãããšã§ã³ã³ãã©ã¯ãã«ã¢ã¯ã»ã¹ã§ããŸãã
ã³ã³ãã©ã¯ãã¡ãœããã®åŒã³åºã
次ã«ãæãèå³æ·±ããã®-å¥çŽãšã®çžäºäœçšãæ±ããŸãã ããã§èª¬æããJavaScript Web3 APIã䜿çšããŠãgethã³ã³ãœãŒã«ããã¡ãœãããåŒã³åºããŸã ã ããã¯Web3 0.2xxã®å®å®çã®ããã¥ã¡ã³ãã§ãããhttp://web3js.readthedocs.io/en/1.0/index.htmlã§èª¬æãããŠããããŒãžã§ã³1.0ã¯ãŸã å®è£ ãããŠããŸããã
ãŸããGethã³ã³ãœãŒã«ããã³ããã§ã次ã®è¡ãå ¥åããŸãã
var HelloSolContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"getValue","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newValue","type":"uint256"}],"name":"setValue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newString","type":"string"}],"name":"setString","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getString","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]);
ããã§ã¯ãABIã«åºã¥ããŠãå¥çŽã®ãªããžã§ã¯ããäœæãããŸãã atã¡ãœãããåŒã³åºããã³ã³ãã©ã¯ããå ¬éããã¹ãããã§ååŸããã³ã³ãã©ã¯ãã¢ãã¬ã¹0x11c63c5ebc2c6851111d881cb58c213c609c92d4ããã©ã¡ãŒã¿ãŒãšããŠãã®ã¡ââãœããã«æž¡ããŸãã
var HelloSol = HelloSolContract.at("0x11c63c5ebc2c6851111d881cb58c213c609c92d4");
ããã§ãã³ã³ãã©ã¯ãã¡ãœãããåŒã³åºãããšãã§ããŸãã äºæ³ã©ãããgetValueã¡ãœããã¯æ¬¡ã®ããã«nullå€ãè¿ããŸãã å¥çŽããŒã¹ã«ã¯ãŸã å€ãä¿åããŠããŸããã
> HelloSol.getValue() 0
setValueã¡ãœãããåŒã³åºãåã«ãunlockAccountã¡ãœããã䜿çšããŠã¢ã«ãŠã³ããããã¯è§£é€ããå¿ èŠããããŸãã
> personal.unlockAccount(eth.accounts[2]) Unlock account 0x957f5272eadf4e284aade9b2cb2a41f475936d07 Passphrase: true
èŠããŠããå Žåã以åã«å¥çŽãå ¬éããåã«ã¢ã«ãŠã³ãã®ãããã¯ã解é€ããŸããã
ã¢ã«ãŠã³ãã®ããã¯ã解é€ãããããsetValueã¡ãœãããåŒã³åºããŸãã
> HelloSol.setValue(777, {from: "0x957f5272eadf4e284aade9b2cb2a41f475936d07"}) "0x019131872a3a834a1aaad7a810977eaaa1f9131344b9fb96e57d21a3f08c1363"
æåã®ãã©ã¡ãŒã¿ãŒãšããŠä¿åããå€ãã¡ãœããã«æž¡ãã2çªç®ãšããŠãã®ã¡ââãœãããåŒã³åºãããã¢ã«ãŠã³ãã®ã¢ãã¬ã¹ãæž¡ãããšã«æ³šæããŠãã ããã
次ã«ãgetValueã¡ãœããã䜿çšããŠå€ã®ååŸãè©Šã¿ãŸãã
> HelloSol.getValue() 0 > HelloSol.getValue() 777
æåããã®ã¡ãœããã¯nullå€ãè¿ãããã°ããããŠåããŠæ°ããå€ãååŸããŸãã
getStringã¡ãœãããšsetStringã¡ãœããã䜿çšããŠåæ§ã®å®éšãè¡ãããšãã§ããŸãããããã®ã¡ãœããã¯ãããããå¥çŽããŒã¹ããæœåºãããããŒã¿ããŒã¹å ã®ããã¹ãæååãå€æŽããŸãã
> HelloSol.getString() "" > personal.unlockAccount(eth.accounts[2]) Unlock account 0x957f5272eadf4e284aade9b2cb2a41f475936d07 Passphrase: true > HelloSol.setString(" ", {from: "0x957f5272eadf4e284aade9b2cb2a41f475936d07"}) "0x6a50d48a39d7c8e4d49fcb821a16305059d3064ff25d757bf2877d4aa0a29f31" > HelloSol.getString() "" > HelloSol.getString() "" > HelloSol.getString() " "
solãããã³ã³ãã€ã©ã®ã€ã³ã¹ããŒã«
IDEã®ãªããã¯ã¹ã䜿çšããŠãããã°ããã«ã¯ãå°ããªã³ã³ãã©ã¯ããéåžžã«äŸ¿å©ã§ãã ãã ãã代æ¿æ段ããããŸã-ã³ãã³ãã©ã€ã³ã§å®è¡ã§ããsolcãããã³ã³ãã€ã©ã ãã®ã³ã³ãã€ã©ã®ããã¥ã¡ã³ãã¯ãã¡ãã§ãã
次ã®ã³ãã³ãã䜿çšããŠsolcãã€ã³ã¹ããŒã«ããŸããã
sudo snap install solc
ã€ã³ã¹ããŒã«åŸãã³ã³ãã€ã©ã®ããŒãžã§ã³ã確èªã§ããŸãã
solc --version solc, the solidity compiler commandline interface Version: 0.4.18+commit.9cf6e910.Linux.g++
HelloSolã³ã³ãã©ã¯ããã³ã³ãã€ã«ããŠãABIãšãã€ããªãå«ããã¡ã€ã«ãååŸããŸãããã ã³ã³ãã©ã¯ãã®ãœãŒã¹ã³ãŒããHelloSol.solãã¡ã€ã«ã«æžã蟌ã¿ã次ã®ã³ãã³ããå®è¡ããŸãã
solc --bin --abi HelloSol.sol -o build --overwrite
å®è¡åŸãçŸåšã®ãã£ã¬ã¯ããªã®ãã«ããµããã£ã¬ã¯ããªã«HelloSol.abiãšHelloSol.binã®2ã€ã®ãã¡ã€ã«ãäœæãããŸãã æåã®ãã®ã«ã¯ABIãå«ãŸãã2çªç®ã«ã¯ã³ã³ãã€ã«ãããã³ã³ãã©ã¯ãã®ãã€ããªã³ãŒããå«ãŸããŸãã
ã³ã³ãã©ã¯ãããããã€ããã«ã¯ãRemixã®ã³ãŒãã䜿çšããã³ã³ãã€ã«çµæãHelloSol.abiãã¡ã€ã«ãšHelloSol.binãã¡ã€ã«ã®å 容ã«çœ®ãæããŸãã ãããã£ãŠããããã®ãã¡ã€ã«ã®å 容ã®è¡å ã«æ¹è¡ããªãããšã確èªããå¿ èŠããããŸãã
Node.jsããã³ã³ãã©ã¯ãã¡ãœãããåŒã³åºã
åæ£åDAppã¢ããªã±ãŒã·ã§ã³ã®å ŽåããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãäœæããå¿ èŠããããŸãã ããšãã°ãNode.jsã«åºã¥ããµãŒãã¹ã䜿çšããŠãéåžžã®Webã¢ããªã±ãŒã·ã§ã³ãå¥çŽã·ã¹ãã ã«é¢é£ä»ããããšãã§ããŸãã Node.jsãå®è¡ããŠãããµãŒããŒã§å®è¡ãããŠããJavaScriptã¹ã¯ãªããã䜿çšããŠãã³ã³ãã©ã¯ãã®ã¡ãœããã«ã¢ã¯ã»ã¹ããŠã¿ãŸãããã
ãŸããNode.jsãã€ã³ã¹ããŒã«ããŸãã
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - sudo apt-get install -y nodejs node -v v6.11.4
npmãå¿ èŠã§ãã
sudo apt install npm npm -v 3.5.2
次ã®ã¹ãããã§ã¯ãå®å®ããããŒãžã§ã³ã§gitãšWeb3 APIãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã ããã©ã«ãã§ã¯ãäžå®å®ç1.xãã€ã³ã¹ããŒã«ãããŠããŸãã®ã§ãããããã£ãŠã¿ãŸãããïŒ
sudo apt-get install git npm uninstall web3 npm install web3@0.20.1 --save
ãã¹ãŠãæ£åžžã«æ©èœããããšã確èªããã«ã¯ãnodeã³ãã³ãã䜿çšããŠã³ã³ãœãŒã«ã§Node.jsãèµ·åããŸãã ããŒãã³ã³ãœãŒã«ããã³ããããã次ã®ã³ãã³ããå ¥åããŸãã
> var Web3 = require('web3') undefined > var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); undefined > console.log(web3.eth.accounts); [ '0xa15862b34abfc4b423fe52f153c95d83f606cc97', '0x7d9006e7f24bd6d90dd8cc63764ab0b92b77d9b3', '0x957f5272eadf4e284aade9b2cb2a41f475936d07' ]
ããã§ããŒãnodeã«æ¥ç¶ãããã®ããŒãã§äœæãããã¢ã«ãŠã³ãã®ãªã¹ããèŠãŸããã
次ã®æ¹æ³ã§ã¢ã«ãŠã³ãã®ããã¯ã解é€ããããšãã§ããŸãã
web3.personal.unlockAccount("0x957f5272eadf4e284aade9b2cb2a41f475936d07", "*********", 1000); true
ã¢ã¹ã¿ãªã¹ã¯ã®ä»£ããã«ãã¢ã«ãŠã³ããã¹ã¯ãŒããå ¥åããŸãã
次ã«ãNode.jsããã³ããã§ã以åã«å ¬éãããã³ã³ãã©ã¯ãã«æ¥ç¶ãããã®ã¡ãœãããåŒã³åºãããšãã§ããŸãã
> var HelloSolContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"getValue","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newValue","type":"uint256"}],"name":"setValue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newString","type":"string"}],"name":"setString","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getString","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]); undefined > var HelloSol = HelloSolContract.at("0x11c63c5ebc2c6851111d881cb58c213c609c92d4"); undefined > HelloSol.getValue() { [String: '777'] s: 1, e: 2, c: [ 777 ] } > HelloSol.getString() ' '
Ubuntuã³ã³ãœãŒã«ããã³ãã³ããnode nodejs_web3_test.jsãã䜿çšããŠå®è¡ã§ããnodejs_web3_test.jsã¹ã¯ãªãããæºåããŸããã
var Web3 = require('web3') var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); console.log(web3.eth.accounts); var HelloSolContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"getValue","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newValue","type":"uint256"}],"name":"setValue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newString","type":"string"}],"name":"setString","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getString","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]); var HelloSol = HelloSolContract.at("0x11c63c5ebc2c6851111d881cb58c213c609c92d4"); console.log(HelloSol.getValue().toString(10)); console.log(HelloSol.getString()); web3.personal.unlockAccount("0xa15862b34abfc4b423fe52f153c95d83f606cc97", "*******", 1000); HelloSol.setString(" 999", {from: "0xa15862b34abfc4b423fe52f153c95d83f606cc97"});
ãã®ã¹ã¯ãªããã¯ããŒãã«æ¥ç¶ããã¢ã«ãŠã³ãã®ãªã¹ãã衚瀺ããŸãã 次ã«ãã³ã³ãã©ã¯ã0x11c63c5ebc2c6851111d881cb58c213c609c92d4ã«æ¥ç¶ãããã®ã¡ãœãããåŒã³åºããŸãã
ã³ã³ãœãŒã«ã«ã€ããŠã®è¡šç€ºã¯æ¬¡ã®ãšããã§ãã
node nodejs_web3_test.js [ '0xa15862b34abfc4b423fe52f153c95d83f606cc97', '0x7d9006e7f24bd6d90dd8cc63764ab0b92b77d9b3', '0x957f5272eadf4e284aade9b2cb2a41f475936d07' ] 777 123
ãããã«
ç§ã觊ããã¹ããŒãã³ã³ãã©ã¯ãã®ãããã¯ã¯å€§ããããŠã1ã€ã®èšäºã§ã«ããŒããããšã¯äžå¯èœã§ãã éåžžã«åãæ¬ãå¿ èŠã§ãïŒ ã€ãŒãµãªã¢ã çµæžãã¬ã¹äœæ¥åäœããã£ã«ã¿ãŒãªã©ãéåžžã«éèŠãªãããã¯ã«ã€ããŠã¯è§ŠããŸããã§ããã ããããç§ã¯æ°ããèšäºããããŠããããæ¬ãäœæããèšç»ããããŸãã ãŸãäœãäŒããå¿ èŠãããããç¥ãããã®ã§ãããªãã®ãã£ãŒãããã¯ãæ¬åœã«æ¥œãã¿ã«ããŠããŸãïŒ
æŽæ°ïŒæ¬ã¯æžãããŠããŸããäžã®ãªã³ã¯ïŒ
ã€ãŒãµãªã¢ã ã«é¢ããç§ã®æ¬ãèšäºãèªãã§ãã ããã