创建部署你的第一个智能合约

news2024/9/24 21:24:02

原文参考地址 【Web3 开发系列教程—创建你的第一个智能合约(2)】部署第一个智能合约,增加自己的内容

如果你是区块链开发的新手并且不知道从哪里开始,或者你只是想了解如何部署智能合约并与之交互,那么本指南适合你。 我们将介绍使用

  • 虚拟钱包 (Metamask)
  • Solidity(合约编程语言)
  • Hardhat (开发框架)
  • Alchemy(免费节点平台)

在 Goerli 测试网络上创建和部署一个简单的智能合约

一、连接到以太坊网络

有很多方法可以向以太坊链发出请求。 为简单起见,我们将在 Alchemy 上使用免费帐户 (如果你还没有 Alchemy 帐户,请点击在此处免费注册),这是一个区块链开发平台和 API,允许我们与以太坊链进行通信,而无需运行我们自己的节点。 该平台还具有用于监视和分析的开发人员工具,我们将在本教程中利用这些工具来了解我们的智能合约部署中的幕后情况。

二、创建应用和 API 密钥

1、创建 Alchemy 帐户后,你可以通过创建应用程序来生成 API 密钥。 这将允许我们向 Goerli 测试网络发出请求。 如果你不熟悉测试网,请查看官方给出的指南。

总得来说就是主网是真实环境,用的也是真实的以太币,而测试网络是测试用的,目前主要有以下这两种测试网络

在对应的网络中必须要使用对应的测试以太币,但目前来说Goerli的测试币比较难以获取(水龙头现在放出的测试币非常少),如果获取不到Goerli的话,可以换成Sepolia,后续涉及到的内容都换成Sepolia即可

在这里插入图片描述

2、将鼠标悬停在导航栏中的 “应用程序” 上并单击 “创建应用程序”,导航到 Alchemy 仪表板中的“创建应用程序” 页面:

在这里插入图片描述

3、将你的应用命名为 “HelloWorld”,然后为你的网络选择 “Goerli”。
在这里插入图片描述

三、创建以太坊账户(地址)

我们需要一个以太坊账户来发送和接收交易。 在本教程中,我们将使用 Metamask,这是浏览器中的一个虚拟钱包,用于管理你的以太坊账户地址

当你正在创建帐户时,或者如果你已经有帐户,请确保切换到右上角的 “Goerli 测试网络”(这样我们就不会处理真钱)。
在这里插入图片描述

如果你的测试网络显示一把小锁,你需要把这个权限给放开 ,点击右上角账号,选择设置

在这里插入图片描述

选择高级,打开测试网络

在这里插入图片描述

四、获取测试的

1、为了将我们的智能合约部署到测试网络,我们需要一些虚假的 Eth。 要获取 Eth,你可以前往 Goerli 水龙头并输入你的 Goerli 帐户地址,然后单击 “Send Me Eth”。 由于网络流量,可能需要一些时间才能收到你的虚假 Eth。不久之后,你应该会在你的 Metamask 帐户中看到 Eth!

2、但是目前来说 Goerli 的测试币不太好获取,所以,可以去获取 Sepolia

3、这篇博客里面说到了如何去获取 怎么获得goerli eth测试币?

4、我建议直接去 https://goerlifaucet.com/ 网站获取,对于 goerli 和 sepolia 都可以获取

在这里插入图片描述

五、检查余额

为了仔细检查我们的余额,让我们使用 [Alchemy 的 composer 工具 ] 发出一个 eth_getBalance 请求。 这将返回我们钱包中的 Eth 数量。

在这里插入图片描述
输入你的 Metamask 帐户地址并单击 “发送请求” 后,应该会看到如下所示的响应:

在这里插入图片描述

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

注意:这个结果是 wei 而不是 eth。 魏被用作以太的最小面额。 wei 到 eth 的换算为:1 eth = 10^18 wei。 因此,如果我们将 0x2B5E3AF16B1880000 转换为十进制,我们会得到 1999491316995421666 。 我们的假钱就在那里。

在这里插入图片描述

六、初始化我们的项目

mkdir hello-world
cd hello-world

1、首先,我们需要为我们的项目创建一个文件夹。 导航到你的命令行并键入:

2、现在我们在项目文件夹中,我们将使用 npm init 来初始化项目。 如果你还没有安装 npm,请按照这些说明进行操作(我们还需要 Node.js,所以也下载它!)。

npm init 

在这里插入图片描述

七、下载 Hardhat

Hardhat 是一个用于编译、部署、测试和调试以太坊软件的开发环境。 在部署到实时链之前,它可以帮助开发人员在本地构建智能合约和 dApp。

在我们的 hello-world 项目中运行:

