前言

剩下来的内容并不难,很简单,遇到的坑也是上一个文章有的。


Eth代币转账

    // 使用教程的测试网 https://goethereumbook.org/zh/transfer-tokens/
    client, _ := ethclient.Dial("https://rinkeby.infura.io")
    // 因为代币,以太坊交易值改为0 https://tokenfactory.surge.sh
    EthValue := big.NewInt(0)
    // 使用文章地址,防止出现其他问题
    toAddress := common.HexToAddress("0x4592d8f8d7b001e72cb26a73e4fa1806a51ac79d")
    // 代币合约地址
    tokenAddress := common.HexToAddress("0x28b149020d2152179873ec60bed6bf7cd705775d")
    // 函数方法切片传递
    transferFnSignature := []byte("transfer(address,uint256)")
    // 生成签名hash
    hash := sha3.New384()
    hash.Write(transferFnSignature)
    // 切片
    methID := hash.Sum(nil)[:4]
    // 填充地址
    paddedAddress := common.LeftPadBytes(toAddress.Bytes(), 32)
    // 发送代币数目
    Number := new(big.Int)
    Number.SetString("1000000000000000000000", 10)
    // 代币量填充
    var data []byte
    data = append(data, methID...)
    data = append(data, paddedAddress...)
    data = append(data, common.LeftPadBytes(Number.Bytes(), 32)...)

    // 使用方法估算燃气费
    gasLime, _ := client.EstimateGas(context.Background(), ethereum.CallMsg{
        To:   &toAddress,
        Data: data,
    })
    logrus.Info("Ethereum GasLime:", gasLime)
    // 进行交易事务
    tx := types.NewTx(&types.LegacyTx{
        Nonce:    246,
        GasPrice: EthValue,
        Gas:      gasLime,
        To:       &tokenAddress,
        Value:    EthValue,
        Data:     make([]byte, 0),
    })
    // 这里的转账和eth的转账一样,就不多说了
    logrus.Info(tx)

值得注意的是:

你因为是代币转账,相当于将一个代币转移。

而代币地址可以看作是另外一个钱包,所以与前面的eth转账差别并不大。

监听新区块

    // 这个地址原本免费,现在需要注册获取token,请自己更改
    client, _ := ethclient.Dial("wss://eth-mainnet.ws.alchemyapi.io/ws/")
    // 创建通道
    heads := make(chan *types.Header)
    // 订阅返回的对象
    sub, _ := client.SubscribeNewHead(context.Background(), heads)
    // 循环监听
    for {
        select {
        case err := <-sub.Err():
            // 监听区块失败的信息
            logrus.Error("SubScribe Block Error:", err)
        case Heads := <-heads:
            logrus.Info("Heads Address:", Heads.Hash().Hex())
            // 监听区块头信息
            block, _ := client.BlockByHash(context.Background(), Heads.Hash())
            logrus.Info("Block Address:", block.Hash().String())
        }
    }

要注意:ws监控地址已经更换了,而且需要在ethereum官网申请api才可以使用

ethereum的Ws订阅操作


发送裸交易

    // 这个原始url也需要最新的了
    client, _ := ethclient.Dial("https://rinkeby.infura.io")
    // 构建原始交易(裸交易)和之前的eth货币交易差不多,就不管了。
    rawTx := "f86d8202b28477359400825208944592d8f8d7b001e72cb26a73e4fa1806a51ac79d880de0b6b3a7640000802ca05924bde7ef10aa88db9c66dd4f5fb16b46dff2319b9968be983118b57bb50562a001b24b31010004f13d9a26b320845257a6cfc2bf819a3d55e3fc86263c5f0772"
    RawTX, _ := hex.DecodeString(rawTx)
    // 构建原始事务
    tx := new(types.Transaction)
    rlp.DecodeBytes(RawTX, &tx)
    // 广播说一哈
    if err := client.SendTransaction(context.Background(), tx); err != nil {
        logrus.Error("SendTransaction Error:", err)
        return
    }

    logrus.Info(tx.Hash().Hex())
最后修改:2023 年 03 月 26 日
如果觉得我的文章对你有用,请随意赞赏