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

2021/11/29

下記の超シンプルなコントラクトをコンパイル、デプロイして、アクセスしてみます。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;
    }
}

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

> solcjs --bin --abi -o bin Hoge.sol

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

❯ tree
.
├── Hoge.sol
└── bin
    ├── Hoge_sol_Hoge.abi
    └── Hoge_sol_Hoge.bin

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

> geth --goerli --syncmode "light" --verbosity 0 console

上記を実行すると 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"}]

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

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

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

> web3.eth.getTransactionReceipt(tx)

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

> 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"
Rust🦀, Network⚡, PostgreSQL🐘, Unity🎮

Tags

rust  (9)
rocket  (7)
svelte  (5)
c++  (4)
ethereum  (3)
solidity  (3)
vscode  (3)
sqlx  (3)
glfw  (2)
opengl  (2)
nestjs  (2)
graphql  (2)
render  (2)
wsl2  (2)
truffle  (1)
goerli  (1)
geth  (1)
hardhat  (1)
nft  (1)
gui  (1)
tetris  (1)
next.js  (1)
jwt  (1)
nextauth  (1)
node.js  (1)
prisma  (1)
passport  (1)
urql  (1)
codegen  (1)
mdsvex  (1)
markdown  (1)
tmux  (1)
nvim  (1)
axum  (1)
atcoder  (1)
vim  (1)
pacman  (1)
tracing  (1)
Cursor  (1)
VSCode  (1)
PHP  (1)
Laravel  (1)