用golang可以开发程序和以太坊智能合约进行交互,只是需要一些额外的步骤。
首先需要智能合约源码,其次需要abigen这个程序,这个程序可以通过编译go-ethereum程序得到。
在windows下通过把go-ethereum源码下载下来,然后在源码目录执行下面命令:
go install -v ./cmd/...
执行abigen命令把智能合约代码转义成我们需要的golang代码,命令如下
abigen --sol YLCoin.sol --out token.go --pkg smartcontract
执行上面的命令的时候发现需要solc程序,这是solidity的编译程序,可以从github上直接下载二进制可执行程序。网址如下:
但是需要注意的是,你的智能合约源代码注明了使用的solidity编译器版本,这里也要下载相应的solidity编译器版本。
最后大功告成后可以看到token.go生成的golang源码。
怎么使用呢?下面是我测试的一段代码:
conn, err := ethclient.Dial("https://mainnet.infura.io/v3/bf6080070ebc4e0db122acad03adb92d")
if err != nil {
log.Fatalf("Failed to connect to the Ethereum client: %v", err)
}
token, err := smartcontract.NewYouLingCoin(common.HexToAddress("0xB54cA24AC19098dB42454c8ee8Df67d260A22b1e"), conn)
if err != nil {
log.Fatalf("Failed to instantiate a Token contract: %v", err)
}
contractName, err := token.Name(nil)
if err != nil {
log.Fatalf("query name err:%v", err)
}
fmt.Printf("MyToken Name is:%s\n", contractName)
balance, err := token.BalanceOf(nil, common.HexToAddress("0x9fafe0549e4ae08ac7fd2b7c1fae1fbc341aaa3d"))
if err != nil {
log.Fatalf("query balance error:%v", err)
}
fmt.Printf("0x9fafe0549e4ae08ac7fd2b7c1fae1fbc341aaa3d's balance is %s\n", balance)
owner, err := token.Owner(nil)
if err != nil {
log.Fatalf("query owner error:%v", err)
}
fmt.Println("owner:", owner.String())
ethAmount, err := token.GetEthAmount(nil)
if err != nil {
log.Fatalf("query eth amount error:%v", err)
}
fmt.Println("eth amount:", ethAmount.String())
这里我使用了infura的以太坊rpc服务接口。
(全文完)