Web3 新手如何部署第一个智能合约?

Title:Web3 新手如何部署第一个智能合约?

Subtitle:开发者提升指南|超全步骤带你轻松上手智能合约开发

来源:https://www.web3.university/tracks/create-a-smart-contract/deploy-your-first-smart-contract

编译:TinTinLand 社区

智能合约是区块链开发存在的首要原因。以太坊在 2013 年提出的核心创新点是允许开发人员编写小段代码(称为智能合约),这些代码可以部署到以太坊网络并独立于创建者进行运行。在以太坊中,智能合约是用 Solidity 编写的,而 Solidity 是一种旨在以太坊虚拟机上运行的高级编程语言。

智能合约作为一种定义一组规则的程序或“合约”,当用户在区块链上调用时,会自动执行编码的规则;具体来说,智能合约一旦部署,其功能将始终相同且无法被恶意行为者修改或控制。因此,智能合约逐渐成为运行金融应用程序的理想选择,它可以作为独立参与者以有保证、可重复的方式接收或发送加密资产。

那么你知道智能合约的运行原理和部署方法吗?如果你是区块链开发新手,不知道从何开始或者你只是想了解如何与智能合约交互操作,那么本篇指南将会非常适合你。我们将介绍如何使用虚拟钱包 (Metamask)、Solidity、Hardhat 和 Alchemy 在 Goerli 测试网络上创建和部署简单的智能合约。

步骤 1:连接到以太坊

向以太坊发出请求的方法有很多种。简单来说,我们使用的是 Alchemy 上的免费帐户,这是一个区块链开发者平台和 API,允许我们与以太坊进行通信而无需运行个人节点。该平台还具备用于监控和分析的开发工具,我们将在本篇推文中利用这些工具来了解智能合约部署的具体情况。

步骤 2:创建应用(和 API 密钥)

创建 Alchemy 帐户后,你可以通过创建应用程序来生成 API 密钥,这将允许向 Goerli 测试网络发出请求;将鼠标悬停在导航栏中的“应用程序”上,然后单击“创建应用程序”,导航到 Alchemy 仪表板中的“创建应用程序”页面:

将你的应用命名为“Hello World”并提供简短描述,为环境选择“Staging”(作为你的应用账本)并为网络选择“Goerli”。

你需要仔细检查是否选择了 Goerli 测试网,点击“创建应用”,并看到应用出现在列表中。

步骤 3:创建以太坊账户(地址)

接下来需要一个以太坊账户来发送和接收交易,我们将使用 Metamask,这是浏览器中用于管理以太坊账户地址的虚拟钱包;你可以免费下载并创建 Metamask 帐户,创建帐户时,若你已有一个帐户,请确保切换到右上角的“Goerli 测试网络”(这样我们就不会处理真实资产)。

步骤 4:从 Faucet 添加 ether

为了将智能合约部署到测试网络,我们需要一些虚拟 Eth;获取 Eth 可以前往 Goerli faucet 输入你的 Goerli 帐户地址然后单击“发送 Eth”。由于网络流量限制,你可能需要一些时间才能接收到虚拟 Eth,很快你就会在 Metamask 帐户中看到 Eth。

步骤 5:检查余额

再次检查余额需要使用 Alchemy 编写器工具发出 eth_getBalance 请求,这将返回钱包的 Eth 数量;

输入 Metamask 帐户地址并单击“发送请求”后,你应该会看到如下程序响应:

 

{"jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000"}

注意:此结果以 wei 为单位,而不是 eth。wei 是最小的 ether 单位。从 wei 到 eth 的换算为:1 eth = 10^18 wei。因此,如果我们将 0x2B5E3AF16B1880000 转换为十进制,我们会得到 5*10^18,相当于 5 eth

步骤 6:初始化项目

 

mkdir hello-world cd hello-world

首先,我们需要为项目创建一个文件夹,导航到命令行并输入数据

进入了项目文件夹后,使用 npm init 来初始化项目:

 

npm init # (or npm init --yes)

你如何回应安装反馈的问题并不重要,以下是我们的回答方式,仅供参考:

 

