用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服务接口。

(全文完)