Go言語でEthereum Smart Contract環境構築

2021年9月16日

Go言語でEthereum Smart Contract環境構築

概要

Go言語でSmart Contractを理解したい人向けの記事です。最初のhello world Ethereumスマートコントラクトをローカルマシンでスタートさせるのをサポートします。

この記事の構成は以下の通り。

  • Solidityでスマートコントラクトを作成
  • Go言語でスマートコントラクトと通信するバックエンドを作成

開発環境の構築

OS

OS:Ubuntu22.04

必要なミドルウェアインストール

始める前に、まずこれらのツールをインストールする必要があります。

npm インストール

$ sudo apt update
$ sudo apt install nodejs npm
$ sudo npm install -g n

安定版のインストールです。推奨です。

$ sudo n --stable

Go言語 インストール

Go言語は、ブロックチェーンと通信するバックエンドを構築するために使用する言語です。

$ wget https://dl.google.com/go/go1.17.linux-amd64.tar.gz
$ sudo tar -C /usr/local -xzf go1.17.linux-amd64.tar.gz
$ vi ~/.bashrc

export PATH=$PATH:/usr/local/go/bin

$ source ~/.bashrc

バージョンはこちらで確認
https://golang.org/dl/

ethereumレポジトリのインストール

ubuntuにはethereum用のレポジトリが用意されています。そこに以下の3つをインストールします。

  • Geth : GolangのEthereumクライアント
  • Solidity : スマートコントラクトを構築するための言語
  • abigen : SolidityをGo言語にジェネレートするソフトウェア
$ sudo add-apt-repository ppa:ethereum/ethereum
$ sudo apt-get update
$ sudo apt-get install ethereum abigen solc

コードセット

git clone [email protected]:yoshis2/smart-contract-beginner.git

 

$ go mod tidy

git clone でプログラミングを取得し、
go mod tidy コマンドでgo modファイルのモジュールをインストールします。

httpルータにはechoというフレームワークを使用しています。
Golang Ethereumクライアントにはgo-ethereumを使用します。

Ganacheのインストール

Ganacheまたはganache-cli、あなたのローカルマシン上で動作するブロックチェーンネットワーク。

$ sudo npm install -g ganache ganache-cli

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

githubボタン

コードはGithubに格納しています。

solidityの作成

SmartContractStartと呼ばれるこのシンプルなスマートコントラクトには、pureキーワードで示される2つのこの関数内でしか使えないfunctionが含まれています。

solidityをGo言語へコンパイル

$ solc --optimize --abi ./solidities/smart_contract_start.sol -o build
$ 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

コントラクトアドレス取得

プライベートキーの変換コード

コントラクトアドレス取得コマンド

$ cd cmd
$ go run create_contract_address.go
$ cd ../

Ganacheを起動

$ ganache-cli

上記のコマンドを実行すると以下のような結果が出力されます。(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作成

プログラミング起動コマンドはこちら

go run main.go

無事起動すれば以下の4つのアクションを起こすとGoプログラミングが実行されます。

curl -X GET "http://localhost:1323/hello"
curl -X GET "http://localhost:1323/greet/yoshis2"
curl -X GET "http://localhost:1323/greet/greetings"
curl -X GET "http://localhost:1323/greet/randomtextforthequeryparameter"
スマートコントラクトのソースコードはこちらで公開しています

 

githubボタン

-EVM