整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

在Visual Studio Code中安装与配置C#详细教程

isual Studio Code是一款轻量级但功能强大的源代码编辑器,它可以在你的桌面上运行,适用于Windows、macOS和Linux。它内置了对JavaScript、TypeScript和Node.js的支持,并为其他语言(如C++、C#、Java、Python、PHP、Go)和运行时(如.NET和Unity)提供了丰富的扩展生态系统。本文以在Visual Studio Code中安装与配置C#为例进行语言配置讲解。



下载并安装Visual Studio Code

  • 登录Visual Studio Code官网,点击"Download Visual Studio Code"下拉列表,选择适合自己电脑系统的版本进行下载。

  • 双击已下载的安装文件"VSCodeUserSetup-{version}.exe",根据安装向导提示进行安装,在此期间可以自行设置安装路径,且确保“添加到PATH(重启后生效)”处于勾选状态。

下载并安装.NET.Core.SDK

  • 进入https://dotnet.microsoft.com/download,点击"Download .NET Core SDK",下载安装文件。

  • 运行.NET Core SDK安装文件,点击“安装”按钮即可进行安装,安装完成后关闭窗口。

  • 打开“命令提示符”窗口,输入命令"dotnet",按Enter键执行命令,若出现如下图所示关于怎样使用dotnet的信息,则说明.NET Core SDK安装成功。

从 Visual Studio Code 市场安装 C#扩展

打开已安装的Visual Studio Code程序,点击左侧”Extensions“图标,在搜索框输入"C#",选择合适的C#扩展,点击其右侧的"Install"按钮进行安装。(注意:安装完成后如果在右下角提示"The .NET Core SDK cannot be located. .NET Core debugging will not be enabled. Make sure the .NET Core SDK is installed and is on the path.",则有可能是因为你在安装.NET Core SDK时Visual Studio Code处于打开状态,此时的解决办法是关闭Visual Studio Code后再重新启动)

通过Visual Studio Code开始使用.NET Core

.NET Core 提供了快速运行的模块化平台,用于创建在 Windows、Linux 和 macOS 上运行的应用程序。 带 C# 扩展的 Visual Studio Code 提供功能强大的编辑体验,完全支持 C# IntelliSense(智能代码填充)和调试。让我们从 .NET Core 上的一个简单“Hello World”程序入手:

1.打开项目

  • 打开 Visual Studio Code。
  • 依次单击左侧菜单上的“资源管理器”图标和 “打开文件夹” 。
  • 从主菜单中选择“文件” > “打开文件夹”,打开要在其中放置 C# 项目的文件夹,然后单击“选择文件夹”
  • 在我们的示例中,为项目创建名为“HELLOWORLD”的文件夹 。

2.初始化 C# 项目:

  • 通过从主菜单中选择“视图” > “集成终端” ,从 Visual Studio Code 中打开集成终端。
  • 在终端窗口中,键入“dotnet new console”。
  • 此命令在已编写“Hello World”简单程序的文件夹中创建“Program.cs”文件,以及名为“HelloWorld.csproj”的 C# 项目文件 。

3.运行"Hello World"程序

  • 键入 dotnet run,命令执行完成后则会输出"Hello World",并在项目文件下生成bin和obj文件。

4.调试

  • 单击打开 Program.cs。 在 Visual Studio Code 中首次打开 C# 文件时,会在编辑器中加载 OmniSharp。

  • Visual Studio Code 会提示添加缺少的资产,以生成和调试应用。 选择 “是” 。


  • 若要打开调试视图,请单击左侧菜单上的“调试”图标。找到窗格最上面的绿色箭头。 请确保已选择旁边下拉列表中的“.NET Core Launch (控制台)” 。

  • 单击第 9 行旁边的编辑器边距 (编辑器中行号左侧的空间)或者将文本光标移动到编辑器中的第 9 行并按 F9,为项目添加断点。

  • 请按 F5 或选择绿色箭头启动调试。 在到达你在上一步中设置的断点时,调试器会停止执行程序。(调试时,可以在左上角的窗格中查看局部变量,也可以使用调试控制台进行查看)。选择最上面的蓝色箭头以继续调试,或选择最上面的红色方块以停止调试。

述 | 杨晓兵

编辑 | 伍杏玲

出品 | CSDN(ID:CSDNnews)

编者前记:

编译器是连接人类世界与机器世界之间的一座桥梁,它可将程序员理解的高级语言,转换成程序高效执行的机器码。在 C/C++ 编译器里,有 VC、Borland C++、GCC、Watcom C/C++ 等国外热门编译器,但属于国内自主研发的编译器较少。

毕竟开发一款实用的编译器不易,涉及前端词法、语法分析、语意分析、大量的编译优化等工作。而有一支团队,不惜花费十余年精力完全自主研发出一款 YC 编译器和 YC 浏览器内核。

为何他们不遗余力地自主研发编译器和浏览器内核?这款编译器有何优点呢?下面由 YC 编译器的主要作者之一——杨晓兵,来讲述这背后十多年来的漫漫研发路。

以下为杨晓兵自述:

初衷:“做一些对软件行业进步有帮助的东西”

十多年前,我在中国科学院电子学研究所工作,参与设计一些硬件电路。当时我对硬件的兴趣远超软件,后创业专门从事软件工作。

我在创业的过程中发现,做此类软件虽能赚钱,但无论做得怎样,对软件科学的进步都无丝毫作用。尽管付出很多,却无成就感。

操作系统、数据库、编译器以及浏览器内核是不需要特殊专业知识的、开发难度非常大、最基础的软件产品。

我想从这几种软件中选择其中一项来自主研发,虽然不能肯定做出什么成就,但我有希望能做出一些对软件行业进步有所帮助的东西,使自己不枉踏入软件这个行业。根据当时的情况,我发现可先从浏览器内核下手,于是我除了维护原有产品外,把主要精力都投入到浏览器的研发中。

创新将 C 代码内嵌到 HTML

两年后,我们研发完成浏览器内核的基本功能,如 HTML 的解析和显示、JavaScript 脚本的执行等。

此时,我们发现 HTML 的标准越来越复杂,导致开发难度越来越大,如果按照这样的发展,浏览器内核将无法走入市场。

于是我重新思考:如果把 C 语言处理成像 JavaScript 脚本嵌入到 HTML 中,用内嵌 C 代码的 HTML 超文本做软件的人机交互界面,这款内核应该会有点竞争优势。

于是我们花费两年半的时间将标准 C 语言以 JavaScript 相似的方式在 HTML 中执行,并扩展了一个 HTML 标签:<user>,每个 user 标签都可以用属性 src 指定一个 C 源码文件,user标签的显示界面和所有行为都由它的 C 代码决定。

同时将 C 编译器做成一个函数,用该函数编译生成 C 程序的可执行代码,执行代码可被存入文件或直接执行。此时,我们将编译器取名为 YC 编译器,浏览器内核取名为 YC 浏览器。

三年又三年,漫漫研发路

随后,我们继续完善浏览器内核,将其中的一些内核代码独立出来用内嵌编译器动态编译执行,并将大部分内核源代码开源。

与此同时,我们又遇到一个问题:YC 编译器虽然编译速度较快,生成的却是字节码,执行速度慢,而且与原生代码相互调用(特别是回调函数)的处理相当繁琐。因此用当时的 YC 编译器难以胜任开源代码的编译工作。

为了解决自编译浏览器内核代码的问题,我们决定修改 YC 编译器,使它的字节码转换为原生的执行码,并扩展语法,使之具有少量的 C++ 语法。这个工作持续了三年。

三年后,YC 编译器功能增多,它提供一个函数像调用动态链接库一样直接调用 C 源码中的函数。此时,浏览器内核开源部分都可以用 YC 编译器实时编译执行了。

我们继续改进浏览器内核,将速度很慢的 JavaScript 字节码改为二进制原生代码,使 JavaScript 的执行速度约提高约 100 多倍。同时将浏览器内核代码全部模块化并开源,每个模块都用 YC 编译器动态编译执行,编译器的部分源码也开源(如内嵌汇编编译器源码、反汇编源码、C/C++ 字节码的执行源码等),所有的开源代码均由内嵌的 YC 编译器自动检测编译,动态执行。这个工作大概耗时四年。

开发至此,我想起谷歌和火狐浏览器都已开源,为什么不去看看它们的源代码呢?于是找到这两个浏览器的源码。

当时由于一些原因,我分析谷歌浏览器源码没有编译通过,而火狐的源码很顺利就编译成功了,于是我就走上了分析火狐源码之路。

下载的火狐源码由纯 C 代码和 C++ 代码两部分组成,经 Visual C++ 2013 编译生成一个 xul.dll 文件和一个 firefox.exe 文件。

我首先分析了它的 C 代码,将所有的输出函数全部改为类接口,并让 xul.dll 通过 YC 编译器函数 YC_cppLoad 进行实时编译,然后用类接口调用 C 源码中的函数。这一步进行得很顺利,若修改了火狐的 C 代码,只要重新运行火狐浏览器便可生效,无需其它操作。

曾经的办公桌

接下来开始分析火狐 C++ 代码。YC 编译器只实现了少数几个 C++ 语法,不能编译火狐 C++ 代码,故分析起来非常困难。

为什么火狐 C 代码容易分析,而它的 C++ 代码难以分析呢?原来我用 YC 编译器将它的 C 代码生成汇编代码文件、变量结构定义文件、宏定义文件和预编译文件,通过这几个文件,大大减少了分析难度。

因此我再次决定修改 YC 编译器,使之完全支持 C++11 标准,因为火狐 C++ 代码几乎使用了所有的 C++11 语法特性。先使用 STL 标准模板库代码进行编译器的修改和调试,出乎预料,这个过程竟用了三年时间!之后,我用 YC++ 编译器开始调试火狐 C++ 代码。原以为 STL 那么复杂的代码都可以编译通过并正确执行,火狐 C++ 代码应该能很快就编译通过。没想到,很多语法细节 STL 没有用到,而火狐 C++ 源码用到了。于是又继续修改 YC 编译器,对火狐 C++ 的各个模块进行编译,这个过程持续了一年多

虽然 YC 编译器可以编译全部火狐 C++ 代码,但如何生成执行代码呢?先从主程序 Firefox.cpp 入手,经整理,这个程序可用 YC 编译器生成执行代码 Firefox.exe,并能顺利运行。

由于火狐 C++ 各模块耦合紧密,很难拆分,经过一个多月的工作,仍未能将其拆成多个独立的源码模块以便于用 YC 编译器实时编译,动态执行,这也许是我对火狐 C++ 源码的整体结构还不甚清楚之故,只见其树木不见其森林。

杨晓兵

当我准备对火狐 C++ 代码进行再一次总体分析时,有个偶然的机会参与到一个学校管理系统的开发中,因原有的管理系统经常出故障,操作极其不方便。尽管没有开发 Web 服务程序的经历,但我做的软件与 Web 服务器有极大关系。

经了解,要开发这种管理系统需要的软件有:Apache 或 Nginx 服务器,数据库 MySQL 或其它,编程工具 ASP 或 JSP 或 PHP 等,于是启发我们自己研发这些工具。YC 的 C/C++ 和 JavaScript 编译器和 HTML 解析器正好派上用场。

经过一段时间,一个稳定的、可任意扩展的、多线程高并发的 HTTP 服务器就完成了。该服务器处理 YSP 文件生成网页传给浏览器。

YSP 是我设计的与 ASP、JSP 和 PHP 功能相似的一种网页编程语言。YC 服务器执行 YSP 文件中的内嵌 C/C++ 或 JavaScript 代码,生成 HTML 超文本传给终端设备。工具做好后,不久便做出了管理系统的雏形,这个雏形在发布的 YC 编译器中可见到。

做了上述这些工作后,我想是时候该写本书介绍一下 YC 编译器了,经过一段时间编写的《YC编译器—多语言程序设计》(暂名)即将出版。

当我把书完成后,便立即投入64位的C/C++和JavaScript编译器的开发,目前开发进展顺利,已进入测试阶段。

编者后记:

三年时间,可将一个呱呱落地的婴儿变成蹦蹦跳跳的幼儿,可将一名懵懂的职场新人变成沉稳的老兵。而杨晓兵团队沉下心,迎难而上,花费三年又三年、再一年、两年、四年的时间只为突破一个个技术难点,最终自研出 YC 编译器和 YC 浏览器内核。

在这过程中,杨晓兵坦言最大的挑战不仅是技术,还有思维的高度。这期间不仅有大量的研发工作,还为了优化,多次重写代码,让他坚持下来的是想为计算机软件科学的发展做贡献的匠心。

目前杨晓兵团队正在开发 64 位 C/C++ 编译器,谈及未来,杨晓兵表示先在国内推广,再走向海外。祝福杨晓兵。

YC编译器传送门:http://www.ycbro.com

果您是 web3 开发的新手,那么这是开始的地方!

智能合约构成了构建在区块链上的所有 dApp 的基础,它们通常使用自定义语言编写,例如 Solidity(用于 Ethereum)或 Cadence(用于 Flow)。

它们往往比传统程序简单得多,但风险要高得多 - 单个智能合约错误可能导致数百万美元在几分钟内耗尽!

您将在本课程中培养哪些技能?我们将引导您完成编写和部署您的第一个智能合约所需的工具,包括:

  • Metamask: [1]用于与以太坊区块链交互的软件加密货币钱包,允许您支付 gas 费用来发布您的交易。
  • Solidity: [2]一种面向对象的编程语言,用于在以太坊上实现智能合约。
  • Hardhat: [3]一个以太坊开发环境,允许您编译 Solidity 合约、在开发网络上测试合约并查看 Solidity 堆栈跟踪。
  • Etherscan: [4]一个在线区块链浏览器,允许您查看公共区块链上的交易、区块和钱包状态。
  • Alchemy: [5]一个 web3 开发者平台,允许您通过免费节点与以太坊网络的其余部分连接。

如果你有兴趣,让我们开始吧!

目录

1、什么是智能合约

2、部署您的第一个智能合约

3、什么是气体

4、与您的智能合约交互

5、智能合约的结构

6、将您的合同提交给 Etherscan

7、智能合约安全挑战

8、将合约集成到前端

9、其他资源

1、什么是智能合约?

背景

虽然这个概述主要是关于以太坊的,但实际上所有的概念都适用于支持智能合约的区块链!

智能合约是区块链开发领域存在的主要原因。

以太坊在 2013 年的核心创新是允许开发人员编写称为智能合约的小代码块,这些代码可以部署到以太坊网络,独立于其创建者运行。在以太坊中,智能合约是用 Solidity 编写的,这是一种设计用于在以太坊虚拟机上运行的高级编程语言。[6]

智能合约是定义一组规则或“合约”的程序,当用户在区块链上调用时,它会自动执行编码规则。特别是,一旦部署了智能合约,它的功能总是相同的——它不能被不法分子修改或控制。

因此,智能合约是运行金融应用程序的理想选择——它们可以作为独立参与者以有保证的、可重复的方式接收或发送加密货币。

真实世界的例子

好的,但是有哪些现实世界的工具可以被智能合约取代的例子呢?

  • 金融工具:通常,当您在线交易股票或货币时,您需要第三方在交易发生时将这两种资产托管在托管中 - 例如股票经纪人。智能合约可以充当第三方,允许在没有中间人的情况下进行交易。
  • 财产所有权: 与法律文件相比,智能合约几乎是即时执行的,可以公开访问,并且可以允许分散所有权。
  • 构建额外的代币: 令人难以置信的是,你实际上可以在以太坊上启动新的代币系统,例如 Tether 或 Chainlink。同样,您可以使用智能合约启动 NFT 项目,例如 Bored Apes 或 CryptoPunks。

还有很多很多。事实上,最终可以使用区块链重新设计哪些系统,我们可能仍然只是接触到了皮毛。

智能合约的特征

哪些特征使智能合约能够彻底改变或取代现有的技术模型?与传统编程语言不同,智能合约具有以下属性:

  • 透明度:智能合约发布到区块链,任何有权访问区块链的人都可以读写。
  • 简单性:由于智能合约部署到区块链上的成本很高,并且包含指示金融交易流程的敏感逻辑,因此它们往往比大多数代码库更小更简单。
  • 不变性:一旦部署了智能合约,它(通常)就不能被修改,并且无论何时调用都保证其功能相同!这使得智能合约可以作为可靠、受信任的第三方运行——因为没有个人控制智能合约,它可以充当金融中介、值得信赖的自动化做市商,或者通过保证公正性而发挥更多作用。

部署后,这些智能合约表现为完全透明但可以包含复杂逻辑的独立参与者。因此,在以太坊上拥有账户的不仅是人类用户,还有两种类型的账户:

  • • 由人类用户管理的外部拥有的帐户(EOA)。
  • • 由其底层智能合约代码管理的合约账户。

EOA 和合约账户有什么区别?

令人印象深刻的是,这两种类型的帐户可以做基本相同的事情!这两种账户类型都可以:

• 接收或发送可替代代币(以太币)到任何账户• 接收或发送不可替代的代币(加密猫)到任何账户• 触发另一个合约账户——允许一个智能合约运行其他智能合约。• 生成新的智能合约——让智能合约充当合约工厂!

但是,合约账户有一些限制:

• 合约账户不能自行实例化操作——它们只能响应他们收到的交易(通常来自 EOA)。• 合约账户完全由其代码控制,而 EOA 则由其关联的私钥控制。

2、部署您的第一个智能合约

如果您是区块链开发的新手并且不知道从哪里开始,或者您只是想了解如何部署智能合约并与之交互,那么本指南适合您。我们将使用虚拟钱包( Metamask[7] )、Solidity[8]Hardhat[9]Alchemy[10]在 Goerli 测试网络上创建和部署一个简单的智能合约(如果你还不明白这意味着什么,请不要担心,我们会解释一下!)。

创建和部署您的智能合约

第 1 步:连接到以太坊网络

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

如果您还没有 Alchemy 帐户,请在此处免费注册。[11]

第 2 步:创建您的应用(和 API 密钥)

创建 Alchemy 帐户后,您可以通过创建应用程序来生成 API 密钥。这将允许我们向 Goerli 测试网络发出请求。如果您不熟悉测试网,请查看本指南[12]

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

将您的应用命名为“Hello World”,提供简短描述,为环境选择“Staging”(用于您的应用记账),然后为您的网络选择“Goerli”。

仔细检查您是否选择了 Goerli 测试网!

点击“创建应用程序”,就是这样!您的应用程序应显示在下表中。

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

我们需要一个以太坊账户来发送和接收交易。在本教程中,我们将使用 Metamask,这是浏览器中的一个虚拟钱包,用于管理您的以太坊账户地址。如果你想了解更多关于以太坊交易如何运作的信息,请查看以太坊基金会的这个页面[13]

您可以在此处[14]免费下载和创建 Metamask 帐户。当您正在创建一个帐户时,或者如果您已经有一个帐户,请确保切换到右上角的“Goerli 测试网络”(这样我们就不会处理真钱)。

第 4 步:从水龙头中添加以太

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

第 5 步:检查您的余额

为了仔细检查我们的余额,让我们使用Alchemy 的 composer tool发出一个[16]eth_getBalance[17]请求。这将返回我们钱包中的 Eth 数量。查看此视频[18]以获取有关如何使用作曲家工具的说明!

输入您的 Metamask 帐户地址并单击“发送请求”后,您应该会看到如下所示的响应:

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

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

第6步:初始化我们的项目

mkdir hello-world
cd hello-world

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

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

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[21]

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

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

npm install --save-dev hardhat

查看此页面以获取有关安装说明[22]的更多详细信息。

第8步:创建hardhat项目

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

npx hardhat

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

888    888                      888 888               888
888    888                      888 888               888
888    888                      888 888               888
8888888888  8888b.  888d888 .d88888 88888b.   8888b.  888888
888    888     "88b 888P"  d88" 888 888 "88b     "88b 888
888    888 .d888888 888    888  888 888  888 .d888888 888
888    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

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

第9步:添加项目文件夹

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

mkdir contracts
mkdir scripts

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

scripts/是我们将保留脚本以部署和与我们的合约交互的地方

第10步:编写我们的合同

您可能会问自己,我们到底什么时候要编写代码?好吧,我们到了,第 10 步

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

  1. 1. 导航到“contracts”文件夹并创建一个名为 HelloWorld.sol 的新文件
  2. 2. 下面是我们将在本教程中使用的来自以太坊基金会[24]的 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#constructors
   constructor(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 密钥)安全地存储在环境文件中。

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

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

npm install dotenv --save

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

您的环境文件必须命名为 .env 否则将不会被识别为环境文件。请勿将其命名为 process.env 或 .env-custom 或其他任何名称。

  • • 按照这些说明[26]导出您的私钥
  • • 请参阅下文以获取 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文件中引用这些变量。

第12步:安装 Ethers.js

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

Hardhat 使集成插件[28]变得非常容易,以获得额外的工具和扩展功能。我们将利用Ethers 插件[29]进行合约部署(Ethers.js[30]有一些超级干净的合约部署方法)。

在您的项目目录类型中:

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[31]中留言。

第15步:编写我们的部署脚本

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

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

async function main() {
   const HelloWorld = await ethers.getContractFactory("HelloWorld");

   // Start deployment, returning a promise that resolves to a contract object
   const 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 在他们的合同教程[32]中解释了每行代码的作用,我们在这里采用了他们的解释。

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

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

const hello_world = await HelloWorld.deploy();

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

第16步:部署我们的合约

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

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

然后,您应该会看到如下内容:

Contract deployed to address: 0xCAFBf889bef0617d9209Cf96f18c850e901A6D61

请复制并粘贴此地址以将其保存在某处,因为我们将在以后的教程中使用此地址,因此您不想丢失它。

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

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

恭喜!你刚刚在以太坊链上部署了一个智能合约

要了解幕后发生的事情,让我们导航到Alchemy 仪表板[34]中的 Explorer 选项卡。如果您有多个 Alchemy 应用程序,请确保按应用程序过滤并选择“Hello World”。

在这里,你会看到Hardhat/Ethers在我们调用deploy()函数时在引擎盖下进行的一些JSON-RPC调用。这里有两个重要的调用,一个是eth_sendRawTransaction,这是实际将我们的合同写到Ropsten链上的请求,另一个是eth_getTransactionByHash,这是一个读取关于我们交易的哈希值的请求(发送交易时的一个典型模式)。

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

译者注:下一篇明天到来,保持关注。

引用链接

[1] Metamask: : https://metamask.io/
[2] Solidity: : https://docs.soliditylang.org/
[3] Hardhat: : https://hardhat.org/
[4] Etherscan: : https://etherscan.io/
[5] Alchemy: : https://alchemy.com/
[6] 以太坊虚拟机上运行的高级编程语言。: https://cypherpunks-core.github.io/ethereumbook/13evm.html
[7] Metamask: https://metamask.io/
[8] Solidity: https://docs.soliditylang.org/en/v0.8.0/
[9] Hardhat: https://hardhat.org/
[10] Alchemy: https://dashboard.alchemyapi.io/signup?referral=affiliate:df70d561-e6cf-4922-b101-e2bb27c00a15
[11] 如果您还没有 Alchemy 帐户,请在此处免费注册。: https://alchemy.com/
[12] 本指南: https://docs.alchemyapi.io/guides/choosing-a-network
[13] 这个页面: https://ethereum.org/en/developers/docs/transactions/
[14] 您可以在此处: https://metamask.io/download.html
[15] Goerli 水龙头: https://goerlifaucet.com/
[16] Alchemy 的 composer tool发出一个: https://composer.alchemyapi.io/?composer_state={"network"%3A0%2C"methodName"%3A"eth_getBalance"%2C"paramValues"%3A[""%2C"latest"]}
[17] eth_getBalance: https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance
[18] 此视频: https://youtu.be/r6sjRxBZJuU
[19] 命令行: https://www.computerhope.com/jargon/c/commandi.htm
[20] 这些说明进行操作: https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm
[21] hardhat: https://hardhat.org/getting-started/#overview
[22] 安装说明: https://hardhat.org/getting-started/#overview
[23] VSCode: https://code.visualstudio.com/
[24] 以太坊基金会: https://ethereum.org/en/
[25] 教程。: https://docs.alchemyapi.io/alchemy/tutorials/sending-transactions-using-web3-and-alchemy
[26] 这些说明: https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key
[27] 标准 JSON-RPC 方法,使交互和向以太坊发出请求变得更加容易。: https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc
[28] 插件: https://hardhat.org/plugins/
[29] Ethers 插件: https://hardhat.org/plugins/nomiclabs-hardhat-ethers.html
[30] Ethers.js: https://github.com/ethers-io/ethers.js/
[31] Alchemy discord: https://discord.gg/u72VCg3
[32] 合同教程: https://hardhat.org/tutorial/testing-contracts.html#writing-tests
[33] Goerli etherscan: https://goerli.etherscan.io/
[34] Alchemy 仪表板: https://dashboard.alchemyapi.io/explorer
[35] 使用 Web3 发送交易: https://docs.alchemy.com/alchemy/tutorials/sending-txs