DEV Community

web3ten0
web3ten0

Posted on

Ethereumの超シンプルなコントラクトをgethコンソールからデプロイする

下記の超シンプルなコントラクトをコンパイル、デプロイして、アクセスしてみます。Windows10のWSL2のUbuntu20.04でやっています。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract Hoge {
    function get() public pure returns (string memory){
        string memory hoge = "HOGE";
        return hoge;
    }
}
Enter fullscreen mode Exit fullscreen mode

コンパイラは、solcをaptでインストールするか、solc-jsをnpmでインストールするかで、どちらでもコンパイルできました。以下はsolc-jsの場合です。

> solcjs --bin --abi -o bin Hoge.sol
Enter fullscreen mode Exit fullscreen mode

コンパイルすると下記ファイルができます。

❯ tree
.
├── Hoge.sol
└── bin
    ├── Hoge_sol_Hoge.abi
    └── Hoge_sol_Hoge.bin
Enter fullscreen mode Exit fullscreen mode

デプロイするネットワークは、goerliにします。ここでgoerliで使えるETHをもらえます。

> geth --goerli --syncmode "light" --verbosity 0 console
Enter fullscreen mode Exit fullscreen mode

上記を実行するとlightモードでgoerliに接続しつつ、gethコンソールが開きます。以下はgethコンソールでの作業です。利用するアカウントは、ETHを保有しています。アカウントのパスワードは hoge です。

まずは、コンパイルした Hoge_sol_Hoge.binと、Hoge_sol_Hoge.abi の中身をgethコンソールの変数に入れておきます。binの中身の先頭に 0x をつける必要があります。

> bytecode = "0x608060405234801561001057600080fd5b50610182806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80636d4ce63c14610030575b600080fd5b61003861004e565b604051610045919061012a565b60405180910390f35b606060006040518060400160405280600481526020017f484f47450000000000000000000000000000000000000000000000000000000081525090508091505090565b600081519050919050565b600082825260208201905092915050565b60005b838110156100cb5780820151818401526020810190506100b0565b838111156100da576000848401525b50505050565b6000601f19601f8301169050919050565b60006100fc82610091565b610106818561009c565b93506101168185602086016100ad565b61011f816100e0565b840191505092915050565b6000602082019050818103600083015261014481846100f1565b90509291505056fea264697066735822122097a132140711a9b641222ac8bc84bb5a671eb1c5c2b26d58c564036536ec0bba64736f6c63430008090033"
> abi = [{"inputs":[],"name":"get","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]
Enter fullscreen mode Exit fullscreen mode

次に、アカウントのロックを解除して、コントラクトをデプロイします。

> account = eth.accounts[0]
> personal.unlockAccount(account, 'hoge')
> params = {from:account, data:bytecode, gas:500e3}
> tx = eth.sendTransaction(params)
Enter fullscreen mode Exit fullscreen mode

トランザクションが反映されたかどうかは下記で確認できます。未反映の場合nullが返ります。

> web3.eth.getTransactionReceipt(tx)
Enter fullscreen mode Exit fullscreen mode

下記でコントラクトの関数を実行できます。

> addr = web3.eth.getTransactionReceipt(tx).contractAddress
> Hoge = web3.eth.contract(abi).at(addr)
> personal.unlockAccount(account, 'hoge')
> web3.eth.defaultAccount = account
> Hoge.get.call()
"HOGE"
Enter fullscreen mode Exit fullscreen mode

Discussion (0)