主页 > imtoken中文版app > Go语言如何发送以太坊代币

Go语言如何发送以太坊代币

imtoken中文版app 2023-01-16 23:20:14

在本文中以太坊钱包快速发币,您将学习如何将 ETH 从一个账户转移到另一个账户。 如果您已经熟悉以太坊,您就会知道交易包括您发送的以太币数量、gas limit、gas price、nonce、接收地址和可选数据。 交易必须先用发送方的私钥签名,然后才能广播到网络。

假设您已经连接了客户端,下一步就是加载您的私钥。

```

私钥,错误:= crypto.HexToECDSA(“fad9c8855b740a0b7ed4c221dbad0f33a83a49cad6b3fe8d5817ac83d38b6a19”)

如果错误!=无{

日志。 致命(错误)

}

```

之后我们需要获取账户 `nonce`。 每笔交易都需要一个“nonce”。 根据定义,`nonce` 是只使用一次的数字。 如果是发送交易的新帐户,则 `nonce` 将为 0。来自帐户的每个新交易的 nonce 必须从前一个 nonce 递增 1。 很难手动跟踪所有随机数,因此以太坊客户端提供了一个辅助方法 `PendingNonceAt`,它将返回您应该使用的下一个随机数。

该函数需要我们发送的帐户的公共地址,我们可以从私钥中获取。

```

公钥 := 私钥。 上市()

publicKeyECDSA,好的:= publicKey。(* ecdsa.PublicKey)

如果!好{

log.Fatal("无法断言类型:publicKey 不是 *ecdsa.PublicKey")

}

从地址 := crypto.PubkeyToAddress(*publicKeyECDSA)

```

在这里,`privateKey.Public()` 返回包含我们公钥的接口。 我们使用 `publicKey`。 `()` 执行类型断言以显式设置 `publicKey` 变量的类型并将其分配给 `publicKeyECDSA`。 这允许我们在程序需要类型为“*ecdsa.PublicKey”的输入的地方使用它。

现在我们可以读取我们应该用于账户交易的随机数。

```

nonce,err := client.PendingNonceAt(context.Background(), fromAddress)

如果错误!=无{

日志。 致命(错误)

}

```

下一步是设置我们将转移的 ETH 数量。 但是我们必须将以太币转换为 wei,因为这是以太坊区块链使用的。 以太坊最多支持 18 位小数以太坊钱包快速发币,因此 1 ETH 是 1 加 18 个零。 这里有一个小工具可以帮助您在 ETH 和 wei 之间进行转换:[]()

```

value := big.NewInt(1000000000000000000) // 在 wei (1 eth)

```

标准 ETH 转账的气体限制为“21000”单位。

```

gasLimit := uint64(21000) // 单位

```

gas 价格必须以 wei 为单位设置。 在撰写本文时,将很快包含在一个区块中的交易的天然气价格为 30gwei。

```

gasPrice := 大。 NewInt(30000000000) // 单位为 wei (30 gwei)

```

然而,gas 价格总是根据市场需求和用户愿意支付的价格波动,因此硬编码 gas 价格有时并不理想。 go-ethereum 客户端提供了 `SuggestGasPrice` 函数来获取基于 x 个先前区块的平均 gas 价格。

```

gasPrice, 错误:= client.SuggestGasPrice(context.Background())

如果错误!=无{

日志。 致命(错误)

}

```

我们弄清楚我们将 ETH 发送给谁。

```

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

```

现在我们可以通过导入 `go-ethereum core/types` 包并调用 `NewTransaction` 来生成我们未签名的以太坊交易,它接收随机数、地址、价值、gas limit、gas price 和可选数据。 仅发送数据字段为零的 ETH。 我们将在与智能合约交互时使用数据字段。

```

tx := 类型。 NewTransaction(nonce, toAddress, value, gasLimit, gasPrice, nil)

```

下一步是使用发送方的私钥签署交易。 为此,我们调用 `SignTx` 方法,该方法接受未签名的交易和我们之前构建的私钥。 `SignTx` 方法需要 EIP155 签名者,我们从客户端获取链 ID。

```

chainID, 错误 := client.NetworkID(context.Background())

如果错误!=无{

日志。 致命(错误)

}

signedTx, 错误:= types.SignTx(tx, types.NewEIP155Signer(chainID), privateKey)

如果错误!=无{

日志。 致命(错误)

}

```

现在,我们终于准备好通过在接收签名交易的客户端上调用 `SendTransaction` 将交易广播到整个网络。

```

err = client.SendTransaction(context.Background(), signedTx)

如果错误!=无{

日志。 致命(错误)

}

fmt.Printf("tx sent: %s", signedTx.Hash().Hex()) // tx 发送:0x77006fcb3938f648e2cc65bafd27dec30b9bfbe9df41f78498b9c8b7322a249e

```

之后,您可以在区块浏览器上查看进度,例如 []()

### 完整代码

**transfer_eth.go**