npm install --save-dev hardhat

在这里插入图片描述

八、创建 Hardhat 项目

1、在我们的 hello-world 项目文件夹中,运行:

npx hardhat

2、然后,你应该会看到一条欢迎消息和用于选择你想要执行的操作的选项。 选择 “创建一个空的 hardhat.config.js”:

在这里插入图片描述

这将为我们生成一个 hardhat.config.js 文件,我们将在其中为我们的项目指定所有设置(在第 13 步中)。

九、添加项目文件夹

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

mkdir contracts
mkdir scripts
  • contract: 是我们保存 hello world 智能合约代码文件的地方
  • scripts: 是我们保存脚本以部署和与我们的合约交互的地方

十、编写我们的合约

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

  1. 导航到 “contracts” 文件夹并创建一个名为 HelloWorld.sol 的新文件
  2. 下面是我们将在本教程中使用的来自以太坊基金会的 Hello World 智能合约示例。 将以下内容复制并粘贴到你的 HelloWorld.sol 文件中,并确保阅读注释以了解此合约的作用:
// 使用语义版本控制指定 Solidity 的版本。
// 了解更多:https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
pragma solidity >=0.7.3;

// 定义一个名为“HelloWorld”的合约。
// 合约是功能和数据(其状态)的集合。 部署后,合约将驻留在以太坊区块链上的特定地址。 了解更多:https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
contract HelloWorld {

   // 调用更新函数时发出
   // 智能合约事件是你的合约将区块链上发生的事情传达给你的应用程序前端的一种方式,它可以“监听”某些事件并在它们发生时采取行动。
   event UpdatedMessages(string oldStr, string newStr);

   // 声明一个`string`类型的状态变量`message`。
   // 状态变量是其值永久存储在合约存储中的变量。 关键字 `public` 使变量可以从合约外部访问,并创建一个函数,其他合约或客户端可以调用该函数来访问该值。
   string public message;

   // 与许多基于类的面向对象语言类似,构造函数是一种特殊函数,仅在合约创建时执行。
   // 构造函数用于初始化合约的数据。 了解更多:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors
   constructor(string memory initMessage) {

      // 接受字符串参数 `initMessage` 并将值设置到合约的 `message` 存储变量中)。
      message = initMessage;
   }

   // 一个接受字符串参数并更新“消息”存储变量的公共函数。
   function update(string memory newMessage) public {
      string memory oldMsg = message;
      message = newMessage;
      emit UpdatedMessages(oldMsg, newMessage);
   }
}

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

十一、将 Metamask 和 Alchemy 连接到你的项目

1、我们已经创建了一个 Metamask 钱包、Alchemy 账户,并编写了我们的智能合约,现在是时候连接这三者了。

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

dotenv是一个Node.js的库,它允许我们从一个名为 .env 的文件中加载环境变量。我们可以在 .env 文件中设置我们应用程序所需的各种配置变量,例如数据库连接,API密钥等。这些配置变量可以在我们的应用程序的各个部分中访问并使用,而不必硬编码在代码中。这样做,可以使应用程序更具可移植性和安全性。同时,dotenv 还可以帮助我们在不同环境中轻松切换配置,例如在本地开发时和生产环境中。

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

npm install dotenv --save

在这里插入图片描述

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

你的 .env 应如下所示:

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

1、API_URL 的获取方式可以参考下图:
在这里插入图片描述
在这里插入图片描述
2、PRIVATE_KEY 私钥的获取方式如下图

在这里插入图片描述

在这里插入图片描述

3、为了将这些连接到我们的代码,我们将在第 13 步的 hardhat.config.js 文件中引用这些变量。

十二、安装 Ethers.js

Ethers.js 是一个库,它通过使用更友好的方法包装标准 ** JSON-RPC ** 方法,使交互和向以太坊发出请求变得更加容易。

Hardhat 使的集成插件变得非常容易,以获得额外的工具和扩展功能。 我们将利用 Ethers 插件进行合约部署(Ethers.js 有一些超级干净的合约部署方法)。
在你的项目目录的命令行中输入如下命令:

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

在这里插入图片描述

十三、更新 hardhat.config.js

到目前为止,我们已经添加了几个依赖项和插件,现在我们需要更新 hardhat.config.js , 将你的 hardhat.config.js 更新为如下所示内容,使用前面设置的key,注意你使用的是什么网络就配置什么即可

/** @type import('hardhat/config').HardhatUserConfig */

require('dotenv').config();
require("@nomiclabs/hardhat-ethers");

const { API_URL, PRIVATE_KEY } = process.env;

