如何使用DAppTools

在编写智能合约时,开发者只需要了解一种语言,例如SolidityVyperRust。但是,选择一个框架并围绕该框架学习所有的语言可能会很棘手。

学习像 DappTools这样的简约命令行框架可以避免这些问题,且能使得Web3开发者的生活更加轻松。

在本篇DappTools教程中,你将学习如何通过DappTools框架创建、测试以及部署智能合约。

下面是本教程随附的视频教程:

DappTools是什么?

DappTools是一个类似于Hardhat和Brownie的框架,可以帮助智能合约开发者测试、部署和维护他们的代码。 如果部署一个合约,你会将编译后的字节码存储在哪里?如何跟踪它的去向? 重新部署新代码的难度如何?这些都是可以通过使用智能合约开发框架来解决的问题。

DappTools最初是用Haskell语言编写。然而最近,Paradigm团队采用了DappTools并用Rust重写了它,并称他们的新创造为Foundry。 两者的工作方式相似,因为它们都以命令行为中心,高效,并且常常会涉及编写带有大量模糊测试的Solidity测试代码。

DappTools是许多业内领先协议的流行选择。

为什么使用 DappTools?

如果你是热爱Linux、bash脚本、追求高效、以命令行为中心来编码的开发者,那么这绝对是你应该尝试的智能合约框架。此外,如果你不熟悉JavaScript 或Python,这对你也很有用!

我们在学习什么?

在本教程中,我们将学习如何:

  1. 使用DappTools
  2. 使用dapptools-starter-kit部署由Chainlink驱动的混合型智能合约

以下是通过此入门工具包使用Chainlink服务的一些示例:

安装

要求

首先,我们需要安装一些东西。

你可能已经安装过make命令,如果没有的话,你需要make。可以按照这些步骤检查你是否已安装make

开始

一旦我们安装了这些工具,我们就可以克隆入门工具包仓库并开始使用它。

sh
git clone https://github.com/smartcontractkit/dapptools-starter-kit
cd dapptools-starter-kit
make # This installs the project's dependencies.
make test

现在你有了这些文件,我们来看看所有的东西是做什么的:

  • Makefile:放置脚本的文件。 DappTools是基于命令行的,makefile能帮助我们运行只需要输入几个字符的大型命令。
  • lib:此文件夹用于存放外部依赖项,例如OpenZeppelinds-test
  • out:编译代码的去向。 类似于 Brownie 中的 build 文件夹或 Hardhat 中的 artifacts 文件夹。
  • src:这是智能合约文件所在的位置。 类似于BrownieHardhat中的contracts文件夹。

测试

现在我们做一些测试!要进行测试,我们可以运行make testdapp test

来自DappTools的所有命令都可用于此仓库,包括dapp buildethsigndapp test等。

导入外部依赖

假设我们想使用OpenZeppelin标准创建一个 NFT。 要安装外部合约或包,我们可以使用dapp install命令。我们需要指定GitHub仓库的组织和要安装的仓库名称。

首先,我们需要提交到目前为止的更改。 DappTools将外部包作为git子模块引入,因此我们需要先提交。

运行:

git add .
git commit -m ‘initial commit’

然后,我们可以安装我们的外部包。 例如,对于OpenZeppelin,我们将使用:

dapp install OpenZeppelin/openzeppelin-contracts

现在应该可以在lib文件夹中看到一个标有openzeppelin-contracts的新文件夹,因为它是从 GitHub 下载的。 这个仓库已经包含OpenZeppelin合约,所以会有一些重复,但我们仍然需要了解它是如何工作的。

部署

要进行部署,首先需要设置ethsign.env文件。

设置你的帐户/ethsign

要将你的私钥导入 DappTools,可以使用keystore或ethsign。ethsign附带dapptools的安装。 对于ethsign,运行以下命令:

bash
ethsign import 

现在将提示你输入私钥和密码。你可以从MetaMask等钱包中获取私钥。成功后,将私钥的地址添加到.env文件中的ETH_FROM变量下。 有关示例,请参见.env.example文件。

可查看Makefile了解有关其背后工作原理相关的上下文。

如果你要部署到测试网,请确保你的钱包中有测试网 ETH 和 LINK。 你可以从 Chainlink水龙头中获取测试网 LINK。

设置.env文件