package name: (hello-world) version: (1.0.0) description: hello world smart contract entry point: (index.js) test command: git repository: keywords: author: license: (ISC) About to write to /Users/.../.../.../hello-world/package.json:{"name": "hello-world","version": "1.0.0","description": "hello world smart contract","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"author": "","license": "ISC"}

点击批准 package.json 后,我们就可以开始运行了。

步骤 7:下载 Hardhat

Hardhat 是一个用于编译、部署、测试和调试以太坊的开发环境,可以帮助开发者在本地构建智能合约和 DApp 然后再部署到实际链上,随后在项目中运行 hello-world

 

npm install --save-dev hardhat

步骤 8:创建 Hardhat 项目

在项目文件夹中运行:hello-world

 

npx hardhat

随后,你将会看到一条欢迎消息和选择执行的操作选项,请选择“创建一个空的 hardhat.config.js”:

 

888 888 888 888 888888 888 888 888 888888 888 888 888 8888888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888888 888 "88b 888P" d88" 888 888 "88b "88b 888888 888 .d888888 888 888 888 888 888 .d888888 888888 888 888 888 888 Y88b 888 888 888 888 888 Y88b.888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 👷 Welcome to Hardhat v2.0.11 👷 What do you want to do? … Create a sample project ❯ Create an empty hardhat.config.js Quit

这将生成一个项目文件,我们将在其中指定项目的所有设置(可以跳转查看下文步骤 13)hardhat.config.js

步骤 9:添加项目文件夹

为了保持项目运行有序,可以创建两个新的文件夹,在命令行中导航到 hello-world 项目的根目录,然后输入

 

mkdir contracts mkdir scripts

contracts/是保存 hello world 智能合约代码文件的地方;

scripts/是保存脚本的地方,用于部署和与合约交互;

步骤 10:撰写合约

现阶段开始进入撰写代码的步骤:

在你最喜欢的编辑器中打开 hello-world 项目(例如 VSCode),可以使用 Solidity 语言编写 HelloWorld.sol 智能合约:

  1. 导航到 “contracts” 文件夹并创建一个名为 HelloWorld.sol 的新文件

  2. 以下是以太坊基金会 Hello World 智能合约示例,我们将下图内容复制并粘贴到 HelloWorld.sol 文件中,请务必阅读注释以了解合约作用:

 

// Specifies the version of Solidity, using semantic versioning.// Learn more: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma pragma solidity >=0.7.3;// Defines a contract named `HelloWorld`.// A contract is a collection of functions and data (its state). 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 contract HelloWorld {//Emitted when update function is called//Smart contract events are a way for your contract to communicate that something happened on the blockchain to your app front-end, which can be 'listening' for certain events and take action when they happen. event UpdatedMessages(string oldStr, string newStr);// Declares a state variable `message` of type `string`.// State variables are variables whose values are permanently stored in contract storage. 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. string public message;// Similar to many class-based object-oriented languages, a constructor is a special function that is only executed upon contract creation.// Constructors are used to initialize the contract's data. Learn more:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructorsconstructor(string memory initMessage) {// Accepts a string argument `initMessage` and sets the value into the contract's `message` storage variable). message = initMessage;}// A public function that accepts a string argument and updates the `message` storage variable.function update(string memory newMessage) public { string memory oldMsg = message; message = newMessage; emit UpdatedMessages(oldMsg, newMessage);}}

这是一个十分简单的智能合约,它在创建时存储一条消息并通过调用update函数进行更新。

步骤 11:将 Metamask 和 Alchemy 连接到项目

我们已经创建了 Metamask 钱包、Alchemy 账户,并编写了智能合约,现在需要将三者紧密联结。

从虚拟钱包发出的每笔交易都需要使用你唯一的私钥进行签名,为了向程序提供信息权限,我们可以安全地将私钥(包括 Alchemy API 密钥)存储在环境文件中。

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

 

npm install dotenv --save

这是一个十分简单的智能合约,它在创建时存储一条消息并通过调用update函数进行更新。

环境文件必须命名为 .env,否则将不会被识别为环境文件

请注意不要将文件命名为 process.env 或 .env-custom 等其他任何名称

  • 按照以下说明(https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key)导出你的私钥;

  • 参阅下文获取 HTTP Alchemy API URL 网址;

你的环境文件.env观看应该如下所示:

 

API_URL = "https://eth-goerli.alchemyapi.io/v2/your-api-key"PRIVATE_KEY = "your-metamask-private-key"

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

为了将实际信息连接到代码,我们将在步骤 13 中在 hardhat.config.js 文件中引用这些变量;

步骤 12:安装 Ethers.js

Ethers.js 是一个库,通过使用用户友好的方式包装标准 JSON-RPC 方法,使其与以太坊交互并能更轻松地发出请求;Hardhat 让集成插件—添加工具和扩展功能变得更为容易。我们将利用 Ethers 插件进行合约部署(Ethers.js 有非常简洁的合约部署方法)

在你的项目目录中输入:

 

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

在下一步操作中,我们还需使用到以太币:hardhat.config.js

步骤 13:更新 hardhat.config.js

到目前为止,我们已经添加了几个依赖项和插件,现在需要更新 hardhat.config.js 以便项目了解所有依赖项和插件;可以在项目文件中更新并使其如同hardhat.config.js

 

/** * @type import('hardhat/config').HardhatUserConfig */require('dotenv').config();require("@nomiclabs/hardhat-ethers");const { API_URL, PRIVATE_KEY } = process.env; module.exports = { solidity: "0.7.3", defaultNetwork: "goerli", networks: { hardhat: {}, goerli: { url: API_URL, accounts: [`0x${PRIVATE_KEY}`]}},}

步骤 14:编译合约

为了确保运行流程的正常有序,我们可以编译一下智能合约,其中编译任务是内置的 hardhat 任务之一,命令行运行如下:

 

npx hardhat compile

你可能会收到相关的警告信息,但因实际的良好运行概况而无需担心:

SPDX license identifier not provided in source file

如果没有这部分的信息,你可以随时在 Alchemy discord 中留言。

步骤 15:编写部署脚本

现在我们的智能合约已经完成编写,相应的配置文件也准备完成,是时候着手编写合约部署脚本:

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

 

async function main() {const HelloWorld = await ethers.getContractFactory("HelloWorld");// Start deployment, returning a promise that resolves to a contract objectconst hello_world = await HelloWorld.deploy("Hello World!"); console.log("Contract deployed to address:", hello_world.address);}main().then(() => process.exit(0)).catch(error => { console.error(error); process.exit(1);});

Hardhat 在合约教程中出色地解释了每行代码的作用,我们采用了这样的解释:

 

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

ethers.js 中的 AContractFactory是用于部署新智能合约的账户抽象,因此HelloWorld是我们的 hello world 合约实例工厂。具体运行过程中,实例默认连接到第一个签名者(所有者)——hardhat-ethersContractFactoryContract

 

const hello_world = await HelloWorld.deploy();

调用启动部署时会返回解析为合约对象的 Promise;该对象具有针对我们每个智能合约函数的方法——deploy()ContractFactory

步骤 16:部署合约

导航到命令行并运行就可以准备好部署智能合约:

 

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

然后你应该会看到类似这样的内容:

 

Contract deployed to address: 0xCAFBf889bef0617d9209Cf96f18c850e901A6D61

请复制并粘贴此地址并将其保存到某处,这将在后面的教程中使用到该地址,请务必不要丢失这一地址。

如果我们进入 Goerli etherscan 并搜索合约地址,能够看到它已成功完成部署,交易将如下所示:

发件人地址应与你的 Metamask 帐户地址相匹配,收件人地址将显示“创建合同”;

如果我们点击交易,我们会在收件人字段中看到合同地址:

完成到这一步骤后,你已经完成将智能合约部署到以太坊链上的状态;想要了解运行的底层逻辑可以导航到Alchemy 仪表板中的 Explorer 选项卡(若你有多个 Alchemy 应用程序,请确保按应用程序进行筛选并选择“Hello World”)

在这里,你将看到调用该函数时 Hardhat/Ethers 在后台执行的一些 JSON-RPC 调用。

这里的两个重要调用是将我们的合约实际写入 Ropsten 链的请求,以及根据哈希值读取有关交易的信息请求(发送交易的典型模式)——deploy()eth_sendRawTransactioneth_getTransactionByHash

除了轻松部署智能合约以外,更多 Web3 行业技术干货等着你!

为了帮助开发者成功入行 Web3,TinTinLand 社区提供了系统化的成长路径,无论您是开发者还是对 Web3 感兴趣的新手,都可以找到适合自己的资源和社区。【TinTinLand Web3 新手村】、【TinTinLand 招聘群】、【TinTin Web3 Hackers 交流群】满足你的入行、学习、求职、比赛各类需求,为你的 Web3 开发之路提供支持!有意加入以上社群的小伙伴可以点击“阅读原文”查看社区详细使用指南或微信添加 TinTinLand 社区小助手(🆔 TinTin-land)获取入群方式!

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用 Java 调用智能合约,需要使用 web3j 库。web3j 是一个用于与以太坊网络进行交互的轻量级 Java 库。下面是使用 web3j 调用智能合约的一些基本步骤: 1.在项目中添加 web3j 库的依赖: ``` <dependency> <groupId>org.web3j</groupId> <artifactId>core</artifactId> <version>4.5.14</version> </dependency> <dependency> <groupId>org.web3j</groupId> <artifactId>crypto</artifactId> <version>4.5.14</version> </dependency> <dependency> <groupId>org.web3j</groupId> <artifactId>abi</artifactId> <version>4.5.14</version> </dependency> ``` 2.创建一个与以太坊节点进行连接的 Web3j 对象: ``` Web3j web3j = Web3j.build(new HttpService("http://localhost:8545")); ``` 3.构建一个与智能合约进行交互的 Credentials 对象: ``` Credentials credentials = WalletUtils.loadCredentials("password", "/path/to/walletfile"); ``` 4.使用智能合约的地址和 ABI 构建一个 Contract 对象: ``` String contractAddress = "0x123456..."; String contractABI = "..."; Contract contract = Contract.load(contractAddress, web3j, credentials, new DefaultGasProvider(), contractABI); ``` 5.调用智能合约的方法: ``` TransactionReceipt transactionReceipt = contract.methodName(param1, param2).send(); ``` 其中,methodName 是智能合约中定义的方法名,param1 和 param2 是该方法的参数。send() 方法用于发送交易并等待交易被打包,并返回交易回执。 以上是使用 web3j 调用智能合约的基本步骤,具体的实现需要根据实际情况进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值