module.exports = {
  solidity: "0.8.18",
  defaultNetwork: "sepolia",
   networks: {
      hardhat: {},
      goerli: {
         url: API_URL,
          accounts: [`0x${PRIVATE_KEY}`]
       },
      //sepolia:{
      //  url: API_URL,
       // accounts: [`0x${PRIVATE_KEY}`]
      //  }
   },
};



十四、编译我们的合约

为了确保到目前为止一切正常,让我们编译我们的合约。

从命令行运行:

npx hardhat compile

在这里插入图片描述

十五、编写部署脚本

1、现在我们的合约已经写好并且我们的配置文件已经准备好了,是时候编写我们的合约部署脚本了。

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

async function main() {
    const HelloWorld = await ethers.getContractFactory("HelloWorld");
 
    // 开始部署,返回一个解析为合约对象的 promise
    const hello_world = await HelloWorld.deploy("Hello World gxm!");
    console.log("Contract deployed to address:", hello_world.address);
 }
 
 main()
   .then(() => process.exit(0))
   .catch(error => {
     console.error(error);
     process.exit(1);
   });
 

其中:

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

ethers.js 中的 ContractFactory 是用于部署新智能合约的抽象,因此 HelloWorld 这里是我们的 hello world 合约实例的工厂。 使用 hardhat-ethers 为 ContractFactory 和 Contract 添加插件时,实例默认连接到第一个签名者(所有者)。

const hello_world = await HelloWorld.deploy("Hello World gxm!");

在 ContractFactory 上调用 deploy() 将启动部署,并返回解析为 Contract 对象的 Promise。 这是为我们的每个智能合约功能提供方法的对象。

十六、部署合约

1、切换到命令行并运行,注意你使用的是什么网络,就用什么,后面那个图片,是我用 sepolia 的网络,和命令不一样,你用 goerli即可

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

在这里插入图片描述
然后,你应该会看到如下内容,这就是我们的部署之后的合约地址

Contract deployed to address: 0xA1046166F229CE891F70F7127161e4a13B9916D2

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

注意,不同的测试网路,对应的查看地址也不同
在这里插入图片描述
在这里插入图片描述

发件人地址应该与你的 Metamask 帐户地址匹配,收件人地址将显示 “Contract Creation”,但如果我们点击交易,我们将在收件人字段中看到我们的合同地址:

在这里插入图片描述

至此,恭喜你! 你已经在以太坊链上部署了一个智能合约🎉

十七、项目结构

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据技术(入门篇)--- 使用Spring Boot 操作 CDH6.2.0 Spark SQL进行离线计算

前言 CDH 6.2.0 搭建的环境,并不能直接使用 spark 相关资源,需要对此服务端环境进行一些修改Spark 目前仅支持 JDK1.8, Java项目运行环境只能使用JDK 1.8我这里使用的是 CDH6.2.0集群,因此使用的依赖为CDH专用依赖,需要先添加仓库…

跨平台开发工具怎么选?IDE工具推荐

软件开发工具链的价值,越来越多企业看到了它。近年来,国内也迎来了软件开发工具的自主化浪潮,今天就来跟大家盘点一下2023年十大移动开发IDE工具。 一、Android Studio 作为Android开发IDE工具的首选,Android Studio提供了一个全…

API7 助力头部券商实现数字化转型

背景 随着中国经济步入高质量发展阶段,数字化转型正在被更多的企业提上议程。2021 年证监会出台的《证券期货行业科技发展“十四五”规划》中指出,需“提升证券期货业数据治理水平”,“深化数字化转型标准建设,推动行业数据接口的…

涨点神器:Yolov8引入CVPR2023 InternImage:注入新机制,扩展DCNv3,助力涨点,COCO新纪录65.4mAP!

1.InternImage介绍 论文:https://arxiv.org/abs/2211.05778 代码:GitHub - OpenGVLab/InternImage: [CVPR 2023 Highlight] InternImage: Exploring Large-Scale Vision Foundation Models with Deformable Convolutions 理论部分参考知乎:CVPR2023 Highlight | 书生模型霸…

机器学习:LightGBM算法原理(附案例实战)

机器学习:LightGBM算法原理(附案例实战) 作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可…

Python结合Qt实现点击按钮保存并生成自定义word详细讲解(相信我,耐心看完,一定会有收获的)

一、需求介绍 因为我的毕设需要设计一个系统,然后把结果生成检测报告供企业下载。模型大概已经训练好了,也就差个导出word功能,把模型识别的数据结果输入到word导出即可。 二、最终实现效果 这里随便整个模板来对所需要的函数进行说明&…

嵌入式 QT Creator使用

目录 1、QT Creator界面 2、QT Creator设置 3、第一个程序 3.1 新建一个项目 3.2 项目的文件组成和管理 3.3 项目的编译、调试与运行 1、QT Creator界面 启动 Qt Creator ,出现如图 1 所示的主窗口: Qt Creator 的界面很简洁。上方是主菜单栏&a…

