blockchain:ethereum構築ハンズオン_ganache編
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
blockchain:ethereum構築ハンズオン_ganache編 [2022/04/26 06:17] – dot | blockchain:ethereum構築ハンズオン_ganache編 [2022/04/28 01:48] (現在) – dot | ||
---|---|---|---|
行 1: | 行 1: | ||
====== ethereumブロックチェーンの構築(Ganache編) ====== | ====== ethereumブロックチェーンの構築(Ganache編) ====== | ||
- | Ganacheを使用してethereumブロックチェーンを構築し、gethでブロックチェーンに接続して採掘、送金、スマートコントラクトを実行するハンズオンです。 | + | Ganacheを使用してethereumブロックチェーンを構築し、gethでブロックチェーンに接続して送金、スマートコントラクトを実行するハンズオンです。 |
===== Ganacheとは? | ===== Ganacheとは? | ||
行 8: | 行 8: | ||
アプリケーションをインストールするだけで、すぐに ethereum ブロックチェーンを利用した開発が始められます。 | アプリケーションをインストールするだけで、すぐに ethereum ブロックチェーンを利用した開発が始められます。 | ||
また、デフォルトで採掘が自動的に行われますので、必要なトランザクションは自動的に処理されます。 | また、デフォルトで採掘が自動的に行われますので、必要なトランザクションは自動的に処理されます。 | ||
+ | 権限についてもデフォルトでゆるく設定されており、アカウントのアンロック(eth.unlockAccount)しなくても送金やガス代の支払いができるようになっています。 | ||
===== インストール ===== | ===== インストール ===== | ||
行 28: | 行 29: | ||
{{: | {{: | ||
- | 後ほど、この Ganache の ethereum ブロックチェーンに geth でアクセスする際、このウィンドウにある「RPC SERVER URL」のを使用します。(下図参照) | + | 後ほど、この Ganache の ethereum ブロックチェーンに geth でアクセスする際、このウィンドウにある「RPC SERVER URL」を使用します。(下図参照) |
{{: | {{: | ||
- | また、一番上のアカウントの PRIVATE KEY を後ほど使用しますので、メモしておいてください。(下図参照) | + | 各アカウントの PRIVATE KEY は以下の手順で確認できます。 |
{{: | {{: | ||
行 39: | 行 40: | ||
===== geth attach でブロックチェーンにコンソール接続する ===== | ===== geth attach でブロックチェーンにコンソール接続する ===== | ||
- | < | + | 「起動」の手順で確認した「RPC SERVER URL」を使用して、以下のようにコンソール接続することができます。 |
+ | |||
+ | < | ||
geth --nodiscover attach http:// | geth --nodiscover attach http:// | ||
</ | </ | ||
+ | ===== 送金 ===== | ||
+ | |||
+ | 送金前 | ||
+ | <code PowerShell> | ||
+ | > eth.getBalance(eth.accounts[0]) | ||
+ | 100000000000000000000 | ||
+ | > eth.getBalance(eth.accounts[1]) | ||
+ | 100000000000000000000 | ||
+ | </ | ||
+ | |||
+ | 送金 | ||
+ | <code PowerShell> | ||
+ | > eth.sendTransaction({from: | ||
+ | </ | ||
+ | |||
+ | 送金後(eth.accounts[0] についてはガス代分も少なくなっている) | ||
+ | <code PowerShell> | ||
+ | > eth.getBalance(eth.accounts[0]) | ||
+ | 94999580000000000000 | ||
+ | > eth.getBalance(eth.accounts[1]) | ||
+ | 105000000000000000000 | ||
+ | </ | ||
+ | |||
+ | Ganache でも残金やトランザクションが確認できる。 | ||
+ | |||
+ | {{: | ||
+ | |||
+ | ===== スマートコントラクト ===== | ||
+ | |||
+ | ==== コンパイラ(solc)のインストール ==== | ||
+ | |||
+ | [[https:// | ||
+ | でコンパイラーが公開されていますので、ダウンロードします。 | ||
+ | |||
+ | (上記で配布されているのでコンパイラの実行ファイルでので、解凍やインストールは必要なく、すぐにコンパイラを利用できます。) | ||
+ | |||
+ | ==== 実装 ==== | ||
+ | |||
+ | 内部にカウンターをもち、カウンターの値を取得する(get)と、カウンターの値を1増やす(inc)するスマートコントラクトを実装します。 | ||
+ | |||
+ | <code JavaScript Counter.sol> | ||
+ | // SPDX-License-Identifier: | ||
+ | pragma solidity ^0.8.13; | ||
+ | |||
+ | contract Counter { | ||
+ | uint public count; | ||
+ | |||
+ | // Function to get the current count | ||
+ | function get() public view returns (uint) { | ||
+ | return count; | ||
+ | } | ||
+ | |||
+ | // Function to increment count by 1 | ||
+ | function inc() public { | ||
+ | count += 1; | ||
+ | } | ||
+ | |||
+ | // Function to decrement count by 1 | ||
+ | function dec() public { | ||
+ | count -= 1; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== コンパイル ==== | ||
+ | |||
+ | スマートコントラクトのコンパイルはコマンドラインから solc を使用して実行します。 | ||
+ | |||
+ | <code PowerShell> | ||
+ | solc-windows.exe --abi --bin Counter.sol | ||
+ | </ | ||
+ | |||
+ | コマンドの意味 | ||
+ | * solc-windows.exe: | ||
+ | * --abi: コンパイルして ABI を出力します | ||
+ | * --bin: コンパイルして バイナリ を出力します | ||
+ | * Counter.sol: | ||
+ | |||
+ | |||
+ | 上記コンパイルを実行すると、以下のように「Binary」と「Contract JSON API」が出力されます。 | ||
+ | |||
+ | 今後利用するときに「Binary」の先頭に「0x」を付ける必要がありますので、「0x」を付けてメモしておいてください。 | ||
+ | |||
+ | (例) 608060... → 0x608060... | ||
+ | |||
+ | |||
+ | <code PowerShell コンパイル実行結果> | ||
+ | ======= Counter.sol: | ||
+ | Binary: | ||
+ | 608060405234801561001057600080fd5b50610209806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806306661abd14610051578063371303c01461006f5780636d4ce63c14610079578063b3bcfa8214610097575b600080fd5b6100596100a1565b60405161006691906100ff565b60405180910390f35b6100776100a7565b005b6100816100c2565b60405161008e91906100ff565b60405180910390f35b61009f6100cb565b005b60005481565b60016000808282546100b99190610149565b92505081905550565b60008054905090565b60016000808282546100dd919061019f565b92505081905550565b6000819050919050565b6100f9816100e6565b82525050565b600060208201905061011460008301846100f0565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610154826100e6565b915061015f836100e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156101945761019361011a565b5b828201905092915050565b60006101aa826100e6565b91506101b5836100e6565b9250828210156101c8576101c761011a565b5b82820390509291505056fea26469706673582212207a90fc8477fe04ed648a217280498cc223d36737bb62448b5f15b12f4496447a64736f6c634300080d0033 | ||
+ | Contract JSON ABI | ||
+ | [{" | ||
+ | </ | ||
+ | |||
+ | ==== デプロイ ==== | ||
+ | |||
+ | スマートコントラクトのデプロイは geth console 上で行います。 | ||
+ | |||
+ | <code PowerShell> | ||
+ | geth --datadir private_network --nodiscover console | ||
+ | > var bin = " | ||
+ | b506004361061004c5760003560e01c806306661abd14610051578063371303c01461006f5780636d4ce63c14610079578063b3bcfa82146 | ||
+ | 10097575b600080fd5b6100596100a1565b60405161006691906100ff565b60405180910390f35b6100776100a7565b005b6100816100c25 | ||
+ | 65b60405161008e91906100ff565b60405180910390f35b61009f6100cb565b005b60005481565b60016000808282546100b99190610149565b92505081905550565b60008054905090565b60016000808282546100dd919061019f565b92505081905550565b6000819050919050565b6100f9816100e6565b82525050565b600060208201905061011460008301846100f0565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610154826100e6565b915061015f836100e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156101945761019361011a565b5b828201905092915050565b60006101aa826100e6565b91506101b5836100e6565b9250828210156101c8576101c761011a565b5b82820390509291505056fea26469706673582212207a90fc8477fe04ed648a217280498cc223d36737bb62448b5f15b12f4496447a64736f6c634300080d0033" | ||
+ | undefined | ||
+ | > var abi = [{" | ||
+ | undefined | ||
+ | > var contract = eth.contract(abi) | ||
+ | undefined | ||
+ | > var myContract = contract.new({ from: eth.accounts[0], | ||
+ | undefined | ||
+ | </ | ||
+ | |||
+ | 上記の作業でデプロイの「登録」は完了しました。 | ||
+ | デプロイ処理の実行は採掘時に行われます。Ganache では自動的に採掘が行われているため、ほぼ即時にデプロイが完了します。 | ||
+ | |||
+ | デプロイ処理が完了しているため「Contract Account」がaddressに付与されています。 | ||
+ | |||
+ | <code PowerShell> | ||
+ | > miner.start() | ||
+ | null | ||
+ | > myContract | ||
+ | { | ||
+ | abi: [{ | ||
+ | inputs: [], | ||
+ | name: " | ||
+ | outputs: [{...}], | ||
+ | stateMutability: | ||
+ | type: " | ||
+ | }, { | ||
+ | inputs: [], | ||
+ | name: " | ||
+ | outputs: [], | ||
+ | stateMutability: | ||
+ | type: " | ||
+ | }, { | ||
+ | inputs: [], | ||
+ | name: " | ||
+ | outputs: [{...}], | ||
+ | stateMutability: | ||
+ | type: " | ||
+ | }, { | ||
+ | inputs: [], | ||
+ | name: " | ||
+ | outputs: [], | ||
+ | stateMutability: | ||
+ | type: " | ||
+ | }], | ||
+ | address: " | ||
+ | transactionHash: | ||
+ | allEvents: function bound(), | ||
+ | count: function bound(), | ||
+ | dec: function bound(), | ||
+ | get: function bound(), | ||
+ | inc: function bound() | ||
+ | } | ||
+ | > miner.stop() | ||
+ | </ | ||
+ | |||
+ | ==== 実行 ==== | ||
+ | |||
+ | スマートコントラクトを呼び出してカウンターの値を1増やしてみます。 | ||
+ | この処理はトランザクションを伴うため、採掘時に実行されます。 | ||
+ | |||
+ | |||
+ | <code PowerShell> | ||
+ | > myContract.inc.sendTransaction({from: | ||
+ | " | ||
+ | </ | ||
+ | |||
+ | カウンターの値を参照してみましょう。 | ||
+ | |||
+ | 採掘前後で確認してみます。 | ||
+ | |||
+ | get でカウンターの値を参照する。 | ||
+ | |||
+ | <code PowerShell> | ||
+ | > myContract.get.call() | ||
+ | 0 | ||
+ | > myContract.get.call() | ||
+ | 1 | ||
+ | > miner.stop() | ||
+ | </ | ||
+ | |||
+ | ==== ガス代(手数料)の確認 ==== | ||
+ | |||
+ | トランザクションの実行にはガス代と呼ばれる手数料がかかります。 | ||
+ | そのため、トランザクションを発行したaccount[0]は想定よりも少しだけコインが減っているはずです。 | ||
+ | |||
+ | 確認してみましょう。 | ||
+ | |||
+ | <code PowerShell> | ||
+ | > eth.getBalance(eth.accounts[0]) | ||
+ | 1.496999999999998206439e+21 | ||
+ | </ | ||
blockchain/ethereum構築ハンズオン_ganache編.1650953851.txt.gz · 最終更新: 2022/04/26 06:17 by dot