【问题标题】:ERC-20 Token transfer problem: execution reverted: ERC20: transfer from the zero addressERC-20 代币转移问题:执行还原:ERC20:从零地址转移
【发布时间】:2021-11-04 17:31:51
【问题描述】:

我最近一直在尝试学习有关智能合约的知识,但是当我尝试了解代币转移的工作原理时,我遇到了这个问题。 ||执行恢复:ERC20:从零地址转移|| (罗普斯滕网络)

代码:


import (
    "context"
    "crypto/ecdsa"
    "fmt"
    "github.com/ethereum/go-ethereum"
    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/common/hexutil"
    "github.com/ethereum/go-ethereum/core/types"
    "github.com/ethereum/go-ethereum/crypto"
    "github.com/ethereum/go-ethereum/ethclient"
    "golang.org/x/crypto/sha3"
    "log"
    "math/big"
)

func main() {

    client, err := ethclient.Dial("https://ropsten.infura.io/v3")
    if err != nil {
        panic(err)
    }

    chainID, _ := client.NetworkID(context.Background())

    privateKey, err := crypto.HexToECDSA("280a5fb7d2eef8c7956f4e6754c82a46f30496e43f50be4c8a457ef4e45fb1f4")
    if err != nil {
        log.Fatal(err)
    }

    publicKey := privateKey.Public()
    publicKeyECDSA, ok :=publicKey.(*ecdsa.PublicKey)
    if !ok {
        log.Fatal("cannot assert type: publicKey is not of type *ecdsa.PublicKey")
    }

    fromAddress := crypto.PubkeyToAddress(*publicKeyECDSA)
    nonce, err := client.PendingNonceAt(context.Background(), fromAddress)

    if err != nil {
        log.Fatal(err)
    }

    value := big.NewInt(0)

    toAddress := common.HexToAddress("0x0cFd37C2A1c9d0B8833fFE5a772003a350B5Be3f")

    tokenAddress := common.HexToAddress("0x4f1c3F4D89826f27204769Af1617540c219E3A62")

    transferFnSignature := []byte("transfer(address,uint256)")
    hash := sha3.NewLegacyKeccak256()
    hash.Write(transferFnSignature)

    methodID := hash.Sum(nil)[:4]
    fmt.Println(hexutil.Encode(methodID))

    paddedAddress := common.LeftPadBytes(toAddress.Bytes(),32)
    fmt.Println(hexutil.Encode(paddedAddress))

    amount := new(big.Int)
    amount.SetString("10000000000000000000", 10)
    paddedAmount := common.LeftPadBytes(amount.Bytes(), 32)
    fmt.Println(hexutil.Encode(paddedAmount))

    var data []byte
    data = append(data, methodID...)
    data = append(data, paddedAddress...)
    data = append(data, paddedAmount...)

    gasLimit, err := client.EstimateGas(context.Background(), ethereum.CallMsg{
        To: &tokenAddress,
        Data: data,
    })
    if err != nil {
        log.Fatal(err)
    }
    gasPrice, err := client.SuggestGasPrice(context.Background())
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(gasLimit)

    tx := types.NewTx(&types.LegacyTx{
        Nonce:    nonce,
        GasPrice: gasPrice,
        Gas:      gasLimit,
        To:       &tokenAddress,
        Value:    value,
        Data:     data,
        V:        nil,
        R:        nil,
        S:        nil,
    })

    signedTx, err := types.SignTx(tx, types.NewEIP155Signer(chainID),privateKey)
    if err != nil {
        log.Fatal(err)
    }

    err = client.SendTransaction(context.Background(), signedTx)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("TOKEN TX SENT! || %s ||", signedTx.Hash().Hex())


}

token 地址是我的合约地址,fromAddress 是我持有 10000 个 token 的钱包,toAddress 是普通钱包。我在这里错过了什么?

【问题讨论】:

    标签: go ethereum smartcontracts go-ethereum geth


    【解决方案1】:

    显然,问题出在gasLimit 上。我将gasLimit 更改为:

    gasLimit := uint64(200000)
    

    它成功了。

    【讨论】:

      猜你喜欢
      • 2021-08-06
      • 2020-07-24
      • 2021-09-23
      • 1970-01-01
      • 2018-07-02
      • 2021-09-17
      • 2020-09-14
      • 2022-11-13
      • 2021-05-17
      相关资源
      最近更新 更多