【架构设计】如何设计一个几十万在线用户弹幕系统

文章目录 一、前言二、项目介绍客户端轮询WebSocket主动推送 三、弹幕初始架构四、弹幕架构演进五、弹幕存储六、弹幕查询七、总结 一、前言 现在无论是直播还是电视剧,我们都可以看到上面慢慢的弹幕,满足十几万用户在线的弹幕系统,我们该如…

ChatGPT 如何获取API Key

什么是OpenAI API Key? OpenAI是ChatGPT的“开发商”,提供API使得开发者可以在自己的应用程序上调用OpenAI的相关服务(除了ChatGPT,OpenAI还有其他产品)。如果想调用OpenAI的产品服务在自己的应用程序上,我们就需要申…

Web接口测试工具---Poster与Postman

工作当中有不少时间在编写和维护接口自动化测试用例。打算先整理一些接口相关工具的使用。 简单对接Web口测试的相关工具/技术做个划分。 HTTP/SOAP协议接口的功能测试: 1、浏览器URL(GET请求) http://127.0.0.1:8000/login/?usernamezhangs…

4.25、IO多路复用简介

4.25、IO多路复用简介 1. I/O多路复用(I/O多路转接)①阻塞等待(BIO模型)②非阻塞,忙轮询(NIO模型)③IO多路转接技术(select/poll)④IO多路转接技术(epoll&am…

基于DeepSpeed训练ChatGPT

基于DeepSpeed训练ChatGPT 最少只需一张32G GPU,自己也可以训练一个ChatGPT! 最近微软发布了一个基于DeepSpeed的训练优化框架来完成ChatGPT类模型的训练,博主对其进行了研究并通过此博文分享相关技术细节。 一、配置预览 1、开源仓库&…

如何更换电脑背景图片?这样做很简单!

案例:怎样把电脑背景图换成自己的照片? 【我的电脑背景图片是系统自带的壁纸,不太好看,我想把它换成自己的照片。有没有小伙伴知道电脑怎么更换背景图片?在线求个简单的方法!】 在日常生活中,…

YOLOV5引入SE注意力机制以及精度提升问题

YOLOV5引入SE注意力机制以及精度提升问题 1. 如何增加SE注意力机制 在model/common.py中添加SE结构 class SE(nn.Module):def __init__(self, c1, c2, r16):super(SE, self).__init__()self.avgpool nn.AdaptiveAvgPool2d(1)self.l1 nn.Linear(c1, c1 // r, biasFalse)sel…

23-Ajax-axios

一、原生Ajax <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width…

用canvas画曲线图

1.创建 canvas 绘图上下文&#xff08;指定 canvasId&#xff09; 定义&#xff1a;在自定义组件下&#xff0c;第二个参数传入组件实例this&#xff0c;以操作组件内 canvas 组件。需要指定 canvasId&#xff0c;该绘图上下文只作用于对应的 canvas。 参数 参数类型说明can…

jQWidgets V15.0[2023-03-03] Crack

高级 JavaScript 和 HTML5 用户界面框架 jQWidgets 为构建专业网站和移动应用程序提供了全面的解决方案。它完全基于 HTML5、CSS 和 JavaScript 等开放标准和技术构建。jQWidgets 支持响应式 Web 开发&#xff0c;并帮助您创建在台式机、平板电脑和智能手机上看起来很漂亮的应…

Jenkins构建结果自定义内容推送企业微信

环境&#xff1a;gitlab、jenkins(2.400,windows环境下&#xff09;、企业微信 功能&#xff1a;推送构建人、构建时长、构建结果、git提交信息到企业微信并相应提交人 一、企业微信添加群聊机器人 在弹出的页面添加一个新的机器人&#xff0c;创建完成后会有一个webhook地址…

Django DRF - 认证Authentication

1.概念 身份验证是将传入请求与一组标识凭据&#xff08;例如&#xff0c;请求来自的用户或与其进行签名的令牌&#xff09;相关联的机制。然后&#xff0c;权限和限制策略可以使用这些凭据来确定是否应允许该请求。 身份验证本身不会允许或不允许传入的请求&#xff0c;它只…

最好用的中文分词库cppjieba_ok【可直接编译使用用版】

最好用的中文分词库cppjieba_ok【可直接编译使用用版】 中文分词技术在自然语言处理领域中扮演着非常重要的角色&#xff0c;其中cppjieba是一个高效、开源的中文分词库&#xff0c;它提供了多种分词算法和分词模式&#xff0c;并且能够支持多线程&#xff0c;能够大大提升分词…