イーサリアムの開発に没頭。 パート4:トリュフ、ガナッシュ、インフラでデプロイおよびデバッグする

前の記事で、 Ethereumで開発されたアプリケーションをレビューしました。 しかし、開発プロセスがどのように進んでいるのかという問題を回避しました。 明らかに、これはただちに機能するコードを書くだけではありません。 ほとんどの時間は、「ほぼ準備完了」のコードを稼働状態にするために費やさなければなりません。 展開、テスト、デバッグ-これらはすべてここである程度触れられています。たとえば、次の優れた記事では、 1、2、3 (リストは完全ではありません)。 この記事では、短いレビューを行い、おそらく何かを繰り返しますが、私たちにとって重要または言われていない点に焦点を当てようとします。 さらに、最近いくつかの変更が加えられ、非常に多くの命令が非推奨になりました。 状況を少し修正しようとします。











トリュフのプロジェクト



スマートコントラクトのテストと展開にTruffleを使用します。低レベルの作業の一部を抽象化の背後に隠します。これは非常に便利です。 説明されているバージョンは4.0.6です。 これが唯一のフレームワークではありません; EmbarkDappleもありますが、それらについては何も言えません。私は仕事をする必要はありませんでした。 プロジェクトを初期化するには、コマンドを実行する必要があります(現在のフォルダーで実行されるため、最初にプロジェクトフォルダーを作成してそこに移動します)。



$ truffle init
      
      





基本構造のみがcontracts



migrations



およびtests



フォルダーから作成されます。 contracts



およびmigrations



(トリュフ-移行に関して)展開ロジックを担当するMigrations



スマートコントラクトを確認できます。 そして、ロジックは次のようなものです。 migrations



フォルダーにスクリプトを追加し、テンプレート1_description.js



2_another_one.js



... n_etc.js



に従ってスクリプトに名前を付けます。 名前の中で最も重要なのはインデックスです。これは先頭にあり、その後、読みやすくするためだけに必要な説明を追加できます。 インデックスは、番号付け順に移行を実行するために使用されます。 Migrations



スマートコントラクトは、どの移行スクリプトが既に実行されているかを保存するために使用されます。 そのため、開発プロセス中に新しいコントラクトと新しい展開ロジックを追加した場合、以前の成功した進捗をやり直す必要はありません。 個人的には、これを使用せず、代わりに一定数の移行を行い、 truffle migration --reset



を使用して毎回編集して再実行します。

契約、移行、およびテストファイルを手動で作成できますが、truffleには特別なコマンドがあります。



 $ truffle create contract ExampleContract $ truffle create migration ExampleMigration $ truffle create test ExampleContract
      
      





適切なファイルを作成したことを確認できます。 ただし、コンテンツは非常に基本的なものであるため、同じファイルを手動で作成する場合と比較して、この機能には特に利点はありません。



プロジェクトで作業する



以前のバージョンでは、 truffle init



初期化により、小さなサンプルが一度に作成されました(MetacoinおよびConvertLib)。 最近のバージョンでこれと他の例を見るには、トリュフボックスと呼ばれる機能を使用できます。 ボックスは、Truffleプロジェクトと、ReactJSなどのさまざまなWebツールとの相互作用の本格的な例を取得するために作成されます。 公式およびコミュニティによって作成された両方のボックスのリストを次に示します。 新しいプロジェクトのディレクトリを作成して、そこに移動します。 次に、コマンドを実行します。



 $ truffle unbox metacoin
      
      





古いバージョンではデフォルトでtruffle init



後に作成されたプロジェクト構造を取得しtruffle init



。 これは、ユーザーからユーザーに送信でき、ConvertLibライブラリを使用して固定為替レートで空中残高を監視できる、基本的なMetacoinトークンの例です。 スマートコントラクトとライブラリを作成および使用する方法をここで示したものに加えて、JavaScriptおよびSolidityのテストの例もあります(テストの記述に関する詳細はこちらをご覧ください。Truffleの古いバージョンはそこで検討されています)。 このプロジェクトをテストモードでビルドおよびテストする方法を簡単に見てみましょう。 まず、開発コンソールを実行します。



 $ truffle develop
      
      





