ユーザ用ツール

サイト用ツール


blockchain:ethereum構築ハンズオン_geth偏

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
blockchain:ethereum構築ハンズオン_geth偏 [2022/04/20 02:09] dotblockchain: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:
 以下のファイルを作成してください。 以下のファイルを作成してください。
  
-<code genesis.json>+<code JSON genesis.json>
 { {
   "config": {   "config": {
行 61: 行 61:
 PowerShell やコマンドラインから以下のようにコマンドを実行することで、ブロックチェーンを構築します。 PowerShell やコマンドラインから以下のようにコマンドを実行することで、ブロックチェーンを構築します。
  
-(先程「インストール」した geth にパスを通すか、geth をフルパスで実行してください。+(先程「インストール」した geth にパスを通すか、geth をフルパスで実行してください。)
  
-<code - sh+<code PowerShell
-geth init --datadir ./private_network genesis.json+geth --datadir private_network init genesis.json
 </code> </code>
  
 コマンドの意味 コマンドの意味
   * geth: コマンドです   * geth: コマンドです
-  * init: 初期化を意味します 
   * --datadir: 各種必要なファイルを保存するためのディレクトリを指定します   * --datadir: 各種必要なファイルを保存するためのディレクトリを指定します
 +  * init: 初期化を意味します
   * genesis.json: 1番最初のブロックを定義した genesis ファイルを指定しています   * genesis.json: 1番最初のブロックを定義した genesis ファイルを指定しています
  
 ===== geth console でブロックチェーンにコンソール接続する ===== ===== geth console でブロックチェーンにコンソール接続する =====
  
-<code - sh+<code PowerShell
-geth console+geth --datadir private_network --nodiscover console
 </code> </code>
 +
 +コマンドの意味
 +  * geth: コマンドです
 +  * --datadir: 各種必要なファイルを保存するためのディレクトリを指定します
 +  * --nodiscover: 「他のノードを探さない」を意味します。ブロックチェーンはP2Pで他のノードと接続しあうネットワークですが、今回はプライベート型で構築しているため、このオプションを指定しています。
 +  * console: geth console つまりコマンドラインを起動します
 +
 +上記のように「geth ... console」でconsole接続すると「ブロックチェーンの起動」と「console接続」が同時に行われます。そのため、コマンドを打つ度にブロックチェーンのログがconsoleに出力され、大変操作しづらくなります。おすすめの方法は、以下「ブロックチェーンの起動」と「attachでconsole接続」分けて行う方法です。
 +
 +[[blockchain:ethereum:start_attach_console|ブロックチェーンの起動とattachを使用したconsole接続]]
 +
  
 ===== EOA(Externally Owned Account)の作成 ===== ===== EOA(Externally Owned Account)の作成 =====
行 85: 行 96:
 現在、アカウントが無いことを確認する。 現在、アカウントが無いことを確認する。
  
-<code - sh>+<code PowerShell>
 > eth.accounts > eth.accounts
 [] []
行 92: 行 103:
 アカウント2つ作成してみる。(後に送金と入金を確認するため2つ作成します) アカウント2つ作成してみる。(後に送金と入金を確認するため2つ作成します)
  
-<code - sh>+<code PowerShell>
 > personal.newAccount("password01") > personal.newAccount("password01")
 "0xd236df380900a967dcc8a229f6a27bd03c330c6d" "0xd236df380900a967dcc8a229f6a27bd03c330c6d"
行 107: 行 118:
 現在の coinbase を確認する。 現在の coinbase を確認する。
  
-<code - sh>+<code PowerShell>
 > eth.coinbase > eth.coinbase
 "0xd236df380900a967dcc8a229f6a27bd03c330c6d" "0xd236df380900a967dcc8a229f6a27bd03c330c6d"
行 114: 行 125:
 今後、採掘を行うと上記で表示された coinbase アカウントにコインが付加されます。 今後、採掘を行うと上記で表示された coinbase アカウントにコインが付加されます。
  
-===== Mining(採掘)の実行 =====+===== Mining(採掘)の実行と停止 =====
  
-<code - sh>+__実行__ 
 + 
 +<code PowerShell>
 > 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]), 'ether')
 +210
 </code> </code>
  
 +__停止__
 +
 +<code PowerShell>
 +> miner.stop()
 +</code>
  
 ===== 送金 ===== ===== 送金 =====
  
-<code - sh>+<code PowerShell>
 > personal.unlockAccount(eth.accounts[0]) > personal.unlockAccount(eth.accounts[0])
 Unlock account 0xd236df380900a967dcc8a229f6a27bd03c330c6d Unlock account 0xd236df380900a967dcc8a229f6a27bd03c330c6d
行 142: 行 164:
 "0xe5c0307ca99f89dfa135a6609d0a01a48b62855ceb3a34a8e36c66d1d7a3d893" "0xe5c0307ca99f89dfa135a6609d0a01a48b62855ceb3a34a8e36c66d1d7a3d893"
 </code> </code>
- 
-===== スマートコントラクト ===== 
  
 上記でトランザクションを送信している。 上記でトランザクションを送信している。
行 150: 行 170:
  
  
-<code - sh>+<code PowerShell>
 > miner.start() > miner.start()
 null null
行 159: 行 179:
 </code> </code>
  
 +===== スマートコントラクト =====
 +
 +==== コンパイラ(solc)のインストール ====
 +
 +[[https://github.com/ethereum/solidity/releases|solidity releases]]
 +でコンパイラーが公開されていますので、ダウンロードします。
 +
 +(上記で配布されているのでコンパイラの実行ファイルでので、解凍やインストールは必要なく、すぐにコンパイラを利用できます。)
  
 ==== 実装 ==== ==== 実装 ====
  
-<code Counter.sol>+内部にカウンターをもち、カウンターの値を取得する(get)と、カウンターの値を1増やす(inc)するスマートコントラクトを実装します。 
 + 
 +<code JavaScript Counter.sol>
 // SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.18;+pragma solidity ^0.8.13;
  
 contract Counter { contract Counter {
行 185: 行 215:
 } }
 </code> </code>
- 
-==== コンパイラ(solc)のインストール ==== 
- 
-[[https://github.com/ethereum/solidity/releases|solidity releases]] 
-でコンパイラーが公開されていますので、ダウンロードします。 
- 
-(上記で配布されているのでコンパイラの実行ファイルでので、解凍やインストールは必要なく、すぐにコンパイラを利用できます。) 
  
 ==== コンパイル ==== ==== コンパイル ====
  
-<code - sh>+スマートコントラクトのコンパイルはコマンドラインから solc を使用して実行します。 
 + 
 +<code PowerShell>
 solc-windows.exe --abi --bin Counter.sol solc-windows.exe --abi --bin Counter.sol
 </code> </code>
  
 コマンドの意味 コマンドの意味
-  * 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:Counter =======
 +Binary:
 +608060405234801561001057600080fd5b50610209806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806306661abd14610051578063371303c01461006f5780636d4ce63c14610079578063b3bcfa8214610097575b600080fd5b6100596100a1565b60405161006691906100ff565b60405180910390f35b6100776100a7565b005b6100816100c2565b60405161008e91906100ff565b60405180910390f35b61009f6100cb565b005b60005481565b60016000808282546100b99190610149565b92505081905550565b60008054905090565b60016000808282546100dd919061019f565b92505081905550565b6000819050919050565b6100f9816100e6565b82525050565b600060208201905061011460008301846100f0565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610154826100e6565b915061015f836100e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156101945761019361011a565b5b828201905092915050565b60006101aa826100e6565b91506101b5836100e6565b9250828210156101c8576101c761011a565b5b82820390509291505056fea26469706673582212207a90fc8477fe04ed648a217280498cc223d36737bb62448b5f15b12f4496447a64736f6c634300080d0033
 +Contract JSON ABI
 +[{"inputs":[],"name":"count","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"get","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inc","outputs":[],"stateMutability":"nonpayable","type":"function"}]
 +</code>
  
 ==== デプロイ ==== ==== デプロイ ====
 +
 +スマートコントラクトのデプロイは geth console 上で行います。
 +
 +
 +<code PowerShell>
 +geth --datadir private_network --nodiscover console
 +> var bin = "0x608060405234801561001057600080fd5b50610209806100206000396000f3fe608060405234801561001057600080fd5
 +b506004361061004c5760003560e01c806306661abd14610051578063371303c01461006f5780636d4ce63c14610079578063b3bcfa82146
 +10097575b600080fd5b6100596100a1565b60405161006691906100ff565b60405180910390f35b6100776100a7565b005b6100816100c25
 +65b60405161008e91906100ff565b60405180910390f35b61009f6100cb565b005b60005481565b60016000808282546100b99190610149565b92505081905550565b60008054905090565b60016000808282546100dd919061019f565b92505081905550565b6000819050919050565b6100f9816100e6565b82525050565b600060208201905061011460008301846100f0565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610154826100e6565b915061015f836100e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156101945761019361011a565b5b828201905092915050565b60006101aa826100e6565b91506101b5836100e6565b9250828210156101c8576101c761011a565b5b82820390509291505056fea26469706673582212207a90fc8477fe04ed648a217280498cc223d36737bb62448b5f15b12f4496447a64736f6c634300080d0033"
 +undefined
 +> var abi = [{"inputs":[],"name":"count","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"get","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inc","outputs":[],"stateMutability":"nonpayable","type":"function"}]
 +undefined
 +> var contract = eth.contract(abi)
 +undefined
 +> var myContract = contract.new({ from: eth.accounts[0], data: bin})
 +Error: authentication needed: password or unlock
 +        at web3.js:6365:37(47)
 +        at send (web3.js:5099:62(35))
 +        at web3.js:3021:48(124)
 +        at <eval>:1:30(13)
 +> personal.unlockAccount(eth.accounts[0])
 +Unlock account 0xd78f9a659a9a7b50689eb2bd4c4aebdc9c2e5312
 +Passphrase:
 +true
 +> var myContract = contract.new({ from: eth.accounts[0], data: bin})
 +undefined
 +</code>
 +
 +上記の作業でデプロイの「登録」は完了しました。
 +デプロイ処理の実行は採掘時に行われます。
 +
 +採掘前のスマートコントラクトの状況を見ておきます。
 +
 +までデプロイが完了していないため「address: undefined」となっています。
 +デプロイ処理が完了すると「Contract Account」がaddressに付与されます。
 +
 +<code PowerShell>
 +> myContract
 +{
 +  abi: [{
 +      inputs: [],
 +      name: "count",
 +      outputs: [{...}],
 +      stateMutability: "view",
 +      type: "function"
 +  }, {
 +      inputs: [],
 +      name: "dec",
 +      outputs: [],
 +      stateMutability: "nonpayable",
 +      type: "function"
 +  }, {
 +      inputs: [],
 +      name: "get",
 +      outputs: [{...}],
 +      stateMutability: "view",
 +      type: "function"
 +  }, {
 +      inputs: [],
 +      name: "inc",
 +      outputs: [],
 +      stateMutability: "nonpayable",
 +      type: "function"
 +  }],
 +  address: undefined,
 +  transactionHash: "0x621b3dffcaf4c656ab69e65bfa0fccd27bc3f61e65440ba6b3d392c0df2bc117"
 +}
 +</code>
 +
 +採掘を行ってからスマートコントラクトの状況を見てみます。
 +
 +デプロイ処理が完了しているため「Contract Account」がaddressに付与されています。
 +
 +<code PowerShell>
 +> miner.start()
 +null
 +> myContract
 +{
 +  abi: [{
 +      inputs: [],
 +      name: "count",
 +      outputs: [{...}],
 +      stateMutability: "view",
 +      type: "function"
 +  }, {
 +      inputs: [],
 +      name: "dec",
 +      outputs: [],
 +      stateMutability: "nonpayable",
 +      type: "function"
 +  }, {
 +      inputs: [],
 +      name: "get",
 +      outputs: [{...}],
 +      stateMutability: "view",
 +      type: "function"
 +  }, {
 +      inputs: [],
 +      name: "inc",
 +      outputs: [],
 +      stateMutability: "nonpayable",
 +      type: "function"
 +  }],
 +  address: "0x642851bf1760f1aaf0a7a3de8abc646ccd76699c",
 +  transactionHash: "0x621b3dffcaf4c656ab69e65bfa0fccd27bc3f61e65440ba6b3d392c0df2bc117",
 +  allEvents: function bound(),
 +  count: function bound(),
 +  dec: function bound(),
 +  get: function bound(),
 +  inc: function bound()
 +}
 +> miner.stop()
 +</code>
  
 ==== 実行 ==== ==== 実行 ====
 +
 +スマートコントラクトを呼び出してカウンターの値を1増やしてみます。
 +この処理はトランザクションを伴うため、採掘時に実行されます。
 +
 +
 +<code PowerShell>
 +myContract.inc.sendTransaction({from:eth.accounts[0]})
 +Error: authentication needed: password or unlock
 +        at web3.js:6365:37(47)
 +        at send (web3.js:5099:62(35))
 +        at web3.js:4155:41(53)
 +        at <eval>:1:35(9)
 +
 +> personal.unlockAccount(eth.accounts[0])
 +Unlock account 0xd78f9a659a9a7b50689eb2bd4c4aebdc9c2e5312
 +Passphrase:
 +true
 +> myContract.inc.sendTransaction({from:eth.accounts[0]})
 +"0xd254b4b2e830350da787720e9b037e1e27cc11ad93452ff79345e88d716b9cf2"
 +</code>
 +
 +カウンターの値を参照してみましょう。
 +
 +採掘前後で確認してみます。
 +
 +get でカウンターの値を参照する。
 +
 +<code PowerShell>
 +> myContract.get.call()
 +0
 +> miner.start()
 +null
 +> myContract.get.call()
 +1
 +> miner.stop()
 +</code>
  
 ==== ガス代(手数料)の確認 ==== ==== ガス代(手数料)の確認 ====
 +
 +トランザクションの実行にはガス代と呼ばれる手数料がかかります。
 +そのため、トランザクションを発行したaccount[0]は想定よりも少しだけコインが減っているはずです。
 +
 +確認してみましょう。
 +
 +<code PowerShell>
 +> eth.getBalance(eth.accounts[0])
 +1.496999999999998206439e+21
 +</code>
  
blockchain/ethereum構築ハンズオン_geth偏.1650420544.txt.gz · 最終更新: 2022/04/20 02:09 by dot