Golang实现以太坊转账
程序员文章站
2022-06-06 10:14:26
...
client, err := ethclient.Dial("main")//support etherscan infura if err != nil { log.Fatal(err) } log.Println(client) privateKey, err := crypto.HexToECDSA("private key") if err != nil { log.Fatal(err) } log.Println("privatekey", privateKey) // publicKey := privateKey.Public() publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey) if !ok { log.Fatal("error casting public key to ECDSA") } log.Println("publicKeyECDSA ", publicKeyECDSA) fromAddress := crypto.PubkeyToAddress(*publicKeyECDSA) nonce, err := client.PendingNonceAt(context.Background(), fromAddress) if err != nil { log.Fatal(err) } log.Println("fromaddress ", fromAddress) log.Println("nonce", nonce) // value := big.NewInt(0) // in wei (0 eth) gasPrice, err := client.SuggestGasPrice(context.Background()) if err != nil { log.Fatal(err) } // toAddress := common.HexToAddress("to address") tokenAddress := common.HexToAddress("contract address") // transferFnSignature := []byte("transfer(address,uint256)") hash := sha3.NewKeccak256() hash.Write(transferFnSignature) methodID := hash.Sum(nil)[:4] fmt.Printf("Method ID: %s\n", hexutil.Encode(methodID)) // paddedAddress := common.LeftPadBytes(toAddress.Bytes(), 32) fmt.Printf("To address: %s\n", hexutil.Encode(paddedAddress)) // amount := new(big.Int) amount.SetString("10000000", 10) // 1000 tokens paddedAmount := common.LeftPadBytes(amount.Bytes(), 32) fmt.Printf("Token amount: %s", 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: &toAddress, Data: data, }) if err != nil { log.Fatal(err) } fmt.Printf("Gas limit: %d", gasLimit) tx := types.NewTransaction(nonce, tokenAddress, value, gasLimit*2, gasPrice, data) signedTx, err := types.SignTx(tx, types.HomesteadSigner{}, privateKey) if err != nil { log.Fatal(err) } err = client.SendTransaction(context.Background(), signedTx) if err != nil { log.Fatal(err) } fmt.Printf("Tokens sent at TX: %s", signedTx.Hash().Hex()) }
- 使用infura作为以太坊节点
- gaslimit太小容易out of gas
- etherscan上查看transaction
上一篇: CC&B核心模块——Batch(批服务)
下一篇: Rust的MVC的微服务