如何使用 Hardhat 和 Tenderly 部署多重签名钱包

  • tenderly
  • 发布于 2023-01-27 16:18
  • 阅读 36

本文介绍了多重签名钱包的概念、工作原理,并提供了一个使用 Hardhat 和 Tenderly 部署以太坊多重签名钱包的详细教程。教程涵盖了从设置开发环境、部署智能合约、到在 Tenderly Fork 上测试和在 Sepolia 测试网上执行交易的完整流程,旨在帮助读者理解和应用多重签名技术。

如何使用 Hardhat 和 Tenderly 部署以太坊多重签名钱包

了解什么是多重签名钱包以及它的工作原理。然后,按照循序渐进的教程学习如何使用 Hardhat 和 Tenderly 构建和部署多重签名钱包。

如何创建多重签名智能合约

在本教程中,你将学习如何创建和使用多重签名(multisig)钱包。多重签名钱包提供额外的安全性,并能更好地控制你的资产,因为必须有两个人或更多人同意才能执行交易。它实际上是一个智能合约,只有在多个参与方同意并签署执行后才会执行交易。

前提条件:对于本教程,你应该安装好你的 MetaMask 钱包,熟悉通过 Hardhat 部署合约,并且已经设置好 Tenderly 账户。如果你没有 Tenderly 账户,只需点击几下即可免费设置

但在开始之前,让我们先多了解一些关于多重签名钱包的知识,然后再进入实际操作部分。如果你已经熟悉这个概念,请随意跳过本节。

什么是多重签名钱包?

标准的加密货币钱包存储一个私钥和一个公钥,用于签署和验证加密货币交易。而多重签名钱包则需要两个或更多个私钥才能访问、签署和发送交易。

当多个参与方定期访问钱包时,这尤其有益,因此你希望建立对交易执行的更大控制权。这样,相关参与方需要在执行交易之前确保达成一致。

特别是,诸如 DAO 之类的组织可以从此类钱包中受益。多重签名钱包使 DAO 能够实施民主投票机制,并防止执行未经授权的交易或提案。例如,可能需要 DAO 利益相关者获得五分之三的投票才能执行交易。

多重签名钱包如何工作?

以最简单的形式,多重签名钱包是一个智能合约,其中包含所有者账户列表和所需的确认数。你可以在创建合约时定义这两个要素。当且仅当所需数量的所有者同意交易时,所有者才能提交、批准和执行交易。

以太坊上的多重签名钱包多重签名钱包的工作原理

以下是多重签名钱包更详细的工作原理:

  • 任何多重签名所有者都可以提交交易以供批准。多重签名钱包存储待批准的交易。
  • 所有者可以通过发送交易确认来批准交易,这些确认由智能合约跟踪。换句话说,多个所有者签署交易,因此得名多重签名。
  • 如果为特定交易提交了所需数量的确认,则所有者已达成协议,并且其中一位所有者可以执行交易
  • 尝试执行确认数量不足的交易会导致错误。

例如,一个 4/4 钱包由四个人共享,需要所有四个签名才能签署交易。或者,一个 2/3 多重签名钱包由三个人共享,需要两个交易确认。

既然你已经熟悉了多重签名钱包的基本概念,接下来让我们深入了解它们的代码以及构建、部署和使用一个钱包所需的步骤。

1. 熟悉 Tenderly Web3 Gateway

Tenderly Web3 Gateway 允许你快速轻松地发送交易或使用 RPC URL 查询区块链。我们将使用它来部署多重签名智能合约。因此,一旦你登录或设置好你的 Tenderly 账户,请导航至 Web3 Gateway 页面。

在本教程中,我们将使用 Sepolia 测试网,但如果你愿意,也可以使用其他测试网。

在 Web3 Gateway 页面上,在支持的网络列表中找到 Sepolia RPC URL 并复制它。

Tenderly Web3 Gateway 中支持的网络

ℹ️ 注意:请确保不要与任何人分享 URL,因为它包含你的安全访问Token。但如果你暴露了Token也不用担心。只需转到访问控制部分即可重置它。

重置 Tenderly Web3 Gateway 的访问Token

2. 从水龙头获取测试 ETH

我们需要在部署智能合约或执行交易时支付 gas 费。为了避免支付真正的 ETH,我们使用 Sepolia 测试网,可以在其中以测试代币支付 gas 费。因此,让我们使用Sepolia 水龙头来获取一些测试 ETH以用于本教程。

如果你决定使用 Goerli 网络,你也可以获取 Goerli 的测试网资金

