第2节:读写合约

小白入门:https://github.com/dukedaily/solidity-expert ,欢迎star转发,文末加V入群。

职场进阶: https://dukeweb3.com

  1. 准备合约地址
  2. 创建合约实例
  3. 读取合约
  4. 准备私钥相关数据
  5. 写合约
  6. 读合约
package main

import (
    utils "code/main/utils"
    store "code/src"
    "fmt"
    "log"

    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/ethclient"
)

func main() {
    client, err := ethclient.Dial(utils.BscTestnetRpc)
    if err != nil {
        log.Fatal(err)
    }

    // 1. 准备合约地址
    contractAddr := "0x587bf1bc96163e279d2ea1b27f3b41cc34b171c3"
    address := common.HexToAddress(contractAddr)

    // 2. 创建合约实例
    instance, err := store.NewStore(address, client)
    if err != nil {
        log.Fatal(err)
    }

    // 3. 读取合约
    version, err := instance.Version(nil)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("version:", version)

    /// 4. 构造私钥相关数据
    // address: 0xc783df8a850f42e7f7e57013759c285caa701eb6
  // Prepare代码见上一节
    auth := utils.Prepare(utils.HardhatPrivateKey, 0, client)

    // 5. 写合约
    key := [32]byte{}
    value := [32]byte{}
    copy(key[:], []byte("foo"))
    copy(value[:], []byte("bar"))

    tx, err := instance.SetItem(auth, key, value)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("tx sent: %s\n", tx.Hash().Hex())

    // 6. 再次读取合约
    result, err := instance.Items(nil, key)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("result:", string(result[:]))
}

执行结果:点击查看

image-20221130144647150