主页 > 老版本imtoken > 在以太坊上部署智能合约和管理交易

在以太坊上部署智能合约和管理交易

老版本imtoken 2023-03-25 06:34:15

在以太坊上构建去中心化应用程序,如何向网络发送交易、签名和广播。

要在以太坊上构建去中心化应用程序,您需要知道如何发送交易、签署交易并将其广播到网络。 交易允许您转移以太币、部署您自己的合约以及与其他智能合约交互。 在本教程中,我们将向您展示如何自信地进行这些操作,并介绍一些有助于简化您的开发工作流程的相关代码库和命令。

创建以太坊交易

交易是改变区块链状态的操作。 发送以太币、代币以及在智能合约中创建或使用函数都是交易。 如果您不熟悉以太坊交易以太坊创建智能合约的交易,请查看这些对账户、合约和以太坊交易类型的有用介绍。

在本文的代码库中,您还会找到一系列脚本,向您展示如何使用两个最常用的 Javascript 库与以太坊交互:web3.js 和 ethers.js。 有关 web3.js 与 ethers.js 比较的更多信息,请参阅我们的技术指南,其中详细介绍了两者之间的异同。

该过程的第一步是创建交易负载。 它的作用是表达你希望执行的操作类型以及你愿意为执行该操作支付多少费用(gas 费)。 让我们看看这些属性:

来自:20字节

至:20 字节

价值:数量

气体:数量

天然气价格:数量

数据:数据

随机数:数字

siteblockvalue.com 以太坊智能合约开发_sitejinse.com 以太坊智能合约开发_以太坊创建智能合约的交易

作为 dapp 开发人员,您可以依靠 Web3 实用程序库来为您填写大部分这些细节。 下面将更详细地解释如何根据您需要执行的操作类型来设计这些事务。

签署交易

生成交易后,您需要对其进行签名才能被以太坊网络接受。 签名有两个目的:1)证明交易确实来自您的账户,以及 2)授权网络从您的账户中扣除交易 gas 费。

有几种方法可以签署以太坊交易以太坊创建智能合约的交易,包括:

下面提供了一些不同方法的示例:

在大多数情况下,诸如 ethers.js 或 web3.js 之类的 Web3 实用程序库通常会获取生成并签署它的交易,序列化交易,然后通过 将其发送到节点。

如果您选择使用以太坊节点的内置签名功能,该库将使用另一个 RPC 调用 — ,以纯文本形式将未签名的交易详细信息发送到该节点。 Infura 不支持这种交互模式,所以如果你想使用这种方式,你目前需要有自己的托管节点。 需要注意的是,由于此功能需要节点存储私钥并将 RPC 暴露给网络,因此被认为是一种不安全的做法。 未经授权访问节点可能会泄露您的私钥,使攻击者能够代表您(节点)签署交易。 如果您运行自己的节点,Hyperledger Besu 会提供一个非常有用的代理服务——EthSigner——它可以帮助您签署交易、将您的密钥安全地存储在单独的文件或密钥库中,以及实施方法。 Ethsigner 可以与任何以太坊客户端一起使用,并且还支持 Infura。 您需要为 Ethsigner 配置一个签名者或多个签名者才能进行交易。

使用 Infura 发送以太坊交易

交易签署后,需要将其广播到以太坊网络,以便其他节点可以看到它,矿工可以将其添加到区块链中。

Infura 提供了标准的 eth_sendRawTransaction RPC 方法。 图书馆通常在后台使用此方法广播交易,因此您无需手动调用 RPC 方法。

在某个时候,以太坊矿工将获得交易的副本,在新区块中完成该交易的工作证明,并将该区块连同工作证明一起广播到整个网络。 每个接收到区块的节点将重新执行其中包含的交易并更新以太坊虚拟机 (EVM)* 的状态。

注意:哪些矿工接收哪些交易、矿工如何选择他们以及矿工在完成一个区块后如何向网络广播他们的工作量证明的问题是复杂的。 为了简单起见,我们不会在本教程中深入讨论它。

sitejinse.com 以太坊智能合约开发_siteblockvalue.com 以太坊智能合约开发_以太坊创建智能合约的交易

以太坊转账

以太币转账是最简单的交易形式,因为它是 EVM 原生指令,不需要使用智能合约。 我们只需要指定目的地址、Gas price 和要发送的以太币的价值(面值是 wei,1 wei = 1e^18 ether)。 然后对交易进行签名,为其分配随机数值和签名。

