ユーザ用ツール

サイト用ツール


blockchain:ethereum構築ハンズオン_ganache編

文書の過去の版を表示しています。


ethereumブロックチェーンの構築(Ganache編)

Ganacheを使用してethereumブロックチェーンを構築し、gethでブロックチェーンに接続して採掘、送金、スマートコントラクトを実行するハンズオンです。

Ganacheとは?

Ganache は ethereum に対応した開発用ノード(ブロックチェーン)です。 アプリケーションをインストールするだけで、すぐに ethereum ブロックチェーンを利用した開発が始められます。 また、デフォルトで採掘が自動的に行われますので、必要なトランザクションは自動的に処理されます。

インストール

Ganacheはアプリケーションとして配布されており、アプリケーションをインストールするだけで簡単にethereumブロックチェーンを開発できます。 Linux、macOS、Windows 用のパッケージが公開さています。

お使いの環境に合わせて Ganache パッケージをダウンロードし、インストールしてください。

起動

Ganache が起動したら「QUICKSTART」をクリックしてください

すると、以下のようなウィンドウが立ち上がります。

起動した段階で既に10アカウントが作成されており、それぞれに 100 ETH 割り振られています。

後ほど、この Ganache の ethereum ブロックチェーンに geth でアクセスする際、このウィンドウにある「RPC SERVER URL」のを使用します。(下図参照)

また、一番上のアカウントの PRIVATE KEY を後ほど使用しますので、メモしておいてください。(下図参照)

geth attach でブロックチェーンにコンソール接続する

「起動」の手順で確認した「RPC SERVER URL」を使用して、以下のようにコンソール接続することができます。

sh
geth --nodiscover attach http://127.0.0.1:7545

アカウントのアンロック

ガス代(手数料)がかかるトランザクション処理や送金を行うためには、アカウントをアンロックする必要があります。 「起動」の手順で確認した「PRIVATE KEY」を使用して、以下のようにアカウントのアンロックができます。

geth
> personal.unlockAccount(eth.accounts[0])
Unlock account 0xd236df380900a967dcc8a229f6a27bd03c330c6d
Passphrase:
true

今後、必要に応じてアカウントアンロックを実施してください。

送金

送金前

sh
> eth.getBalance(eth.accounts[0])
100000000000000000000
> eth.getBalance(eth.accounts[1])
100000000000000000000

送金

sh
> eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(5, "ether")})

送金後

sh
> eth.getBalance(eth.accounts[0])
94999580000000000000
> eth.getBalance(eth.accounts[1])
105000000000000000000

スマートコントラクト

コンパイラ(solc)のインストール

solidity releases でコンパイラーが公開されていますので、ダウンロードします。

(上記で配布されているのでコンパイラの実行ファイルでので、解凍やインストールは必要なく、すぐにコンパイラを利用できます。)

実装

内部にカウンターをもち、カウンターの値を取得する(get)と、カウンターの値を1増やす(inc)するスマートコントラクトを実装します。

Counter.sol
// SPDX-License-Identifier: MIT
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 を使用して実行します。

sh
solc-windows.exe --abi --bin Counter.sol

コマンドの意味

  • solc-windows.exe: コンパイラのコマンドです
  • –abi: コンパイルして ABI を出力します
  • –bin: コンパイルして バイナリ を出力します
  • Counter.sol: ソースコードを指定しています

上記コンパイルを実行すると、以下のように「Binary」と「Contract JSON API」が出力されます。

今後利用するときに「Binary」の先頭に「0x」を付ける必要がありますので、「0x」を付けてメモしておいてください。

(例) 608060… → 0x608060…

コンパイル実行結果
======= 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"}]

デプロイ

スマートコントラクトのデプロイは geth console 上で行います。

sh
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

上記の作業でデプロイの「登録」は完了しました。 デプロイ処理の実行は採掘時に行われます。Ganache では自動的に採掘が行われているため、ほぼ即時にデプロイが完了します。

デプロイ処理が完了しているため「Contract Account」がaddressに付与されています。

sh
> 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()

実行

スマートコントラクトを呼び出してカウンターの値を1増やしてみます。 この処理はトランザクションを伴うため、採掘時に実行されます。

sh
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"

カウンターの値を参照してみましょう。

採掘前後で確認してみます。

get でカウンターの値を参照する。

sh
> myContract.get.call()
0
> myContract.get.call()
1
> miner.stop()

ガス代(手数料)の確認

トランザクションの実行にはガス代と呼ばれる手数料がかかります。 そのため、トランザクションを発行したaccount[0]は想定よりも少しだけコインが減っているはずです。

確認してみましょう。

sh
> eth.getBalance(eth.accounts[0])
1.496999999999998206439e+21
blockchain/ethereum構築ハンズオン_ganache編.1651019017.txt.gz · 最終更新: 2022/04/27 00:23 by dot