主页 > imtoken官方苹果下载 > 智能合约初学者指南

智能合约初学者指南

imtoken官方苹果下载 2023-01-28 06:52:41

第 8 步:创建 Hard Hat 项目

在我们的项目文件夹中运行:

1npx hardhat
2

然后您应该会看到一条欢迎消息和选项以选择您要执行的操作。 选择“创建一个空的 hardhat.config.js”:

1888 888 888 888 888
2888 888 888 888 888
3888 888 888 888 888
48888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888
5888 888 "88b 888P" d88" 888 888 "88b "88b 888
6888 888 .d888888 888 888 888 888 888 .d888888 888
7888 888 888 888 888 Y88b 888 888 888 888 888 Y88b.
8888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888
9
10 Welcome to Hardhat v2.0.11 ‍?
11
12What do you want to do? …
13Create a sample project
14❯ Create an empty hardhat.config.js
15Quit
16
显示全部

这将生成一个 hardhat.config.js 文件,我们将使用该文件配置项目的所有设置(第 13 步)。

第 9 步:添加项目文件夹

为了让我们的项目井井有条,我们将创建两个新文件夹。 在命令行中导航到项目的根目录,然后输入:

1mkdir contracts
2mkdir scripts
3

第十步:写合同

你可能会问自己,天哪,你打算什么时候写代码? ? 答案是,现在,第 10 步。

siteqq.com 以太坊智能合约_以太坊智能合约的应用_以太坊智能合约教程

在您最喜欢的编辑器(我们最喜欢的是 VSCode)中打开 hello-world 项目。 智能合约是用一种称为 Solidity 的语言编写的,我们将使用它来编写我们的 HelloWorld.sol 智能合约。

导航到“contracts”文件夹并创建一个名为 HelloWorld.sol 的新文件 下面是我们将在本教程中使用的来自以太坊基金会的示例 Hello World 智能合约。 将以下内容复制并粘贴到 HelloWorld.sol 文件中,并务必阅读注释以了解该合约的工作原理:

1// Specifies the version of Solidity, using semantic versioning.
2// Learn more: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
3pragma solidity ^0.7.0;
4
5// Defines a contract named `HelloWorld`.
6// 一个合约是函数和数据(其状态)的集合。 Once deployed, a contract resides at a specific address on the Ethereum blockchain. Learn more: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
7contract HelloWorld {
8
9 // Declares a state variable `message` of type `string`.
10 // 状态变量是其值永久存储在合约存储中的变量。 The keyword `public` makes variables accessible from outside a contract and creates a function that other contracts or clients can call to access the value.
11 string public message;
12
13 // Similar to many class-based object-oriented languages, a constructor is a special function that is only executed upon contract creation.
14 // 构造器用于初始化合约的数据。 Learn more:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors
15 constructor(string memory initMessage) {
16
17 // Accepts a string argument `initMessage` and sets the value into the contract's `message` storage variable).
18 message = initMessage;
19 }
20
21 // A public function that accepts a string argument and updates the `message` storage variable.
22 function update(string memory newMessage) public {
23 message = newMessage;
24 }
25}
26
显示全部
以太坊智能合约的应用_siteqq.com 以太坊智能合约_以太坊智能合约教程 复制

这是一个非常简单的智能合约,在创建时存储一条消息,并可以通过调用update函数来更新消息。

第 11 步:将 MetaMask 和 Alchemy 连接到您的项目

我们创建了一个 MetaMask 钱包,一个 Alchemy 账户,并编写了一个智能合约,现在是时候连接三者了。

从虚拟钱包发送的每笔交易都需要使用您唯一的私钥进行签名。 要授予程序此权限,我们可以将私钥(和 Alchemy API 密钥)安全地存储在环境文件中。

要了解有关发送交易的更多信息,请查看有关使用 web3 发送交易的教程。

首先,在项目目录中安装 dotenv 包:

以太坊智能合约教程_以太坊智能合约的应用_siteqq.com 以太坊智能合约

1npm install dotenv --save
2

然后在我们的项目根目录中创建一个 .env 文件,并将您的 MetaMask 私钥和 HTTP Alchemy API URL 添加到其中。

获取 alchemy 应用程序接口密钥

复制炼金术 API URL

您的 .env 文件应如下所示:

1API_URL = "https://eth-ropsten.alchemyapi.io/v2/your-api-key"
2PRIVATE_KEY = "your-metamask-private-key"
3

为了将这些变量与代码联系起来,我们将在步骤 13 中的 hardhat.config.js 文件中调用这些变量。

不要提交 .env! 确保永远不要与任何人共享或公开您的 .env 文件,因为这样做会泄露您的私钥。 如果您使用版本控制,请将您的 .env 添加到 gitignore 文件。

第 12 步:安装 Ethers.js

Ethers.js 是一个软件库以太坊智能合约教程,通过以更加用户友好的方式包装标准 JSON RPC 方法,可以更轻松地与以太坊交互并向以太坊发出请求。

