blockchain:ethereum構築ハンズオン_geth偏
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
blockchain:ethereum構築ハンズオン_geth偏 [2022/04/20 02:04] – dot | blockchain:ethereum構築ハンズオン_geth偏 [2022/04/28 01:46] (現在) – dot | ||
---|---|---|---|
行 1: | 行 1: | ||
====== ethereumブロックチェーンの構築(geth偏) ====== | ====== ethereumブロックチェーンの構築(geth偏) ====== | ||
- | プライベート型のethereumブロックチェーンを構築し、採掘、スマートコントラクトを実行するハンズオンです。 | + | プライベート型のethereumブロックチェーンを構築し、採掘、送金、スマートコントラクトを実行するハンズオンです。 |
===== インストール ===== | ===== インストール ===== | ||
行 15: | 行 15: | ||
==== genesis ファイルの作成 ==== | ==== genesis ファイルの作成 ==== | ||
- | ブロックチェーンを構築するさい、1番最初のブロックを作成する必要があります。 | + | ブロックチェーンを構築するときには、まず1番最初のブロックを作成する必要があります。 |
1番最初のブロックを定義するためのファイルを「genesisファイル」(genesis: | 1番最初のブロックを定義するためのファイルを「genesisファイル」(genesis: | ||
行 23: | 行 23: | ||
以下のファイルを作成してください。 | 以下のファイルを作成してください。 | ||
- | < | + | < |
{ | { | ||
" | " | ||
行 61: | 行 61: | ||
PowerShell やコマンドラインから以下のようにコマンドを実行することで、ブロックチェーンを構築します。 | PowerShell やコマンドラインから以下のようにコマンドを実行することで、ブロックチェーンを構築します。 | ||
- | (先程「インストール」した geth にパスを通すか、geth をフルパスで実行してください。 | + | (先程「インストール」した geth にパスを通すか、geth をフルパスで実行してください。) |
- | < | + | < |
- | geth init --datadir | + | geth --datadir private_network |
</ | </ | ||
コマンドの意味 | コマンドの意味 | ||
* geth: コマンドです | * geth: コマンドです | ||
- | * init: 初期化を意味します | ||
* --datadir: 各種必要なファイルを保存するためのディレクトリを指定します | * --datadir: 各種必要なファイルを保存するためのディレクトリを指定します | ||
+ | * init: 初期化を意味します | ||
* genesis.json: | * genesis.json: | ||
===== geth console でブロックチェーンにコンソール接続する ===== | ===== geth console でブロックチェーンにコンソール接続する ===== | ||
- | < | + | < |
- | geth console | + | geth --datadir private_network --nodiscover |
</ | </ | ||
+ | |||
+ | コマンドの意味 | ||
+ | * geth: コマンドです | ||
+ | * --datadir: 各種必要なファイルを保存するためのディレクトリを指定します | ||
+ | * --nodiscover: | ||
+ | * console: geth console つまりコマンドラインを起動します | ||
+ | |||
+ | 上記のように「geth ... console」でconsole接続すると「ブロックチェーンの起動」と「console接続」が同時に行われます。そのため、コマンドを打つ度にブロックチェーンのログがconsoleに出力され、大変操作しづらくなります。おすすめの方法は、以下「ブロックチェーンの起動」と「attachでconsole接続」分けて行う方法です。 | ||
+ | |||
+ | [[blockchain: | ||
+ | |||
===== EOA(Externally Owned Account)の作成 ===== | ===== EOA(Externally Owned Account)の作成 ===== | ||
行 85: | 行 96: | ||
現在、アカウントが無いことを確認する。 | 現在、アカウントが無いことを確認する。 | ||
- | < | + | < |
> eth.accounts | > eth.accounts | ||
[] | [] | ||
行 92: | 行 103: | ||
アカウント2つ作成してみる。(後に送金と入金を確認するため2つ作成します) | アカウント2つ作成してみる。(後に送金と入金を確認するため2つ作成します) | ||
- | < | + | < |
> personal.newAccount(" | > personal.newAccount(" | ||
" | " | ||
行 107: | 行 118: | ||
現在の coinbase を確認する。 | 現在の coinbase を確認する。 | ||
- | < | + | < |
> eth.coinbase | > eth.coinbase | ||
" | " | ||
行 114: | 行 125: | ||
今後、採掘を行うと上記で表示された coinbase アカウントにコインが付加されます。 | 今後、採掘を行うと上記で表示された coinbase アカウントにコインが付加されます。 | ||
- | ===== Mining(採掘)の実行 ===== | + | ===== Mining(採掘)の実行と停止 |
- | < | + | __実行__ |
+ | |||
+ | < | ||
> miner.start() | > miner.start() | ||
null | null | ||
行 129: | 行 142: | ||
> eth.getBalance(eth.accounts[1]) | > eth.getBalance(eth.accounts[1]) | ||
0 | 0 | ||
+ | |||
+ | ETH で残高を表示 | ||
+ | > web3.fromWei(eth.getBalance(eth.accounts[0]), | ||
+ | 210 | ||
</ | </ | ||
+ | __停止__ | ||
+ | |||
+ | <code PowerShell> | ||
+ | > miner.stop() | ||
+ | </ | ||
===== 送金 ===== | ===== 送金 ===== | ||
- | < | + | < |
> personal.unlockAccount(eth.accounts[0]) | > personal.unlockAccount(eth.accounts[0]) | ||
Unlock account 0xd236df380900a967dcc8a229f6a27bd03c330c6d | Unlock account 0xd236df380900a967dcc8a229f6a27bd03c330c6d | ||
行 142: | 行 164: | ||
" | " | ||
</ | </ | ||
- | |||
- | ===== スマートコントラクト ===== | ||
上記でトランザクションを送信している。 | 上記でトランザクションを送信している。 | ||
行 150: | 行 170: | ||
- | < | + | < |
> miner.start() | > miner.start() | ||
null | null | ||
行 159: | 行 179: | ||
</ | </ | ||
- | + | ===== スマートコントラクト ===== | |
- | ==== 実装 | + | |
==== コンパイラ(solc)のインストール ==== | ==== コンパイラ(solc)のインストール ==== | ||
行 168: | 行 187: | ||
(上記で配布されているのでコンパイラの実行ファイルでので、解凍やインストールは必要なく、すぐにコンパイラを利用できます。) | (上記で配布されているのでコンパイラの実行ファイルでので、解凍やインストールは必要なく、すぐにコンパイラを利用できます。) | ||
+ | |||
+ | ==== 実装 ==== | ||
+ | |||
+ | 内部にカウンターをもち、カウンターの値を取得する(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 を使用して実行します。 |
+ | |||
+ | < | ||
solc-windows.exe --abi --bin Counter.sol | solc-windows.exe --abi --bin Counter.sol | ||
</ | </ | ||
コマンドの意味 | コマンドの意味 | ||
- | * solc-windows.exe: | + | * solc-windows.exe: |
* --abi: コンパイルして ABI を出力します | * --abi: コンパイルして ABI を出力します | ||
* --bin: コンパイルして バイナリ を出力します | * --bin: コンパイルして バイナリ を出力します | ||
* Counter.sol: | * 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], | ||
+ | Error: authentication needed: password or unlock | ||
+ | at web3.js: | ||
+ | at send (web3.js: | ||
+ | at web3.js: | ||
+ | at < | ||
+ | > personal.unlockAccount(eth.accounts[0]) | ||
+ | Unlock account 0xd78f9a659a9a7b50689eb2bd4c4aebdc9c2e5312 | ||
+ | Passphrase: | ||
+ | true | ||
+ | > var myContract = contract.new({ from: eth.accounts[0], | ||
+ | undefined | ||
+ | </ | ||
+ | |||
+ | 上記の作業でデプロイの「登録」は完了しました。 | ||
+ | デプロイ処理の実行は採掘時に行われます。 | ||
+ | |||
+ | 採掘前のスマートコントラクトの状況を見ておきます。 | ||
+ | |||
+ | までデプロイが完了していないため「address: | ||
+ | デプロイ処理が完了すると「Contract Account」がaddressに付与されます。 | ||
+ | |||
+ | <code PowerShell> | ||
+ | > myContract | ||
+ | { | ||
+ | abi: [{ | ||
+ | inputs: [], | ||
+ | name: " | ||
+ | outputs: [{...}], | ||
+ | stateMutability: | ||
+ | type: " | ||
+ | }, { | ||
+ | inputs: [], | ||
+ | name: " | ||
+ | outputs: [], | ||
+ | stateMutability: | ||
+ | type: " | ||
+ | }, { | ||
+ | inputs: [], | ||
+ | name: " | ||
+ | outputs: [{...}], | ||
+ | stateMutability: | ||
+ | type: " | ||
+ | }, { | ||
+ | inputs: [], | ||
+ | name: " | ||
+ | outputs: [], | ||
+ | stateMutability: | ||
+ | type: " | ||
+ | }], | ||
+ | address: undefined, | ||
+ | transactionHash: | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | 採掘を行ってからスマートコントラクトの状況を見てみます。 | ||
+ | |||
+ | デプロイ処理が完了しているため「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: | ||
+ | Error: authentication needed: password or unlock | ||
+ | at web3.js: | ||
+ | at send (web3.js: | ||
+ | at web3.js: | ||
+ | at < | ||
+ | |||
+ | > personal.unlockAccount(eth.accounts[0]) | ||
+ | Unlock account 0xd78f9a659a9a7b50689eb2bd4c4aebdc9c2e5312 | ||
+ | Passphrase: | ||
+ | true | ||
+ | > myContract.inc.sendTransaction({from: | ||
+ | " | ||
+ | </ | ||
+ | |||
+ | カウンターの値を参照してみましょう。 | ||
+ | |||
+ | 採掘前後で確認してみます。 | ||
+ | |||
+ | get でカウンターの値を参照する。 | ||
+ | |||
+ | <code PowerShell> | ||
+ | > myContract.get.call() | ||
+ | 0 | ||
+ | > miner.start() | ||
+ | null | ||
+ | > myContract.get.call() | ||
+ | 1 | ||
+ | > miner.stop() | ||
+ | </ | ||
==== ガス代(手数料)の確認 ==== | ==== ガス代(手数料)の確認 ==== | ||
+ | |||
+ | トランザクションの実行にはガス代と呼ばれる手数料がかかります。 | ||
+ | そのため、トランザクションを発行したaccount[0]は想定よりも少しだけコインが減っているはずです。 | ||
+ | |||
+ | 確認してみましょう。 | ||
+ | |||
+ | <code PowerShell> | ||
+ | > eth.getBalance(eth.accounts[0]) | ||
+ | 1.496999999999998206439e+21 | ||
+ | </ | ||
blockchain/ethereum構築ハンズオン_geth偏.1650420246.txt.gz · 最終更新: 2022/04/20 02:04 by dot