同様のテキストを参照してください:



 Truffle Develop started at http://localhost:9545/ Accounts: (0) 0x627306090abab3a6e1400e9345bc60c78a8bef57 (1) 0xf17f52151ebef6c7334fad080c5704d77216b732 (2) 0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef (3) 0x821aea9a577a9b44299b9c15c88cf3087f3b5544 (4) 0x0d1d4e623d10f9fba5db95830f7d3839406c6af2 (5) 0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e (6) 0x2191ef87e392377ec08e7c08eb105ef5448eced5 (7) 0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5 (8) 0x6330a553fc93768f612722bb8c2ec78ac90b3bbc (9) 0x5aeda56215b167893e80b4fe645ba6d5bab767de Mnemonic: candy maple cake sugar pudding cream honey rich smooth crumble sweet treat truffle(develop)>
      
      





このチームは何をしますか? テスト環境を上げ、コンソールからアクセスできるようにします。 テスト環境は、TestRPCと呼ばれる古いマニュアルで見ることができるものです。 実際、これはそれです。Truffleチームだけがそれを制御し、 Ganacheと名前を変更しました。 ただし、これについては後で説明しますが、今のところはコンソールに移りましょう。 コンパイル、移行、テスト用のコマンドのフルサイクルを実行してみましょう。



 truffle(develop)> compile
      
      





結果
 Compiling ./contracts/ConvertLib.sol... Compiling ./contracts/MetaCoin.sol... Compiling ./contracts/Migrations.sol... Writing artifacts to ./build/contracts
      
      





 truffle(develop)> migrate
      
      





結果
 Using network 'develop'. Running migration: 1_initial_migration.js Deploying Migrations... ... 0x29619f8ba9b9e001bef885c8ca2fbee45beab738adc41c7f9e2e8273fbc67e9f Migrations: 0x8cdaf0cd259887258bc13a92c0a6da92698644c0 Saving successful migration to network... ... 0xd7bc86d31bee32fa3988f1c1eabce403a1b5d570340a3a9cdba53a472ee8c956 Saving artifacts... Running migration: 2_deploy_contracts.js Deploying ConvertLib... ... 0x02318651545ac96670af626ef7795cb928d7504afc3f856258058ce579d47fe6 ConvertLib: 0x345ca3e014aaf5dca488057592ee47305d9b3e10 Linking ConvertLib to MetaCoin Deploying MetaCoin... ... 0x486c572bbb2df30bb166f5507423d394807b5b92041860968a7d5eb162e42e48 MetaCoin: 0xf25186b5081ff5ce73482ad761db0eb0d25abfbf Saving successful migration to network... ... 0x059cf1bbc372b9348ce487de910358801bbbd1c89182853439bec0afaee6c7db Saving artifacts...
      
      





 truffle(develop)> test
      
      





結果
 Using network 'develop'. Compiling ./contracts/ConvertLib.sol... Compiling ./contracts/MetaCoin.sol... Compiling ./test/TestMetacoin.sol... Compiling truffle/Assert.sol... Compiling truffle/DeployedAddresses.sol... TestMetacoin ✓ testInitialBalanceUsingDeployedContract (62ms) ✓ testInitialBalanceWithNewMetaCoin (47ms) Contract: MetaCoin ✓ should put 10000 MetaCoin in the first account ✓ should call a function that depends on a linked library (54ms) ✓ should send coin correctly (117ms) 5 passing (796ms)
      
      







