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