```

包主

进口 (

“语境”

“加密/ecdsa”

“调频”

“日志”

“数学/大”

“github.com/ethereum/go-ethereum/common”

“github.com/ethereum/go-ethereum/core/types”

“github.com/ethereum/go-ethereum/crypto”

“github.com/ethereum/go-ethereum/ethclient”

)

功能主要(){

客户端,错误:= ethclient.Dial(“https://rinkeby.infura.io”)

如果错误!=无{

日志。 致命(错误)

}

私钥,错误:= crypto.HexToECDSA(“fad9c8855b740a0b7ed4c221dbad0f33a83a49cad6b3fe8d5817ac83d38b6a19”)

如果错误!=无{

日志。 致命(错误)

}

公钥 := 私钥。 上市()

publicKeyECDSA,好的:= publicKey。(* ecdsa.PublicKey)

如果!好{

log.Fatal("无法断言类型:publicKey 不是 *ecdsa.PublicKey")

}

从地址 := crypto.PubkeyToAddress(*publicKeyECDSA)

nonce,err := client.PendingNonceAt(context.Background(), fromAddress)

如果错误!=无{

日志。 致命(错误)

}

value := big.NewInt(1000000000000000000) // 在 wei (1 eth)

gasLimit := uint64(21000) // 单位

gasPrice, 错误:= client.SuggestGasPrice(context.Background())

如果错误!=无{

日志。 致命(错误)

}

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

变量数据[]字节

tx := 类型。 NewTransaction(nonce, toAddress, value, gasLimit, gasPrice, data)

chainID, 错误 := client.NetworkID(context.Background())

如果错误!=无{

日志。 致命(错误)

}

signedTx, 错误:= types.SignTx(tx, types.NewEIP155Signer(chainID), privateKey)

如果错误!=无{

日志。 致命(错误)

}

err = client.SendTransaction(context.Background(), signedTx)

如果错误!=无{

日志。 致命(错误)

}

fmt.Printf("交易已发送:%s", signedTx.Hash().Hex())

}

```

================================================ == =====================

分享一些与比特币、以太坊、EOS、Fabric等区块链相关的交互式在线编程实战教程:

> - 【java比特币开发教程】(),本课程面向初学者,涵盖了比特币的核心概念,如区块链存储、去中心化共识机制、密钥和脚本、交易和UTXO等,并详细讲解了如何在Java代码中集成比特币支持功能,如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习教程。

> - 【php比特币开发教程】(),本课程面向初学者,涵盖了比特币的核心概念,如区块链存储、去中心化共识机制、密钥和脚本、交易和UTXO等,并详细讲解了如何在Php代码中集成比特币支持功能,如创建地址、管理钱包、构建裸交易等,是Php工程师不可多得的比特币开发学习教程。

> - [c#Bitcoin Development Tutorial](),本课程面向初学者,涵盖了比特币的核心概念,如区块链存储、去中心化共识机制、密钥和脚本、交易和UTXO等,并详细讲解了如何在C#代码中集成比特币支持功能,如创建地址、管理钱包、构建裸交易等,是C#工程师不可多得的比特币开发学习教程。

> - [java以太坊开发教程](),主要面向java和android程序员开发用于区块链以太坊开发的web3j。

> - [python Ethereum](),主要供python工程师使用web3.py详细开发区块链以太坊。

> - [phpEthereum](),主要介绍使用php进行智能合约开发交互、账户创建、交易、转账、代币开发、过滤和交易等。

> - 【以太坊入门教程】(),主要介绍智能合约和dapp应用开发,适合入门。

> - 【以太坊开发进阶教程】(),主要介绍使用node.js、mongodb、blockchain、ipfs实现去中心化电商DApp实战,适合进阶。

> - 【ERC721以太坊通证实战】(),课程着重于一个数字艺术品创作分享DApp的实际开发,深入讲解以太坊非同质化通证的概念、标准和发展规划。 内容包括独立实现ERC-721标准,讲解OpenZeppelin合约代码库的二次开发,以及使用Truffle、IPFS的实际项目,实现通证和去中心化通证交换。

> - [C#Ethereum](),主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器与交易等。

> - 【EOS入门教程】(),本课程帮助您快速上手EOS区块链上的去中心化应用开发,涵盖EOS工具链、账户和钱包、发行代币、智能合约开发和部署、使用代码和Smart合约交互等核心知识点,最终利用每个知识点完成一个笔记DApp的开发。

> - 【轻松玩转EOS钱包开发】(),本课程以手机端EOS钱包完整开发流程为主线,深入学习EOS区块链应用开发,课程内容涵盖账户、计算资源、智能contracts, actions 和 transactions 等EOS区块链的核心概念,也讲解了如何使用eosjs和eosjs-ecc开发包接入EOS区块链,以及如何在React前端集成对EOS区块链的支持应用。 课程内容简单易懂,非常适合前端工程师深入学习EOS区块链应用开发。

> - 【Hyperledger Fabric区块链开发详解】(),本课程面向初学者。 Fabric网络设计、nodejs链码和应用开发的操作实践,是Nodejs工程师学习Fabric区块链开发的最佳选择。

> - 【Hyperledger Fabric Java区块链开发详解】(),课程面向初学者。 Fabric网络设计、java链码和应用开发的操作实践是java工程师学习Fabric区块链开发的最佳选择。

> - 【tendermint区块链开发详解】(),本课程适合想使用tendermint进行区块链开发的工程师。 课程内容包括tendermint应用开发模型中的核心概念,如ABCI接口、Merkle树、多版本状态库等,以及丰富的代币发行等实用代码,是go语言工程师的最佳选择快速开始区块链开发。