3. 使用示例 Hardhat 项目

我们包含了一个示例项目,演示了如何使用 Tenderly Fork 作为开发和测试网络来部署和测试多重签名钱包。使用此示例 Github 存储库来继续操作。使用以下命令克隆它并进入 multisig-wallet 文件夹:


git clone git@github.com:Tenderly/tenderly-examples.git

cd multisig-wallet

3. 1. 设置环境变量

接下来,通过将 .tpl.env 模板复制到 .env 文件来设置环境变量:

cp .tpl.env .env

要配置 Hardhat 项目,你需要:

  • 使用你在步骤 1 中获得的 RPC URL 填充 .env 文件中的 SEPOLIA_RPC
  • 获取项目 slug 和用户名并填充 .env 文件中的 TENDERLY_PROJECT_SLUGTENDERLY_USERNAME
  • 获取 Tenderly 访问密钥并填充 .env 文件中的 TENDERLY_ACCESS_KEY
  • 从 MetaMask 获取你帐户的私钥,将其粘贴到 .env 文件中作为 SEPOLIA_PRIVATE_KEY_1,并取消注释 hardhat.config.ts 中的第 23 行。此私钥将用于部署多重签名合约。

ℹ️ .env 文件将保存你的敏感信息,例如 API 密钥和钱包的私钥。不用担心,它已被 git 忽略,因此它是私有的!来自 .env 的信息通过 dotenv 包提供给 hardhat.config.ts

3. 2. 安装项目依赖项

首先,安装示例项目的依赖项:

yarn

3.3. 部署智能合约

在此步骤中,你可以创建一个 JS 脚本来部署多重签名钱包,也可以使用示例 Hardhat 项目中提供的部署脚本 1-deploy-multisig.ts。请确保按照此文件中的 TODO 说明进行操作,或从头开始创建部署脚本:

touch scripts/deploy.js

现在将以下代码粘贴到你刚刚创建的文件中:

const { ethers } = require("hardhat");
require("dotenv").config();

async function main() {
  // Get the deployer wallet - this will be based on the private key we set up in config
  // 获取部署者钱包 - 这将基于我们在配置中设置的私钥
  const deployer = ethers.provider.getSigner().getAddress();

  // MultiSigWallet will be an ethers internal representation of the compiled contract
  // MultiSigWallet 将是已编译合约的 ethers 内部表示
  const MultiSigWallet = await ethers.getContractFactory(
    "MultiSigWallet",
    deployer
  );
  console.log("Deploying MultiSigWallet...");
  // This array contains the public addresses of the wallet owners.
  // These two addresses will both need to sign a transaction.
  // 此数组包含钱包所有者的公共地址。
  // 这两个地址都需要签署交易。
  const owners = [\
    "0x...", // TODO: edit here // TODO:在此处编辑\
    "0x...", // TODO: edit here // TODO:在此处编辑\
  ];

  // multisig will be the instance of our contract that we are about to deploy
  // owners is the array that contains owner addresses
  // 2 is the number of confirmations required to send a transaction
  // multisig 将是我们要部署的合约的实例
  // owners 是包含所有者地址的数组
  // 2 是发送交易所需的确认数

  const multisig = await MultiSigWallet.deploy(owners, 2);
  // We wait for the deployment to be completed and confirmed
  // 我们等待部署完成并确认

  await multisig.deployed();
  // This will tell us the address at which the contract was deployed
  // 这将告诉我们合约部署的地址
  console.log("Multi Sig Wallet deployed to:", multisig.address);
}
// Do the thing!
// 开始行动!
main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
  });

在代码中查找“TODO”注释并插入两个地址。每个地址都将“充当”多重签名钱包的所有者。

你可以简单地从你的 MetaMask 复制这些地址。如果你需要第二个地址,请转到 MetaMask 并创建一个新帐户。只需单击 MetaMask 中的右上角图标,然后单击 创建账户。现在,你就有了两个钱包地址。

请注意,我们在这里使用的是我们的公共地址,而不是我们的私钥。

在 MetaMask 中创建账户

一切就绪后,运行脚本:

npx hardhat run --network sepolia scripts/deploy.js

部署多重签名钱包

我们开始啦!🎉 你已部署并将你的多重签名合约自动添加到 Tenderly。现在转到 Tenderly 仪表板,单击左侧导航菜单中的 合约,你的合约应该在那里。

ℹ️ 此示例项目使用 hardhat-tenderly 库。它已设置为自动验证你在 Tenderly 上部署的任何合约。

