美文网首页
golang智能合约

golang智能合约

作者: 宋song一 | 来源:发表于2020-07-23 18:09 被阅读0次

    Go语言调用智能合约
    Windows环境下安装gcc环境,参见windows搭建gcc开发环境
    用Go来做以太坊开发③交易
    用Go来做以太坊开发④智能合约
    用Go来做以太坊开发⑤事件日志
    使用Go与以太坊智能合约交互

    一、win开发环境

    git clone https://github.com/ethereum/go-ethereum.git
    找到包的安装路径:github.com/ethereum/go-ethereum/cmd/abigen
    go build -i 生成 abigen.exe
    使用abigen将abi翻译成go(最好先将abigen.exe拷贝到$PATH的某个路径下)
    abigen --abi xx.abi --pkg pkgname --type apiname --out xx.go

    二、合并合约

    https://github.com/BlockCatIO/solidity-flattener
    https://github.com/coburncoburn/SolidityFlattery.
    etherscan上验证合约步骤

    $ git clone https://github.com/coburncoburn/SolidityFlattery.git
    $ cd SolidityFlattery
    $ go get gopkg.in/natefinch/lumberjack.v2
    $ go build flat.go utils.go
    $ go install flat.go utils.go
    

    $ flat --input TPToken.sol --output verify
    过程中可以看到只需要输入TPToken.sol,flat就会自动寻找其依赖的合约。
    其中verify为输出文件的名字,可以根据自己习惯设置。
    输出文件有两个; verify.log, verify.sol,其中verify.sol就是合并好的用来在etherscan上验证的合约

    三、go合约调用

    1. 连接eth节点
    import(
    "github.com/ethereum/go-ethereum/ethclient"
     store "exch/contracts" 
    )
    //ethclient连接
    client, err := ethclient.Dial("https://jsonrpc.medishares.net")
        if err != nil {
            fmt.Println("Failed to Dial ", err)
            return
        }
    defer client.Close()
    

    四、订阅事件日志

    import (
        "context"
        "fmt"
        "log"
        "github.com/ethereum/go-ethereum"
        "github.com/ethereum/go-ethereum/common"
        "github.com/ethereum/go-ethereum/core/types"
        "github.com/ethereum/go-ethereum/ethclient")func main() {
        client, err := ethclient.Dial("wss://rinkeby.infura.io/ws")
        if err != nil {
            log.Fatal(err)
        }
        contractAddress := common.HexToAddress("0x147B8eb97fD247D06C4006D269c90C1908Fb5D54")
        query := ethereum.FilterQuery{
            Addresses: []common.Address{contractAddress},
        }
        logs := make(chan types.Log)
        sub, err := client.SubscribeFilterLogs(context.Background(), query, logs)
        if err != nil {
            log.Fatal(err)
        }
        for {
            select {
            case err := <-sub.Err():
                log.Fatal(err)
            case vLog := <-logs:
                fmt.Println(vLog) // pointer to event log
            }
        }}
    

    相关文章

      网友评论

          本文标题:golang智能合约

          本文链接:https://www.haomeiwen.com/subject/wgyhlktx.html