你可以在.env.example中看到.env应该是什么样子的示例(部署到真实网络)。

  1. ALCHEMY_API_KEY:可以通过获取 Alchemy 帐户获取。
  2. ETH_FROM:发送交易的钱包地址。 你必须将要使用的地址的私钥加载到ethsign中,可参考上文。
  3. ETHERSCAN_API_KEY:用于在Etherscan验证合约(可选)。
  4. ETH_RPC_URL:用于在使用make deploy时有一个默认的部署网络(可选)。

测试网和主网部署

.env文件中设置ETH_RPC_URLALCHEMY_API_KEY,然后运行以下命令中的一个:

计数器合约(Automation兼容合约):

bash
make deploy CONTRACT=Counter

Price Feed:合约

bash
make deploy CONTRACT=PriceFeedConsumer

Chainlink VRF消费者合约:

bash
make deploy CONTRACT=VRFConsumer

你可以在scripts文件夹中各自的deploy文件中改变其部署参数。所有的构造器参数都在./src/helper-config.sh文件夹中创建。在这里你可以为不同网络分配不同的构造器参数。

本地测试网

# 在一个终端上

dapp testnet

将你的ETH_RPC_URL改为http://127.0.0.1:8545

然后运行你的部署脚本。

在Etherscan上进行验证

部署完合约后,你可以在Etherscan上对该合约进行验证:

ETHERSCAN_API_KEY=<api-key> dapp verify-contract <contract_directory>/<contract>:<contract_name> <contract_address>

例如:

ETHERSCAN_API_KEY=123456765 dapp verify-contract ./src/Counter.sol:Counter 0x23456534212536435424

可查看DappTools文档以了解如何通过DappTools完成验证合约。

与合约交互

为了与我们的合约交互,我们使用seth命令。假设我们已经将 PriceFeedConsumer.sol 部署到 Kovan,现在我们要调用 getLatestPrice 函数。 我们要怎么做呢?

ETH_RPC_URL=<YOUR_RPC_URL> seth call <YOUR_CONTRACT_ADDRESS> "getLatestPrice()"

例如:

ETH_RPC_URL=https://alchemy.io/adsfasdf seth call 0xd39F749195Ab1B4772fBB496EDAF56729ee36E55 "getLatestPrice()"

我们会得到类似 0x0000000000000000000000000000000000000000000000000000004c17b125c0的输出,这是 326815000000 的十六进制表示。

这是调用交易(不是花费gas)。 要更改区块链的状态(消耗gas),我们要使用seth send

假设我们部署了一个 VRFCConsumer 合约,我们想要调用getRandomNumber

首先,我们需要在 Kovan 链上向我们的合约发送一些 LINK:

ETH_RPC_URL=<YOUR_RPC_URL> ETH_FROM=<YOUR_FROM_ADDRESS> seth send <LINK_TOKEN_ADDRESS> "transfer(address,uint256)" <VRF_CONSUMER_ADDRESS> 1000000000000000000

如:

ETH_RPC_URL=https://alchemy.io/adfasdf ETH_FROM=0x12345 seth send 0xa36085F69e2889c224210F603D836748e7dC0088 "transfer(address,uint256)" 0xa74576956E24a8Fa768723Bd5284BcBE1Ea03adA 100000000000000000

这里100000000000000000 = 1 LINK

然后,我们可以调用 getRandomNumber 函数:

ETH_RPC_URL=<YOUR_RPC_URL> ETH_FROM=<YOUR_FROM_ADDRESS> seth send <VRF_CONSUMER_ADDRESS>  "getRandomNumber()"

稍等一会后,读取结果:

ETH_RPC_URL=<YOUR_RPC_URL> seth call <VRF_CONSUMER_ADDRESS> "randomResult()"

可以看到,将这些脚本放在我们的脚本文件夹中会很好用。 如果你也想参与贡献,请提交PR(Pull Request)!

资源列表

本教程的一些有用资源:

总结

DappTools 是一个非常强大的应用程序,可以帮助你构建颠覆性的dApp。我们建议你了解并尝试一下,看看你能够利用Chainlink去中心化服务来创造一些什么作品。

获取更多关于Chainlink的信息,请访问chain.link或在docs.chain.link阅读文档。要讨论集成问题,请联系专家。

Need Integration Support?
Talk to an expert
Faucets
Get testnet tokens
Read the Docs
Technical documentation