たとえば、次のように、無効なコントラクトのメソッドを手動で呼び出すことができます。



 truffle(develop)> var metaCoin truffle(develop)> MetaCoin.deployed().then( function(instance) { metaCoin = instance } ); truffle(develop)> metaCoin.getBalance(web3.eth.coinbase) BigNumber { s: 1, e: 4, c: [ 10000 ] } truffle(develop)> _.toNumber() 10000 truffle(develop)> metaCoin.sendCoin( web3.eth.accounts[2], 3000 ) { tx: '0x9f59085a9f22c0bd691b890370bcffd7eedce1327a3bb525a2de3edf9db0d279', receipt: { transactionHash: '0x9f59085a9f22c0bd691b890370bcffd7eedce1327a3bb525a2de3edf9db0d279', transactionIndex: 0, blockHash: '0x24e8913b6f707bb5e5acbaa054fef9dabd548a561dc988763209f0aeed9a57b5', blockNumber: 12, gasUsed: 51024, cumulativeGasUsed: 51024, contractAddress: null, logs: [ [Object] ] }, logs: [ { logIndex: 0, transactionIndex: 0, transactionHash: '0x9f59085a9f22c0bd691b890370bcffd7eedce1327a3bb525a2de3edf9db0d279', blockHash: '0x24e8913b6f707bb5e5acbaa054fef9dabd548a561dc988763209f0aeed9a57b5', blockNumber: 12, address: '0xf25186b5081ff5ce73482ad761db0eb0d25abfbf', type: 'mined', event: 'Transfer', args: [Object] } ] } truffle(develop)> metaCoin.getBalance(web3.eth.coinbase) BigNumber { s: 1, e: 3, c: [ 7000 ] } truffle(develop)> _.toNumber() 7000
      
      





ご覧のとおり、すべてが即座に行われ、変更を追跡できます。メインアドレスから別のアドレスに3000を送信したため、残高が減少していることがわかります。 次のコマンドでコンソールを終了します。



 truffle(develop)> .exit
      
      





ノードへの接続



トリュフの開発は、独自のテストノードを備えたモードです。 実際のネットワークまたはテストネットに接続するには、 truffle console



コマンドを使用します。これは、 develop



に完全に似ていますが、テスト環境を上げません。 これを実証するために、 geth



を実行する必要はありません。たとえば、 geth



を使用できます。 コマンドを実行します:



 $ ganache-cli
      
      





GUIバージョンもあります。 基本的な違いはありませんが、このバージョンでは、すべての情報、イベント、残高をすぐに見ることができます。 状況によっては非常に便利です。 これらのバージョンのいずれかを使用できます。



ただし、 truffle unbox metacoin



を作成したばかりで、構成ファイルをまだ変更していない場合は、接続できません



 $ truffle console No network available. Use `truffle develop` or add network to truffle.js config.
      
      





したがって、次をtruffle.js



追加します。



 module.exports = { networks: { development: { host: "localhost", port: 8545, network_id: "*" } } };
      
      





truffle-config.js



も確認truffle-config.js



ます。 これは同じですが、Windowsの場合です。 システムの余分なファイルは削除できます。

この設定により、トリュフはローカルホストで利用可能な任意のネットワークに接続できます:8545。 これらは、gethおよびganache-cliのデフォルト値です。 GanacheのGUIバージョンを使用している場合は、設定に移動し、必要に応じてポートを変更して再起動します(「保存して再起動」ボタン)。









ロゴの付いたウィンドウで立ち往生している場合は、おそらく同じポート、geth、ganache-cli / testrpc、または他の何かで既に何かを実行している



これで、接続してコマンドを実行できます。



 $ truffle console
      
      





そして、あなたは例えばしようとすることができます:



 truffle(development)> migrate --reset
      
      





GUIバージョンでは、展開元のアカウントの残高の変化をすぐに確認できます。[ブロック]タブに移動すると、笑顔のブロックと、ブロック内のトランザクションに費やされたガス量が表示されます。 それぞれをクリックすると、さらに詳細な情報を取得できます。 同様に、[トランザクション]タブには過去のすべてのトランザクションが表示されます。