多重签名智能合约在 Tenderly 合约页面上查找多重签名钱包

现在,让我们玩得开心!

3.4. 使用 MetaMask 中的测试 ETH 资助多重签名钱包

执行多重签名交易时,实际上是由多重签名钱包余额资助的。因此,在通过我们新部署的多重签名钱包发送交易之前,我们首先需要使用 Sepolia 的测试 ETH 为其提供资金。

首先,通过单击合约地址从 Tenderly 仪表板复制多重签名钱包地址。

多重签名地址复制多重签名钱包地址

接下来,打开 MetaMask,单击 发送,然后将钱包地址粘贴到 发送至 字段。出于测试目的,让我们发送 0.1 ETH。然后,单击 下一步,然后在下一个窗口中单击 确认

交易成功后,返回合约页面,单击 查看交易 按钮,你应该会看到转账。你也可以转到 Sepolia 测试网浏览器,搜索钱包地址,你将看到你的合约现在有 0.1 ETH 的余额。

在 Tenderly 仪表板中查找转账

4. 使用 Tenderly Fork 测试多重签名钱包的功能

现在我们已将资金添加到多重签名钱包,让我们对其进行测试并转移 0.1 ETH。但是,要成功地执行此操作,两个钱包所有者需要同意。以下是我们需要的多重签名批准的 0.1 ETH 转账的步骤:

  1. 创建一个交易对象,表示将 0.1 ETH 转移到任意接收者。
  2. 将转账交易提交到多重签名钱包。
  3. 让所有者 1 确认转账交易。
  4. 让所有者 2 确认转账交易。
  5. 执行已确认的转账交易。

总共,我们必须执行五次交易。但是,如果每次向测试网发送交易时,你都不必因为网络拥塞而等待,那该多好。我们理解你——等待完成一个简单的测试真的令人沮丧。即使你愿意等待,你也应该确保你的交易按计划进行,然后再花费 gas 和测试 ETH 在实际网络上执行它。

是的,我们有一个解决方案(你可能已经猜到了,但我们必须设置场景 - 不好意思)。因此,我们向你介绍替代方案 - 使用 Tenderly Fork 进行测试

为什么要在 Tenderly Fork 上测试多重签名功能

Tenderly Fork 是所选网络的轻量级模拟,在本例中为 Sepolia。你可以使用 Fork 作为你的个人开发、研究和测试环境。与测试网不同,它是私有的、完全可定制的,并且非常(非常!)快。

在 Tenderly Fork 上运行交易会显示如果将交易发送到实际网络如何展开。但是,Fork 实际上执行了一个模拟,而不是真正执行交易,这就是它如此之快的原因。因此,结果、状态更改和钱包余额的更改仅在该 Fork 中可见。

因此,我们将使用 Fork 来执行构成多重签名批准的 0.1 ETH 转账的五个交易。这样,我们就可以确保一切都按预期执行,并且我们没有浪费时间、测试 ETH 或我们的精力 😌。然后,我们将模拟交易的原始形式应用于 Sepolia,并使用 MetaMask 在 Sepolia 上运行这些交易。让我们试一试!

4.1. 创建 Tenderly Fork

现在,让我们设置 Tenderly Fork 作为测试网络。首先,转到 Tenderly 仪表板并打开左侧的 Fork 选项卡。接下来,单击 创建 Fork 按钮并填写详细信息。你在测试网上部署的多重签名钱包将对具有充值余额的 Fork 可见,因此你可以向其发送(模拟)交易。

创建一个新的 Tenderly Fork

4.2. 在 Tenderly Fork 上发送测试 ETH

让我们使用我们刚刚创建的 Tenderly Fork 来尝试多重签名场景并测试多个交易的执行。

要从多重签名钱包发送测试 ETH,你需要提交该交易。以下是所需的步骤:

  1. 从第一个下拉菜单中选择多重签名智能合约,然后从第二个下拉菜单中选择 submitTransaction
  2. 将你要将 ETH 发送到的地址粘贴到 address 字段中。让我们选择 MetaMask 上的第二个钱包/地址。
  3. value 设置为 100,000 Wei,并随意忽略此时的 bytes 字段。我们的多重签名钱包有 0.1 ETH,并且我们发送 0.0000000000001 ETH。
  4. deploy.js 文件中复制第一个所有者地址,然后将其粘贴到 From 字段中。
  5. 单击 模拟交易 以提交交易。

填写模拟参数

6. 在结果窗口中检查交易详细信息。转到 事件 选项卡以查找 txIndex 的值——我们的转账在多重签名中提交的交易数组中的索引。