示例:通过简单交易签署并发送以太币

先决条件:确保您已安装 Node.js 12+ 并具有可用的 Infura 项目 ID。 复制该存储库并运行:

cd demo-eth-tx/
npm install
# 在下面添加Infura 项目 ID 
echo 'INFURA_PROJECT_ID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' > .env

此脚本用于使用 ethers.js 库在两个帐户之间发送少量以太币。 运行它并等待矿工挖掘交易:

node ethers/send.js

相同的脚本,使用 web3.js 库。 跑步:

node web3/send.js

siteblockvalue.com 以太坊智能合约开发_sitejinse.com 以太坊智能合约开发_以太坊创建智能合约的交易

智能合约的编译和部署

合约部署是另一个 EVM 原生操作,看起来与以太币传输几乎相同,但在这种情况下,我们将使用数据参数而不是 to 参数。

我们为数据传递的实际参数将包含我们已部署合约的字节码。 合约的字节码可以使用 solc 编译器推导(如果使用 Solidity(首选))。

注意:当您开始构建自己的智能合约时,您可能需要使用开发工具包,例如 Truffle、Buidler 或 Remix。 这些工具将简化您的工作,因为您不需要手动编译智能合约代码。

示例:使用智能合约

现在让我们来看看编写、部署智能合约并与之交互的必要步骤。

让我们从一个简单的合约 (Demo.sol) 开始:

contract Demo {
    event Echo(string message);
    function echo(string calldata message) external {
        emit Echo(message);

以太坊创建智能合约的交易_sitejinse.com 以太坊智能合约开发_siteblockvalue.com 以太坊智能合约开发

} }

合约有一个函数(名为 echo),任何人都可以调用消息。 它将触发一个返回传入消息的事件。

合同编制

在将合约部署到网络之前,我们需要先编译合约。 为此,此处包含一个简单的 compile.js 脚本:

node compile.js

合约编译完成后,主目录下会出现一个Demo.json文件。 该文件包括合约字节码(部署时必须使用)和合约交互所需的应用程序二进制接口(ABI)。

合同部署

下面的部署脚本适用于 ethers.js 和 web3.js。 运行这些脚本中的任何一个都会部署合约:

node ethers/deploy.js
# 或
node web3/deploy.js

siteblockvalue.com 以太坊智能合约开发_sitejinse.com 以太坊智能合约开发_以太坊创建智能合约的交易

部署合约后,您将收到交易哈希。 您可以使用区块浏览器或 getTransaction() 和 eth.getTransactionReceipt() 进行检查。 矿工挖出部署交易后,脚本会输出新合约的地址。

契约互动

部署合约后,您可以与合约进行交互。 您需要通过将合约地址传递给 to 参数来执行交易,并传递一些数据告诉合约如何执行数据参数。

Web3 实用程序库为您提供了用于签署合同的高级接口,并为您生成数据参数。

下面简要解释这些库背后的操作:数据字段的第一部分与被调用的合约方法相关联。 我们可以通过获取函数名称哈希的前 4 个字节及其括号内的参数类型(删除所有空格)来计算函数选择器。 例如,字符串 transfer(address,uint256) 可以散列为 4 字节函数签名 0xa9059cbb。 函数签名与 RLP 编码的函数参数(在本例中为地址和代币编号)连接在一起,形成交易数据字段。 有关合约 ABI 规范和参数编码工作的更多信息,请参阅 Solidity ABI 规范。

以下合约交互脚本适用于 ethers.js 和 web3.js。 这些脚本配置为与现有合约交互,但您可以编辑 ethers/call.js 或 web3/call.js 并将其替换为已部署合约的地址。

您现在可以运行:

node ethers/call.js
# or
node web3/call.js

恭喜! 您已经部署了以太坊智能合约并与之交互。 您现在可以继续构建一些很棒的内容!

Infura 为开发人员提供了对以太坊和 IPFS 网络的快速可靠访问。 我们提供免费的核心服务以及开发人员构建去中心化应用程序所需的所有工具和资源。

衷心感谢 Lucian Boca 为本指南的开发做出的广泛贡献。 更多 Web3 教程。

本文参与登联社区写作激励计划,好文章好收益,欢迎正在阅读的你加入。