多くのスクリーンショット














コンソールバージョンには同じ情報がありますが、ログウォールの形式になります。

展開する
 net_version eth_accounts eth_accounts net_version net_version eth_sendTransaction Transaction: 0x29619f8ba9b9e001bef885c8ca2fbee45beab738adc41c7f9e2e8273fbc67e9f Contract created: 0x922194d35a507e5905fa4f2c9e7172ee8535272a Gas usage: 269607 Block Number: 1 Block Time: Mon Feb 05 2018 10:28:17 GMT+0300 (MSK) eth_newBlockFilter eth_getFilterChanges eth_getTransactionReceipt eth_getCode eth_uninstallFilter eth_sendTransaction Transaction: 0xfafc4352cc1dde57e46954d7ebd3a59232599081a253dd8705847a380ae5b06b Gas usage: 41981 Block Number: 2 Block Time: Mon Feb 05 2018 10:28:17 GMT+0300 (MSK) eth_getTransactionReceipt eth_accounts net_version net_version eth_sendTransaction
      
      







あなたがより便利だと思うものを使ってください。

ちなみに、同じトピックに関する他の指示を読んだ場合、おそらくコンパイルとデプロイのためにコンソールを呼び出す必要はないことを既に知っているでしょう。たとえば、単に呼び出すことができます



 truffle migrate --reset
      
      





そして、これは上記で行ったことの完全な類似物になります。 同じ原則が他のすべてのトリュフチームにも適用されます。 コマンドの全リストはこちら



パッケージ



コア機能を実行できる言語はありません。 自転車の発明は非生産的で危険であり、他の人のお金を危険にさらすスマートな契約では、これは特に重要です。 したがって、すでにテスト済みの追加機能をどこで入手するかという疑問が生じます。 Truffleにはこのためのパッケージシステムがあり、2つのインストールオプション(通常のコピーと貼り付けを除く)で使用できます。npmを使用する方法とethpmを使用する方法です。



これに先立ち、メタコインの例で、最も単純なトークンを見ました。 トークンは非常に頻繁に使用されます。暗号キティでさえ、元の標準ではありますが、本質的にトークンです。 現在、トークンの主な標準はERC20です。 標準に準拠するには、トークンは、ウォレット、交換などで普遍的で安全な使用を提供できる一連の機能を実装する必要があります。 ここで、OpenZeppelinzeppelin-solidityパッケージが非常に便利です。スマートコントラクトでよく使用されるパターンのライブラリセットです。 たとえば、 この記事では、既にこのパッケージの使用について説明しています。 使用ではなく、インストールおよび接続方法を検討してください。 手始めに、プロジェクトgithubの指示で説明されているもの。 トリュフプロジェクトのルートで、次の操作を行います。



 $ npm init -y $ npm install -E zeppelin-solidity
      
      





次にnode_modules



フォルダーでzeppelin-solidity



を取得します。そこから、スマートコントラクトの必要なファイル(所有可能など)を次の行で接続できます。



 import 'zeppelin-solidity/contracts/ownership/Ownable.sol';
      
      





しかし、Ethereumのパッケージ専用に設計されたパッケージをインストールする別の方法があります:EthPM。 パケットはIPFSに保存されます。 パッケージのリストはこちらから入手できます 。 トリュフに統合されており、同じzeppelin-solidityを設定するには、次を実行できます。



 $ truffle install zeppelin
      
      





installed_contractsフォルダーが追加され、 node_modules



フォルダーからと同じ方法でその内容をnode_modules



ます。



 import 'zeppelin/contracts/ownership/Ownable.sol';
      
      





しかし、何らかの方法でインストールされているバージョンを比較すると、異なることがわかります。 そして、少なくとも現時点では、npmバージョンの方が新しい(EthPmで1.6.0と1.3.0を書いている時点)。 したがって、イデオロギー的には、EthPMはより興味深いものですが、現時点ではnpmを使用してパッケージをインストールする方が良いでしょう



