0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

InfocomAdvent Calendar 2022

Day 7

イーサリアム開発環境(Geth)でスマートコントラクト(Solidity)を実行する

Posted at

前回の記事ではイーサリアム開発環境で送金処理を行いました。

今回はSolidityで簡単なスマートコントラクトを作って実行してみます。

Solidityインストール

Solidityはブロックチェーン上で実行されるスマートコントラクトを記述するためのプログラミング言語です。

まずSolidityをインストールします。
以下コマンドを実行します。

$ brew tap ethereum/ethereum
$ brew install solidity
$ solc --version
solc, the solidity compiler commandline interface
Version: 0.8.17+commit.8df45f5f.Darwin.appleclang

スマートコントラクト作成

お約束の「Hello World」を実装します。
HelloWorld.solを作成します。

// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;
contract HelloWorld {
    function helloWorld() public pure returns (string memory) {
        return "Hello World!";
    }
}

コンパイルします。

$ solc --abi --bin HelloWorld.sol

======= HelloWorld.sol:HelloWorld =======
Binary:
608060405234801561001057600080fd5b50610173806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063c605f76c14610030575b600080fd5b61003861004e565b604051610045919061011b565b60405180910390f35b60606040518060400160405280600c81526020017f48656c6c6f20576f726c64210000000000000000000000000000000000000000815250905090565b600081519050919050565b600082825260208201905092915050565b60005b838110156100c55780820151818401526020810190506100aa565b60008484015250505050565b6000601f19601f8301169050919050565b60006100ed8261008b565b6100f78185610096565b93506101078185602086016100a7565b610110816100d1565b840191505092915050565b6000602082019050818103600083015261013581846100e2565b90509291505056fea26469706673582212209b95e9b1f14a7392b0159486479a626f74c987694337205d513dcfaa968c0eed64736f6c63430008110033
Contract JSON ABI
[{"inputs":[],"name":"helloWorld","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]

ABI(Application Binary Interface)とはContractの取り扱い説明書のようなものです。関数の定義内容などが記載されています。

作成したスマートコントラクトをブロックチェーンにデプロイします。
gethコンソール上で以下コマンドを実行します。
binはコンパイル時に出力されたBinaryコードを指定します。
abiはコンパイル時に出力されたJSON ABIコードを指定します。

> bin = '(省略)'
> abi = [{"inputs":[],"name":"helloWorld","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]
> personal.unlockAccount(eth.accounts[0])
Unlock account 0xf53ac86545559b81188c48ecfd89183e74a05ba5
Passphrase: 
true
> contract = eth.contract(abi).new({from: eth.accounts[0], data: bin})
{
  abi: [{
      inputs: [],
      name: "helloWorld",
      outputs: [{...}],
      stateMutability: "pure",
      type: "function"
  }],
  address: undefined,
  transactionHash: "0x58799e7b46a782ae619c32ad980acb2c5bfea3c9752f84d4f114ce55d1eab10e"
}
> miner.start(1)
null

デプロイしたスマートコントラクトにアドレスが割り当てられていることを確認します。

> contract.address
"0x574b913226921fab7783e873ce4e04c792c020bf"

スマートコントラクト実行

先ほどデプロイしたスマートコントラクトにアクセスするオブジェクトを生成します。

> contract_helloWorld = eth.contract(abi).at(contract.address)
{
  abi: [{
      inputs: [],
      name: "helloWorld",
      outputs: [{...}],
      stateMutability: "pure",
      type: "function"
  }],
  address: "0x574b913226921fab7783e873ce4e04c792c020bf",
  transactionHash: null,
  allEvents: function bound(),
  helloWorld: function bound()
}

このオブジェクトからスマートコントラクトを実行します。

> contract_helloWorld.helloWorld.call()
"Hello World!"

無事にメッセージが表示されました。

今後はもっと勉強して、スマートコントラクト本来の目的である、ブロックチェーン上で契約を自動的に実行する仕組みを実装してみたいと考えています。

参考サイト

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?