检查模拟的交易详细信息

现在你已经提交了你的第一笔交易!你可以通过在另一个模拟中调用 getTransactionCount 函数来检查这一点。

检查 getTransactionCount 函数

此交易的输出应显示交易计数已增加 1。

检查交易输出

现在,让我们尝试通过运行 txIndex 为 0 的 executeTransaction 模拟来执行此交易以转移测试 ETH。此交易会成功吗?

你可能已经猜到了——它不会。你需要有正确数量的签名才能执行它,在本例中为两个。你可以尝试执行它来亲眼看看,免费的。

要获得这两个确认,你需要运行两个新的模拟:

  1. 在新模拟中,选择 confirmTransaction 函数。
  2. 将 0 放入输入参数字段 _txIndex 中,因为它是你仍在等待处理的第一个交易的索引(来自 SubmitTranscation 事件的 txIndex)。
  3. 在右侧,在 From 字段中填写第一个所有者的地址。这将模拟第一个所有者的确认。
  4. 单击 模拟

确认提交给多重签名的交易

你现在拥有转移资金所需的两个签名中的第一个签名。

你已经完成了一半!使用第二个钱包地址重复上一步,你将获得第二个签名。

获得第二个签名后,终于可以执行你提交的初始交易了。因此,再次模拟 executeTransaction 函数,就可以了。你在此模拟中将代币发送到你的第二个钱包。🎉

要确认从多重签名到你的第二个地址的转移在 Tenderly Fork 上正确发生,请查看最终交易的 状态更改 选项卡。它应该显示多重签名的余额减少,而你的第二个帐户的余额增加。

检查最终交易的状态更改

5. 在 Sepolia 测试网上执行交易

要在公共使用的测试网络(例如 Sepolia)上完成这些步骤,你需要运行五个交易,并确信它们将在测试网上完美执行。我们将复制每个模拟交易的原始输入,然后使用 MetaMask 将其发送到 Sepolia。

要通过 MetaMask 调用智能合约并指定交易输入,你可能需要先启用此选项。

打开 MetaMask 并单击菜单图标。通过单击 展开视图 在新的浏览器选项卡中打开 MetaMask。

在浏览器中打开 MetaMask

接下来,单击右上角图标并选择设置。

打开 MetaMask 设置

在以下窗口中,选择左侧菜单中的 高级,然后向下滚动到 显示十六进制数据。这通常是关闭的,因此请将其打开以便能够将十六进制代码粘贴到 MetaMask 中。接下来,单击左上角的 MetaMask 徽标返回主窗口。

在 MetaMask 中启用十六进制代码粘贴

现在,我们将使用 MetaMask 将我们在 Fork 上试用的交易发送到部署在 Sepolia 上的多重签名。我们将通过复制模拟交易的原始输入来实现此目的。此值对应于交易输入字段(MetaMask 中的十六进制数据)。它包含与调用参数一起编码的对多重签名函数的调用。

打开 Fork 页面,你应该会看到类似于以下内容。

模拟的多重签名交易

  1. 在底部打开 submitTransaction,找到 原始输入 部分,然后单击以复制该值。

复制交易十六进制代码

2. 返回 MetaMask 并单击 发送 按钮。

3. 在以下窗口中,将原始输入十六进制代码粘贴到底部的 十六进制数据 字段中。

4. 单击 下一步

5. 转到 Tenderly 仪表板,你将在一段时间等待挖掘后看到该交易。

填写 MetaMask 中的字段

  1. 对第一个 confirmTransaction 重复步骤 1-5。
  2. 对第二个 confirmTransaction 重复步骤 1-5。
  3. executeTransaction 重复步骤 1-5。

当你返回 Tenderly 时,你将在 Tenderly 交易概览中看到你的所有交易。完成后,你将已成功在测试网络上执行该交易。这一次,代币将显示在你的第二个 MetaMask 钱包中。

6. 使用 Tenderly 创建和部署多重签名智能合约

恭喜,你成功了!现在你了解了多重签名钱包的工作原理,更重要的是,如何构建和部署一个。最棒的是什么?这仅仅是开始,因为你在 Tenderly 中使用智能合约可以做更多的事情。

从调试你的代码到分叉网络和测试复杂的场景,一体化 Tenderly 平台可以帮助简化和加速你的整个开发过程。但是,与其谈论它,不如亲自尝试一下

  • 原文链接: blog.tenderly.co/how-to-...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
tenderly
tenderly
江湖只有他的大名,没有他的介绍。