デバッグ



通常、スマートコントラクトの実行中にエラーが発生すると、メッセージは非常に有益ではなくなります。 たとえば、意図的な間違いで契約をします。



 $ mkdir FaultyContract && cd FaultyContract $ truffle init $ truffle create contract FaultyContract $ truffle create migration deploy
      
      





contracts / FaultyContract.solファイルで、欠落コードを追加します。



 pragma solidity ^0.4.4; contract FaultyContract { int public result; function divideXbyY( int x, int y ) public { y -= y; result = x/y; } }
      
      





ここでわかるように、0による除算は避けられません。



ファイルのmigration/xxxx_deploy.js



(xxxxは生成されたIDであり、異なる場合があります)に、デプロイメントの欠落コードを追加します。



 var FaultyContract = artifacts.require("./FaultyContract.sol"); module.exports = function( deployer ) { deployer.deploy( FaultyContract ); }
      
      





開発コンソールを開いて、契約をコンパイルして保護しましょう



 $ truffle develop truffle(develop)> migrate
      
      





コントラクトを取得し、問題関数を呼び出します。



 truffle(develop)> var faultyContract; truffle(develop)> FaultyContract.deployed().then( function(instance) { faultyContract = instance } ); truffle(develop)> faultyContract.divideXbyY(16, 4); Error: VM Exception while processing transaction: invalid opcode at Object.InvalidResponse (/usr/lib/node_modules/truffle/build/cli.bundled.js:43303:16) at /usr/lib/node_modules/truffle/build/cli.bundled.js:331156:36 at /usr/lib/node_modules/truffle/build/cli.bundled.js:314196:9 at XMLHttpRequest.request.onreadystatechange (/usr/lib/node_modules/truffle/build/cli.bundled.js:329855:7) at XMLHttpRequestEventTarget.dispatchEvent (/usr/lib/node_modules/truffle/build/cli.bundled.js:70159:18) at XMLHttpRequest._setReadyState (/usr/lib/node_modules/truffle/build/cli.bundled.js:70449:12) at XMLHttpRequest._onHttpResponseEnd (/usr/lib/node_modules/truffle/build/cli.bundled.js:70604:12)
      
      





ご覧のとおり、これはあまり有益ではなく、エラーの場所とinvalid opcode



意味がわかりません。 Truffleバージョン4以降では、 debug



コマンドが利用可能(これまでのベータ版)であり、トランザクションを行ごとに再実行できます。 しかし、このためにはトランザクションのハッシュを取得する必要がありますが、エラーではそこにさえありません。 ハッシュを表示truffle develop



は、 --log



フラグを指定してtruffle develop



別のインスタンスを実行します。



 $ truffle develop --log
      
      





このコマンドを使用すると、メインの開発コンソールで何が起こっているかのログを表示できます。また、そこでトランザクションのハッシュを見つけることもできます。 関数を再度実行します



 truffle(develop)> faultyContract.divideXbyY(16, 4);
      
      





ログのあるウィンドウには、次のようなものがあります。



 develop:testrpc eth_sendTransaction +0ms develop:testrpc +27ms develop:testrpc Transaction: 0x21073e12e7c8fb785347d7bd5d974d4954379dcace7b53d452c03b39ca007b9e +1ms develop:testrpc Gas usage: 6721975 +0ms develop:testrpc Block Number: 6 +0ms develop:testrpc Block Time: Tue Feb 06 2018 10:32:27 GMT+0300 (MSK) +0ms develop:testrpc Runtime Error: invalid opcode +0ms develop:testrpc +0ms
      
      





トランザクションのハッシュを取得して、debugコマンドに渡します。



 truffle(develop)> debug 0x21073e12e7c8fb785347d7bd5d974d4954379dcace7b53d452c03b39ca007b9e
      
      





