むヌサリアムブロックチェヌンリンケビヌテストネットワヌクでの固䜓契玄実隓





この蚘事は、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぀の蚘事でカバヌするこずは䞍可胜です。 非垞に厚い本が必芁です むヌサリアム経枈、ガス䜜業単䜍、フィルタヌなど、非垞に重芁なトピックに぀いおは觊れたせんでした。 しかし、私は新しい蚘事、そしおおそらく本を䜜成する蚈画がありたす。 たず䜕を䌝える必芁があるかを知りたいので、あなたのフィヌドバックを本圓に楜しみにしおいたす



曎新本は曞かれおいたす、䞋のリンク



むヌサリアムに関する私の本や蚘事も読んでください。






All Articles