学习web3的第二天

今天就学习下写以太坊合约,并且部署到以太坊网络上,再创建一个读合约的go版本的api server。

使用到的技术如下

  • go
  • ethereum
  • solidity
  • ganache-cli

预备:软件安装

1 安装golang

brew install golang

2 安装ethereum

follow official site geth

主要作用,提供一些命令行,如 apigen ,生成合约的go代码

3 安装solidity

follow official site soliditylang

主要作用,提供solidity 的命令行,如 solc

4 安装ganache-cli

brew install ganache-cli

主要作用,提供一个本地的节点,用来测试合约的功能

写合约主要源代码-solidity 代码

1 写合约的solidity代码

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;

contract MySmartContract {
    function Hello() public view returns (string memory) {
        return "Hello World";
    }
    function Greet(string memory str) public view returns (string memory) {
        return str;
    }
}

解释:首先是一个无参数的方法,Hello,一个是有参数的方法,Greet。

2 根据合约生成go代码

solc --optimize --abi ./contracts/MySmartContract.sol -o build
solc --optimize --bin ./contracts/MySmartContract.sol -o build
abigen --bin=./build/MySmartContract.bin --abi=./build/MySmartContract.abi --pkg=api --out=./api/MySmartContract.go

解释:solc 命令,将solidity代码转换成二进制文件,并且生成abi文件,apigen 生成go相关的代码,并且生成到api目录下。供后续deploy和client使用

3 写go的部署合约代码

// 此处连接的是你本地的节点,也就是ganache-cli提供的,需要注意换成你自己的
client, err := ethclient.Dial("http://127.0.0.1:8545")
...
// 此处的私钥,换成ganache-cli 提供的,并且去掉开头的 0x 
privateKey, err := crypto.HexToECDSA("be1b85896f93f5d18fe2cf28b81daecbf790e33bdd96fb52a056d669b0c93cde")
...
// 部署代码到本地的以太坊网络上
address, tx, instance, err := api.DeployApi(auth, client)

4 写go的读合约代码

// 这里的address是你部署的合约地址,也就是部署完成后,会提供你一个合约地址
conn, err := api.NewApi(common.HexToAddress("351dd6679c502b41c221ab749666d4ca6c6b8f5d"), client)

// 调用合约的方法使用
e.GET("/greet/:message", func(c echo.Context) error {
    message := c.Param("message")
    reply, err := conn.Greet(&bind.CallOpts{}, message)
    if err != nil {
        return err
    }
    return c.JSON(http.StatusOK, reply)
})

部署合约,与之进行交互

1 开启一个ganache-cli节点

一行命令即可

ganache-cli 

会给你自动生成一些账户,私钥公钥。

2 部署合约

成功之后,会给你一个合约地址,可以用来调用合约的方法,也就是client所需要用到的

0x351DD6679C502xxxxx21aB749666d4Ca6C6b8f5D

3 调用合约的方法

curl http://localhost:1323/greet/hello
curl http://localhost:1323/hello

成功!!!

参考文章

Creating a simple Ethereum Smart Contract in Golang

本文源代码

solidity-contract-go-demo