さらにコマンドを入力する必要があります。 エラーの少なくともいくつかの行を理解するには、 n



(次のステップ)コマンドを使用できます。



 debug(develop:0x21073e12...)> n FaultyContract.sol | 0x345ca3e014aaf5dca488057592ee47305d9b3e10: 8: int public result; 9: 10: function divideXbyY( int x, int y ) public { ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ debug(develop:0x21073e12...)>
      
      





各ステップは数行のコードを表示し、現在実行されている部分を強調します。 非常に低いレベルに移動して、各オペコード(Ethereum仮想マシンコマンド)を実行し、スタックの状態を調べることができます。 もう1つのステップを踏み、スタックの状態を推測してみましょう。



 debug(develop:0x21073e12...)> FaultyContract.sol | 0x345ca3e014aaf5dca488057592ee47305d9b3e10: 9: 10: function divideXbyY( int x, int y ) public { 11: y -= y; ^ debug(develop:0x21073e12...)> p FaultyContract.sol | 0x345ca3e014aaf5dca488057592ee47305d9b3e10: (55) DUP1 00000000000000000000000000000000000000000000000000000000c6329782 000000000000000000000000000000000000000000000000000000000000009b 0000000000000000000000000000000000000000000000000000000000000010 0000000000000000000000000000000000000000000000000000000000000004 (top)
      
      





xとy、16、4がスタックの最後であることがわかりますが、これは確かに非常に便利な方法ではなく、オペコードとそれらがイーサリアム仮想マシンで実行される方法に対処する必要があります。 興味がある場合- 黄色の紙 (H.2。命令セット)を見ることができます。 しかし、私たちのタスクは、エラーのある行を見つけることです。 next step



ような結果が得られるまで、 next step



を実行し続けます。



 10: function divideXbyY( int x, int y ) public { 11: y -= y; 12: result = x/y; ^^^ debug(develop:0x21073e12...)> Transaction halted with a RUNTIME ERROR. This is likely due to an intentional halting expression, like assert(), require() or revert(). It can also be due to out-of-gas exceptions. Please inspect your transaction parameters and contract code to determine the meaning of this error. truffle(develop)>
      
      





ここでは、少なくとも、部門のどこかでエラーが発生したことがわかります。 そして、理解すればスタックと手順を見ることができます。 残念ながら、これはデバッグに関してトリュフが提供するすべてです。 まあ、少なくとも何か。



この点に関して、単一のコントラクトと単純な接続については、 Remix IDEにアドバイスすることができます( この記事では 、たとえば作成者が展開に使用します)。すべてのステップで変数の値を確認できるほぼ完全なデバッグがあります。 インターフェースは直感的です。すでに説明した例をどのようにデバッグできるかを確認してください。









以下のコンソールでエラーが表示されたら、[デバッグ]をクリックします。





そして、前後にスクロールして、人間の形で変数の値を見ることができます。



リモートノードInfura



前回の記事では、ローカルの同期されたイーサリアムクライアントを使用せずにブロックチェーンに接続できるMetamaskプラグインについて検討しました。 これはInfuraサービスのおかげです。 Infuraノードにアクセスし、トリュフを介してそれらに接続することもできます。 これを行うには、まず、 ウェブサイト登録する必要があります。手紙で、アクセス用の個人トークンを含むリンクを受け取ります。 ローカルノードなしでRopstenにMetacoinの例を展開してみましょう。

通常どおりテストプロジェクトを作成します。



 $ mkdir metacoin && cd metacoin $ truffle unbox metacoin
      
      





次に、Truffleがトランザクションに署名できる追加のパッケージHDWalletProviderが必要です。



 $ npm init $ npm install $ npm install truffle-hdwallet-provider
      
      





次のコードを使用して、トリュフ設定にプロバイダーを追加します。



 var HDWalletProvider = require("truffle-hdwallet-provider"); var mnemonic = "correct horse battery staple correct horse battery staple correct horse battery staple" module.exports = { networks: { development: { host: "localhost", port: 8545, network_id: "*" }, ropsten: { provider: function() { return new HDWalletProvider(mnemonic, "https://ropsten.infura.io/<   >") }, network_id: 3, gas: 4000000, gasPrice: 21000000000 } } };
      
      





少なくともデフォルト値が適合しなかったため、gasとgasPriceを設定する必要がありました。 手紙からトークンを挿入することを忘れないでください。また、12の異なる(例のようにではない)単語から独自のニーモニックを考え出すことを忘れないでください。 。 たとえば、この記事でニーモニックを使用する場合は、そこに送信したエーテル(0.3)を使用できます(他の人が使用しない場合)。 この設定にdevelopment



も残されています。--networkフラグの後に対応する名前でtruffleを実行することにより、これら2つのネットワークから選択できます。



  $ truffle console --network ropsten
      
      





migrate



を呼び出す前に、生成されたアカウントの残高を補充する必要があります。 コマンドのアドレスとバランスを確認します。



 truffle(ropsten)> web3.eth.getAccounts( function(e,r) { console.log(r[0]); } ); undefined 0x0bb542704819b5e6a28deb2b73245be57ce0e78b truffle(ropsten)> web3.eth.getBalance('0x0bb542704819b5e6a28deb2b73245be57ce0e78b', function(e, r) { console.log( web3.fromWei( r.toNumber() ) ); }) undefined 0
      
      





Ropstenブロードキャストをアカウントに送信して、展開の料金を支払うことができます。 到着したら(前のコマンドで確認できます)、 migrate



を試すことができます:



 truffle(ropsten)> migrate
      
      





結果は次のようになります。



 Compiling ./contracts/ConvertLib.sol... Compiling ./contracts/MetaCoin.sol... Compiling ./contracts/Migrations.sol... Writing artifacts to ./build/contracts Using network 'ropsten'. Running migration: 1_initial_migration.js Deploying Migrations... ... 0x93cf7dbde8c362534dc912926fc4d7df54c9c1f5e0a7dcfd964a0177b42bc7be Migrations: 0x02519d13f61bdcad838d938611e6722c3d1f8034 Saving successful migration to network... ... 0xec501a78cc11c723ab60186167765aa7c422177153cd72a976e66441db2b5b95 Saving artifacts... Running migration: 2_deploy_contracts.js Deploying ConvertLib... ... 0xf172d9a9ff9f1fdfdfabc816d89f5a5e710ba26e3a2ad9e1661c9dea56564f04 ConvertLib: 0xd04bffb73bf546985938a596565141d3a3bf7f0d Linking ConvertLib to MetaCoin Deploying MetaCoin... ... 0x4d9814f1d9a959e83828bf26319dd91d73be977395d88e9e8239bb4c4ed5b0eb MetaCoin: 0x20fd16643d857ce544a91ae4c80385af99dad196 Saving successful migration to network... ... 0x0dff866460d24d56d94dcf5f833aa4fa8ae289cb708ff5c9012ce21447575ce8 Saving artifacts... truffle(ropsten)>
      
      





トランザクションのハッシュが表示されます。etherscan.ioを介して実際にRopstenに到達したことを確認できます(たとえば、 ropsten.etherscan.io / tx / 0x93cf7dbde8c362534dc912926fc4d7df54c9c1f5e0a7dcfd964a0177b42bc7be



次は?



この記事から何か新しいことを学んだか、少なくとも知識が更新されたことを願っています。

次の記事については、実践が示しているように、OraclizeとIPFSを介して外部と通信することなく、真に有用なプロジェクトを作成することは困難です。 これについて書く予定です。



イーサリアムでの開発のイマージョン:

パート1:はじめに

パート2:Web3.jsとガス

パート3:ユーザーアプリケーション



All Articles