Hardhat 使我们更容易将插件集成到工具中并扩展功能。 我们将使用 Ethers 插件来完成合约部署(Ethers.js 有一个非常简单的部署方法)。

在你的项目目录中输入:

1npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0"
2

siteqq.com 以太坊智能合约_以太坊智能合约的应用_以太坊智能合约教程

在下一步中,我们还将在 hardhat.config.js 中使用 ethers。

第 13 步:更新 hardhat.config.js

到目前为止,我们已经添加了几个依赖库和插件,现在我们需要更新 hardhat.config.js 以便项目使用所有这些新组件。

更新您的 hardhat.config.js 代码如下:

1require('dotenv').config();
2
3require("@nomiclabs/hardhat-ethers");
4const { API_URL, PRIVATE_KEY } = process.env;
5
6/**
7* @type import('hardhat/config').HardhatUserConfig
8*/
9module.exports = {
10 solidity: "0.7.3",
11 defaultNetwork: "ropsten",
12 networks: {
13 hardhat: {},
14 ropsten: {
15 url: API_URL,
16 accounts: [`0x${PRIVATE_KEY}`]
17 }
18 },
19}
20
显示全部

第十四步:写合同

为了确保一切正常,让我们编译合约。 编译任务是 hardhat 的内部任务之一。

在命令行运行:

1npx hardhat compile
2

您可能会看到有关源文件中未提供 SPDX 许可证标识符的警告,但不要担心,希望其他一切看起来都正常! 遇到问题可以随时在炼金绳社区留言提问。

以太坊智能合约教程_以太坊智能合约的应用_siteqq.com 以太坊智能合约

第 15 步:编写部署脚本

合约已经写好了,配置文件也准备好了。 现在是编写合约部署脚本的时候了。

转到 scripts/ 文件夹,创建一个名为 deploy.js 的新文件,并向其中添加以下内容:

1async function main() {
2 const HelloWorld = await ethers.getContractFactory("HelloWorld");
3
4 // Start deployment, returning a promise that resolves to a contract object
5 const hello_world = await HelloWorld.deploy("Hello World!");
6 console.log("Contract deployed to address:", hello_world.address);}
7
8main()
9 .then(() => process.exit(0))
10 .catch(error => {
11 console.error(error);
12 process.exit(1);
13 });
14
显示全部

Hardhat 在 中对这些代码的每一行都提供了很好的解释,我们在这里直接引用他们的解释。

1const HelloWorld = await ethers.getContractFactory("HelloWorld");
2

ethers.js 中的 ContractFactory 是一个用于部署新智能合约的抽象对象。 所以这里的 HelloWorld 是我们的 hello world 合约实例的工厂。 使用 hardhat-ethers 插件时,ContractFactory 和 Contract 实例默认连接到第一个签名帐户。

1const hello_world = await HelloWorld.deploy();
2

在 ContractFactory 代码中调用 deploy() 函数启动合约部署并返回解析为合约的 Promise。 该对象包括我们智能合约中每个函数对应的调用方法。

第 16 步:部署合约

以太坊智能合约教程_以太坊智能合约的应用_siteqq.com 以太坊智能合约

我们终于准备好部署我们的智能合约了! 导航到命令行运行后:

1npx hardhat run scripts/deploy.js --network ropsten
2

您将看到类似于以下内容的信息:

1Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570
2

如果我们去 Ropsten etherscan 搜索我们的合约地址,我们应该能够看到它已成功部署。 交易将如下所示:

etherscan 合约

发件人地址应该与您的 MetaMask 帐户地址相同,收件人地址将显示“Contract Creation”,但是如果我们点击进入交易,我们将在收件人字段中看到我们的合同地址:

etherscan 交易

恭喜!您刚刚在以太坊区块链上部署了智能合约

为了更深入地了解正在发生的事情,让我们转到 Alchemy 仪表板中的资源管理器选项卡。 如果您有多个 Alchemy 应用程序,请确保按应用程序过滤并选择“Hello World”。

hello world 浏览器

在这里你可以看到一系列的 JSON-RPC 调用,当我们调用 .deploy() 函数时,所有这些都是由 Hardhat/Ethers 在后端为我们完成的。 这里有两个重要的调用,一个是将我们的合约实际写入 Ropsten 链的请求以太坊智能合约教程,另一个是读取关于我们交易的给定哈希的请求(这是进行交易时的典型模式)。了解有关发送交易的更多信息,请查看有关使用 Web3 发送交易的教程

这就是本教程第 1 部分的全部内容,在第 2 部分中我们将更新我们的初始信息; 在第 3 部分中,我们将让每个人都知道如何与之交互。

想了解更多关于炼金术的知识吗? 查看我们的网站。 不想错过更新? 在这里订阅我们的时事通讯! 请务必在 Twitter 上关注我们并在 Discord 上加入我们。