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程序,點擊左側”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后再重新啟動)
.NET Core 提供了快速運行的模塊化平臺,用于創建在 Windows、Linux 和 macOS 上運行的應用程序。 帶 C# 擴展的 Visual Studio Code 提供功能強大的編輯體驗,完全支持 C# IntelliSense(智能代碼填充)和調試。讓我們從 .NET Core 上的一個簡單“Hello World”程序入手:
1.打開項目
2.初始化 C# 項目:
3.運行"Hello World"程序
4.調試
述 | 楊曉兵
編輯 | 伍杏玲
出品 | 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)。
它們往往比傳統程序簡單得多,但風險要高得多 - 單個智能合約錯誤可能導致數百萬美元在幾分鐘內耗盡!
您將在本課程中培養哪些技能?我們將引導您完成編寫和部署您的第一個智能合約所需的工具,包括:
如果你有興趣,讓我們開始吧!
1、什么是智能合約
2、部署您的第一個智能合約
3、什么是氣體
4、與您的智能合約交互
5、智能合約的結構
6、將您的合同提交給 Etherscan
7、智能合約安全挑戰
8、將合約集成到前端
9、其他資源
雖然這個概述主要是關于以太坊的,但實際上所有的概念都適用于支持智能合約的區塊鏈!
智能合約是區塊鏈開發領域存在的主要原因。
以太坊在 2013 年的核心創新是允許開發人員編寫稱為智能合約的小代碼塊,這些代碼可以部署到以太坊網絡,獨立于其創建者運行。在以太坊中,智能合約是用 Solidity 編寫的,這是一種設計用于在以太坊虛擬機上運行的高級編程語言。[6]
智能合約是定義一組規則或“合約”的程序,當用戶在區塊鏈上調用時,它會自動執行編碼規則。特別是,一旦部署了智能合約,它的功能總是相同的——它不能被不法分子修改或控制。
因此,智能合約是運行金融應用程序的理想選擇——它們可以作為獨立參與者以有保證的、可重復的方式接收或發送加密貨幣。
好的,但是有哪些現實世界的工具可以被智能合約取代的例子呢?
還有很多很多。事實上,最終可以使用區塊鏈重新設計哪些系統,我們可能仍然只是接觸到了皮毛。
哪些特征使智能合約能夠徹底改變或取代現有的技術模型?與傳統編程語言不同,智能合約具有以下屬性:
部署后,這些智能合約表現為完全透明但可以包含復雜邏輯的獨立參與者。因此,在以太坊上擁有賬戶的不僅是人類用戶,還有兩種類型的賬戶:
EOA 和合約賬戶有什么區別?
令人印象深刻的是,這兩種類型的帳戶可以做基本相同的事情!這兩種賬戶類型都可以:
? 接收或發送可替代代幣(以太幣)到任何賬戶? 接收或發送不可替代的代幣(加密貓)到任何賬戶? 觸發另一個合約賬戶——允許一個智能合約運行其他智能合約。? 生成新的智能合約——讓智能合約充當合約工廠!
但是,合約賬戶有一些限制:
? 合約賬戶不能自行實例化操作——它們只能響應他們收到的交易(通常來自 EOA)。? 合約賬戶完全由其代碼控制,而 EOA 則由其關聯的私鑰控制。
如果您是區塊鏈開發的新手并且不知道從哪里開始,或者您只是想了解如何部署智能合約并與之交互,那么本指南適合您。我們將使用虛擬錢包( Metamask[7] )、Solidity[8]、Hardhat[9]和Alchemy[10]在 Goerli 測試網絡上創建和部署一個簡單的智能合約(如果你還不明白這意味著什么,請不要擔心,我們會解釋一下!)。
有很多方法可以向以太坊鏈發出請求。為簡單起見,我們將在 Alchemy 上使用免費帳戶,這是一個區塊鏈開發平臺和 API,允許我們與以太坊鏈進行通信,而無需運行我們自己的節點。該平臺還具有用于監視和分析的開發人員工具,我們將在本教程中利用這些工具來了解我們的智能合約部署中的幕后情況。
如果您還沒有 Alchemy 帳戶,請在此處免費注冊。[11]
創建 Alchemy 帳戶后,您可以通過創建應用程序來生成 API 密鑰。這將允許我們向 Goerli 測試網絡發出請求。如果您不熟悉測試網,請查看本指南[12]。
將鼠標懸停在導航欄中的“應用程序”上并單擊“創建應用程序”,導航到 Alchemy 儀表板中的“創建應用程序”頁面。
將您的應用命名為“Hello World”,提供簡短描述,為環境選擇“Staging”(用于您的應用記賬),然后為您的網絡選擇“Goerli”。
仔細檢查您是否選擇了 Goerli 測試網!
點擊“創建應用程序”,就是這樣!您的應用程序應顯示在下表中。
我們需要一個以太坊賬戶來發送和接收交易。在本教程中,我們將使用 Metamask,這是瀏覽器中的一個虛擬錢包,用于管理您的以太坊賬戶地址。如果你想了解更多關于以太坊交易如何運作的信息,請查看以太坊基金會的這個頁面[13]。
您可以在此處[14]免費下載和創建 Metamask 帳戶。當您正在創建一個帳戶時,或者如果您已經有一個帳戶,請確保切換到右上角的“Goerli 測試網絡”(這樣我們就不會處理真錢)。
為了將我們的智能合約部署到測試網絡,我們需要一些虛假的 Eth。要獲取 Eth,您可以前往Goerli 水龍頭[15]并輸入您的 Goerli 帳戶地址,然后單擊“Send Me Eth”。由于網絡流量,可能需要一些時間才能收到您的虛假 Eth。(在撰寫本文時,大約需要 30 分鐘。)不久之后,您應該會在您的 Metamask 帳戶中看到 Eth!
為了仔細檢查我們的余額,讓我們使用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。呸!我們的假錢就在那里。
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,我們就可以開始了!
Hardhat 是一個用于編譯、部署、測試和調試以太坊軟件的開發環境。在部署到實時鏈之前,它可以幫助開發人員在本地構建智能合約和 dApp。
在我們的hello-world項目內部運行:
npm install --save-dev hardhat
查看此頁面以獲取有關安裝說明[22]的更多詳細信息。
在我們的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 步中)。
為了讓我們的項目井井有條,我們將創建兩個新文件夾。在命令行中導航到 hello-world 項目的根目錄并鍵入
mkdir contracts
mkdir scripts
contracts/是我們保存 hello world 智能合約代碼文件的地方
scripts/是我們將保留腳本以部署和與我們的合約交互的地方
您可能會問自己,我們到底什么時候要編寫代碼?好吧,我們到了,第 10 步
在您喜歡的編輯器中打開 hello-world 項目(我們喜歡VSCode[23])。智能合約是用一種稱為 Solidity 的語言編寫的,我們將使用它來編寫我們的 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函數來更新。
我們已經創建了一個 Metamask 錢包、Alchemy 賬戶,并編寫了我們的智能合約,現在是時候連接這三者了。
從您的虛擬錢包發送的每筆交易都需要使用您唯一的私鑰進行簽名。為了向我們的程序提供此權限,我們可以將我們的私鑰(和 Alchemy API 密鑰)安全地存儲在環境文件中。
要了解有關發送交易的更多信息,請查看有關使用 web3 發送交易的教程。[25]
首先,在你的項目目錄中安裝 dotenv 包:
npm install dotenv --save
這是一個超級簡單的智能合約,它在創建時存儲一條消息,并且可以通過調用update函數來更新。
您的環境文件必須命名為 .env 否則將不會被識別為環境文件。請勿將其命名為 process.env 或 .env-custom 或其他任何名稱。
你的.env應該是這樣的:
API_URL = "https://eth-goerli.alchemyapi.io/v2/your-api-key"
PRIVATE_KEY = "your-metamask-private-key"
為了將這些實際連接到我們的代碼,我們將在第 13 步的hardhat.config.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中請求以太坊。
到目前為止,我們已經添加了幾個依賴項和插件,現在我們需要更新 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}`]
}
},
}
為了確保到目前為止一切正常,讓我們編譯我們的合約。編譯任務是內置hardhat任務之一。
從命令行運行:
npx hardhat compile
您可能會收到關于SPDX license identifier not provided in source file 的警告,但無需擔心——希望其他一切看起來都不錯!
如果沒有,您可以隨時在Alchemy discord[31]中留言。
現在我們的合約已經寫好并且我們的配置文件已經準備好了,是時候編寫我們的合約部署腳本了。
導航到/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
我們終于準備好部署我們的智能合約了!導航到命令行并運行:
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
*請認真填寫需求信息,我們會在24小時內與您取得聯系。