概要
Go言語でSmart Contractを理解したい人向けの記事です。最初のhello world Ethereumスマートコントラクトをローカルマシンでスタートさせるのをサポートします。
この記事の構成は以下の通り。
- Solidityでスマートコントラクトを作成
- Go言語でスマートコントラクトと通信するバックエンドを作成
目次
開発環境の構築
OS
OS:Ubuntu22.04
必要なミドルウェアインストール
始める前に、まずこれらのツールをインストールする必要があります。
npm インストール
$ sudo apt install nodejs npm
$ sudo npm install -g n
安定版のインストールです。推奨です。
Go言語 インストール
Go言語は、ブロックチェーンと通信するバックエンドを構築するために使用する言語です。
$ sudo tar -C /usr/local -xzf go1.17.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
バージョンはこちらで確認
https://golang.org/dl/
ethereumレポジトリのインストール
ubuntuにはethereum用のレポジトリが用意されています。そこに以下の3つをインストールします。
- Geth : GolangのEthereumクライアント
- Solidity : スマートコントラクトを構築するための言語
- abigen : SolidityをGo言語にジェネレートするソフトウェア
$ sudo apt-get update
$ sudo apt-get install ethereum abigen solc
コードセット
git clone でプログラミングを取得し、
go mod tidy コマンドでgo modファイルのモジュールをインストールします。
httpルータにはechoというフレームワークを使用しています。
Golang Ethereumクライアントにはgo-ethereumを使用します。
Ganacheのインストール
Ganacheまたはganache-cli、あなたのローカルマシン上で動作するブロックチェーンネットワーク。
スマートコントラクトの作成
コードはGithubに格納しています。
solidityの作成
SmartContractStartと呼ばれるこのシンプルなスマートコントラクトには、pureキーワードで示される2つのこの関数内でしか使えないfunctionが含まれています。
solidityをGo言語へコンパイル
$ solc --optimize --bin ./solidities/smart_contract_start.sol -o build
$ abigen --abi=./build/SmartContractStart.abi --bin=./build/SmartContractStart.bin --pkg=contracts --out=./contracts/smart_contract_start.go
コントラクトアドレス取得
プライベートキーの変換コード
コントラクトアドレス取得コマンド
$ go run create_contract_address.go
$ cd ../
Ganacheを起動
上記のコマンドを実行すると以下のような結果が出力されます。(Ganacheを起動することでMetamaskとローカル接続可能になります)
Go言語でコントラクトアドレス取得
const にPRIVATE_KEYが定義されていますがここの値は上記のGanacheのどれでもいいので0~9までに記載されているプライベートキーを貼り付けます。
その際は頭文字0xは削除して下さい
ethclient.Dial()にDeployセクションと同じホストとポートを指定し、さらに "CONTRACT_ADDRESS "をデプロイが終わった後に受け取ったアドレスに置き換えます。
abigenから生成されたGolangインターフェースからインポートされた関数api.NewContracts(common.HexToAddress("CONTRACT_ADDRESS"), client)は、バックエンドをEthereumブロックチェーンにデプロイされたコントラクトに接続します。
このプログラムを実行することでContract Adressが出力することができます。
EVMからの情報を取得し更新できるAPI作成
プログラミング起動コマンドはこちら
無事起動すれば以下の4つのアクションを起こすとGoプログラミングが実行されます。
curl -X GET "http://localhost:1323/greet/yoshis2"
curl -X GET "http://localhost:1323/greet/greetings"
curl -X GET "http://localhost:1323/greet/randomtextforthequeryparameter"