Hợp đồng thông minh Hello World cho người mới bắt đầu
Nếu bạn mới làm quen với việc phát triển chuỗi khối và không biết bắt đầu từ đâu, hoặc nếu bạn chỉ muốn hiểu cách triển khai và tương tác với các hợp đồng thông minh, thì hướng dẫn này là dành cho bạn. Chúng ta sẽ cùng nhau tạo và triển khai một hợp đồng thông minh đơn giản trên mạng lưới thử nghiệm Sepolia bằng cách sử dụng ví ảo MetaMask (opens in a new tab), Solidity (opens in a new tab), Hardhat (opens in a new tab), và Alchemy (opens in a new tab) (đừng lo lắng nếu bạn chưa hiểu bất kỳ điều nào trong số này, chúng tôi sẽ giải thích).
Trong phần 2 của hướng dẫn này, chúng ta sẽ tìm hiểu cách tương tác với hợp đồng thông minh của mình sau khi nó được triển khai tại đây, và trong phần 3, chúng ta sẽ đề cập đến cách xuất bản nó trên Etherscan.
Nếu bạn có câu hỏi ở bất kỳ thời điểm nào, đừng ngần ngại liên hệ trong Discord của Alchemy (opens in a new tab)!
Bước 1: Kết nối với mạng lưới Ethereum
Có nhiều cách để tạo yêu cầu đến chuỗi Ethereum. Để đơn giản, chúng ta sẽ sử dụng một tài khoản miễn phí trên Alchemy, một nền tảng phát triển chuỗi khối và API cho phép chúng ta giao tiếp với chuỗi Ethereum mà không cần phải chạy các nút của riêng mình. Nền tảng này cũng có các công cụ dành cho nhà phát triển để giám sát và phân tích mà chúng ta sẽ tận dụng trong hướng dẫn này để hiểu những gì đang diễn ra bên trong (under the hood) việc triển khai hợp đồng thông minh của chúng ta. Nếu bạn chưa có tài khoản Alchemy, bạn có thể đăng ký miễn phí tại đây (opens in a new tab).
Bước 2: Tạo ứng dụng của bạn (và khóa API)
Sau khi bạn đã tạo tài khoản Alchemy, bạn có thể tạo khóa API bằng cách tạo một ứng dụng. Điều này sẽ cho phép chúng ta tạo các yêu cầu đến mạng lưới thử nghiệm Sepolia. Nếu bạn chưa quen với các mạng lưới thử nghiệm (testnet), hãy xem trang này.
- Điều hướng đến trang "Create new app" (Tạo ứng dụng mới) trong Bảng điều khiển Alchemy của bạn bằng cách chọn "Select an app" (Chọn một ứng dụng) trên thanh điều hướng và nhấp vào "Create new app"
- Đặt tên cho ứng dụng của bạn là “Hello World”, cung cấp một mô tả ngắn và chọn một trường hợp sử dụng, ví dụ: "Infra & Tooling". Tiếp theo, tìm kiếm "Ethereum" và chọn mạng lưới.
- Nhấp vào "Next" (Tiếp theo) để tiếp tục, sau đó nhấp vào “Create app” (Tạo ứng dụng) và thế là xong! Ứng dụng của bạn sẽ xuất hiện trong menu thả xuống của thanh điều hướng, với một Khóa API có sẵn để sao chép.
Bước 3: Tạo một tài khoản Ethereum (địa chỉ)
Chúng ta cần một tài khoản Ethereum để gửi và nhận các giao dịch. Đối với hướng dẫn này, chúng ta sẽ sử dụng MetaMask, một ví ảo trên trình duyệt được sử dụng để quản lý địa chỉ tài khoản Ethereum của bạn. Tìm hiểu thêm về các giao dịch.
Bạn có thể tải xuống MetaMask và tạo một tài khoản Ethereum miễn phí tại đây (opens in a new tab). Khi bạn đang tạo tài khoản, hoặc nếu bạn đã có tài khoản, hãy đảm bảo chuyển sang mạng lưới thử nghiệm "Sepolia" bằng cách sử dụng menu thả xuống của mạng lưới (để chúng ta không phải giao dịch bằng tiền thật).
Nếu bạn không thấy Sepolia được liệt kê, hãy vào menu, sau đó chọn Advanced (Nâng cao) và cuộn xuống để bật "Show test networks" (Hiển thị mạng lưới thử nghiệm). Trong menu chọn mạng lưới, hãy chọn tab "Custom" (Tùy chỉnh) để tìm danh sách các mạng lưới thử nghiệm và chọn "Sepolia."
Bước 4: Thêm ether từ một vòi
Để triển khai hợp đồng thông minh của chúng ta lên mạng lưới thử nghiệm, chúng ta sẽ cần một ít ETH giả. Để nhận Sepolia ETH, bạn có thể truy cập chi tiết mạng lưới Sepolia để xem danh sách các vòi khác nhau. Nếu một vòi không hoạt động, hãy thử vòi khác vì đôi khi chúng có thể cạn kiệt. Có thể mất một chút thời gian để nhận được ETH giả của bạn do lưu lượng truy cập mạng lưới. Bạn sẽ thấy ETH trong tài khoản MetaMask của mình ngay sau đó!
Bước 5: Kiểm tra số dư của bạn
Để kiểm tra lại xem số dư của chúng ta đã có ở đó chưa, hãy tạo một yêu cầu eth_getBalance bằng cách sử dụng công cụ composer của Alchemy (opens in a new tab). Điều này sẽ trả về số lượng ETH trong ví của chúng ta. Sau khi bạn nhập địa chỉ tài khoản MetaMask của mình và nhấp vào “Send Request” (Gửi yêu cầu), bạn sẽ thấy một phản hồi như thế này:
{ "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" }
LƯU Ý: Kết quả này tính bằng wei chứ không phải ETH. Wei được sử dụng làm mệnh giá nhỏ nhất của ether. Tỷ lệ chuyển đổi từ wei sang ETH là: 1 eth = 1018 wei. Vì vậy, nếu chúng ta chuyển đổi 0x2B5E3AF16B1880000 sang hệ thập phân, chúng ta nhận được 5*10¹⁸, tương đương với 5 ETH.
Phù! Tiền giả của chúng ta đã ở đó .
Bước 6: Khởi tạo dự án của chúng ta
Đầu tiên, chúng ta sẽ cần tạo một thư mục cho dự án của mình. Điều hướng đến dòng lệnh của bạn và nhập:
mkdir hello-world
cd hello-world
Bây giờ chúng ta đã ở trong thư mục dự án của mình, chúng ta sẽ sử dụng npm init để khởi tạo dự án. Nếu bạn chưa cài đặt npm, hãy làm theo hướng dẫn cài đặt Node.js (opens in a new tab) (chúng ta sẽ cần Node.js và npm cho hướng dẫn này).
npm init
Cách bạn trả lời các câu hỏi cài đặt không thực sự quan trọng, đây là cách chúng tôi đã làm để bạn tham khảo:
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"
}
Chấp thuận package.json và chúng ta đã sẵn sàng!
Bước 7: Tải xuống Hardhat (opens in a new tab)
Hardhat là một môi trường phát triển để biên dịch, triển khai, thử nghiệm và gỡ lỗi phần mềm Ethereum của bạn. Nó giúp các nhà phát triển khi xây dựng các hợp đồng thông minh và ứng dụng phi tập trung (dapp) cục bộ trước khi triển khai lên chuỗi trực tiếp.
Bên trong dự án hello-world của chúng ta, hãy chạy:
npm install --save-dev hardhat
Hãy xem trang này để biết thêm chi tiết về hướng dẫn cài đặt (opens in a new tab).
Bước 8: Tạo dự án Hardhat
Bên trong thư mục dự án của chúng ta, hãy chạy:
npx hardhat
Sau đó, bạn sẽ thấy một thông báo chào mừng và tùy chọn để chọn những gì bạn muốn làm. Chọn “create an empty 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
Điều này sẽ tạo ra một tệp hardhat.config.js cho chúng ta, đây là nơi chúng ta sẽ chỉ định tất cả các thiết lập cho dự án của mình (ở bước 13).
Bước 9: Thêm các thư mục dự án
Để giữ cho dự án của chúng ta được tổ chức tốt, chúng ta sẽ tạo hai thư mục mới. Điều hướng đến thư mục gốc của dự án trong dòng lệnh của bạn và nhập:
mkdir contracts
mkdir scripts
contracts/là nơi chúng ta sẽ lưu giữ tệp mã hợp đồng thông minh hello world của mìnhscripts/là nơi chúng ta sẽ lưu giữ các tập lệnh để triển khai và tương tác với hợp đồng của mình
Bước 10: Viết hợp đồng của chúng ta
Bạn có thể đang tự hỏi, rốt cuộc thì khi nào chúng ta mới viết mã?? Chà, chúng ta đang ở đây, ở bước 10.
Mở dự án hello-world trong trình soạn thảo yêu thích của bạn (chúng tôi thích VSCode (opens in a new tab)). Các hợp đồng thông minh được viết bằng một ngôn ngữ gọi là Solidity, đây là ngôn ngữ chúng ta sẽ sử dụng để viết hợp đồng thông minh HelloWorld.sol của mình.
- Điều hướng đến thư mục “contracts” và tạo một tệp mới có tên là HelloWorld.sol
- Dưới đây là một hợp đồng thông minh Hello World mẫu từ Tổ chức Ethereum mà chúng ta sẽ sử dụng cho hướng dẫn này. Sao chép và dán nội dung bên dưới vào tệp HelloWorld.sol của bạn và đảm bảo đọc các nhận xét để hiểu hợp đồng này làm gì:
// Chỉ định phiên bản của Solidity, sử dụng lập phiên bản theo ngữ nghĩa.
// Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
pragma solidity ^0.7.0;
// Định nghĩa một hợp đồng có tên là `HelloWorld`.
// Một hợp đồng là một tập hợp các hàm và dữ liệu (trạng thái của nó). Sau khi được triển khai, một hợp đồng nằm tại một Địa chỉ cụ thể trên Chuỗi khối Ethereum. Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
contract HelloWorld {
// Khai báo một biến trạng thái `message` có kiểu `string`.
// Các biến trạng thái là các biến mà giá trị của chúng được lưu trữ vĩnh viễn trong bộ nhớ của hợp đồng. Từ khóa `public` làm cho các biến có thể được truy cập từ bên ngoài một hợp đồng và tạo ra một hàm mà các hợp đồng hoặc máy khách khác có thể gọi để truy cập giá trị.
string public message;
// Tương tự như nhiều ngôn ngữ hướng đối tượng dựa trên lớp, hàm khởi tạo là một hàm đặc biệt chỉ được thực thi khi tạo hợp đồng.
// Các hàm khởi tạo được sử dụng để khởi tạo dữ liệu của hợp đồng. Tìm hiểu thêm:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors
constructor(string memory initMessage) {
// Chấp nhận một đối số chuỗi `initMessage` và thiết lập giá trị vào biến lưu trữ `message` của hợp đồng).
message = initMessage;
}
// Một hàm công khai chấp nhận một đối số chuỗi và cập nhật biến lưu trữ `message`.
function update(string memory newMessage) public {
message = newMessage;
}
}
Đây là một hợp đồng thông minh cực kỳ đơn giản, lưu trữ một thông điệp khi được tạo và có thể được cập nhật bằng cách gọi hàm update.
Bước 11: Kết nối MetaMask & Alchemy với dự án của bạn
Chúng ta đã tạo một ví MetaMask, tài khoản Alchemy và viết hợp đồng thông minh của mình, bây giờ là lúc kết nối cả ba.
Mọi giao dịch được gửi từ ví ảo của bạn đều yêu cầu một chữ ký sử dụng khóa riêng tư duy nhất của bạn. Để cung cấp cho chương trình của chúng ta quyền này, chúng ta có thể lưu trữ an toàn khóa riêng tư (và khóa API Alchemy) của mình trong một tệp môi trường.
Để tìm hiểu thêm về việc gửi các giao dịch, hãy xem hướng dẫn này về cách gửi các giao dịch bằng Web3.
Đầu tiên, hãy cài đặt gói dotenv trong thư mục dự án của bạn:
npm install dotenv --save
Sau đó, tạo một tệp .env trong thư mục gốc của dự án của chúng ta và thêm khóa riêng tư MetaMask cũng như URL API HTTP Alchemy của bạn vào đó.
- Làm theo các hướng dẫn này (opens in a new tab) để xuất khóa riêng tư của bạn
- Xem bên dưới để lấy URL API HTTP Alchemy
Sao chép URL API Alchemy
Tệp .env của bạn sẽ trông như thế này:
API_URL = "https://eth-sepolia.g.alchemy.com/v2/your-api-key"
PRIVATE_KEY = "your-metamask-private-key"
Để thực sự kết nối những thứ này với mã của chúng ta, chúng ta sẽ tham chiếu các biến này trong tệp hardhat.config.js của mình ở bước 13.
.env! Vui lòng đảm bảo không bao giờ chia sẻ hoặc để lộ tệp .env của bạn với bất kỳ ai, vì làm như vậy là bạn đang làm lộ các bí mật của mình. Nếu bạn đang sử dụng hệ thống kiểm soát phiên bản, hãy thêm .env của bạn vào tệp gitignore.Bước 12: Cài đặt Ethers.js
Ethers.js là một thư viện giúp việc tương tác và tạo các yêu cầu đến Ethereum dễ dàng hơn bằng cách bao bọc các phương thức JSON-RPC tiêu chuẩn bằng các phương thức thân thiện với người dùng hơn.
Hardhat giúp việc tích hợp các Plugin (opens in a new tab) trở nên cực kỳ dễ dàng để có thêm công cụ và chức năng mở rộng. Chúng ta sẽ tận dụng plugin Ethers (opens in a new tab) cho việc triển khai hợp đồng (Ethers.js (opens in a new tab) có một số phương thức triển khai hợp đồng cực kỳ gọn gàng).
Trong thư mục dự án của bạn, hãy nhập:
npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0"
Chúng ta cũng sẽ yêu cầu ethers trong hardhat.config.js của mình ở bước tiếp theo.
Bước 13: Cập nhật hardhat.config.js
Cho đến nay, chúng ta đã thêm một số phần phụ thuộc và plugin, bây giờ chúng ta cần cập nhật hardhat.config.js để dự án của chúng ta biết về tất cả chúng.
Cập nhật hardhat.config.js của bạn để trông như thế này:
require('dotenv').config();
require("@nomiclabs/hardhat-ethers");
const { API_URL, PRIVATE_KEY } = process.env;
/**
* @type import('hardhat/config').HardhatUserConfig
*/
module.exports = {
solidity: "0.7.3",
defaultNetwork: "sepolia",
networks: {
hardhat: {},
sepolia: {
url: API_URL,
accounts: [`0x${PRIVATE_KEY}`]
}
},
}
Bước 14: Biên dịch hợp đồng của chúng ta
Để đảm bảo mọi thứ đang hoạt động tốt cho đến nay, hãy biên dịch hợp đồng của chúng ta. Tác vụ compile là một trong những tác vụ được tích hợp sẵn của hardhat.
Từ dòng lệnh, hãy chạy:
npx hardhat compile
Bạn có thể nhận được cảnh báo về SPDX license identifier not provided in source file , nhưng không cần phải lo lắng về điều đó — hy vọng mọi thứ khác đều ổn! Nếu không, bạn luôn có thể nhắn tin trong Discord của Alchemy (opens in a new tab).
Bước 15: Viết tập lệnh triển khai của chúng ta
Bây giờ hợp đồng của chúng ta đã được viết và tệp cấu hình của chúng ta đã sẵn sàng, đã đến lúc viết tập lệnh triển khai hợp đồng của chúng ta.
Điều hướng đến thư mục scripts/ và tạo một tệp mới có tên là deploy.js , thêm nội dung sau vào đó:
async function main() {
const HelloWorld = await ethers.getContractFactory("HelloWorld");
// Bắt đầu triển khai, trả về một promise phân giải thành một đối tượng hợp đồng
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 làm rất tốt việc giải thích chức năng của từng dòng mã này trong hướng dẫn về Hợp đồng (opens in a new tab) của họ, chúng tôi đã áp dụng các giải thích của họ ở đây.
const HelloWorld = await ethers.getContractFactory("HelloWorld");
Một ContractFactory trong ethers.js là một sự trừu tượng hóa được sử dụng để triển khai các hợp đồng thông minh mới, vì vậy HelloWorld ở đây là một nhà máy (factory) cho các phiên bản của hợp đồng hello world của chúng ta. Khi sử dụng plugin hardhat-ethers, các phiên bản ContractFactory và Contract được kết nối với người ký đầu tiên theo mặc định.
const hello_world = await HelloWorld.deploy();
Việc gọi deploy() trên một ContractFactory sẽ bắt đầu việc triển khai và trả về một Promise phân giải thành một Contract. Đây là đối tượng có một phương thức cho từng hàm hợp đồng thông minh của chúng ta.
Bước 16: Triển khai hợp đồng của chúng ta
Cuối cùng chúng ta đã sẵn sàng để triển khai hợp đồng thông minh của mình! Điều hướng đến dòng lệnh và chạy:
npx hardhat run scripts/deploy.js --network sepolia
Sau đó, bạn sẽ thấy một cái gì đó giống như:
Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570
Nếu chúng ta truy cập Etherscan của Sepolia (opens in a new tab) và tìm kiếm địa chỉ hợp đồng của mình, chúng ta sẽ có thể thấy rằng nó đã được triển khai thành công. Giao dịch sẽ trông giống như thế này:
Địa chỉ From phải khớp với địa chỉ tài khoản MetaMask của bạn và địa chỉ To (Đến) sẽ ghi là “Contract Creation” (Tạo hợp đồng) nhưng nếu chúng ta nhấp vào giao dịch, chúng ta sẽ thấy địa chỉ hợp đồng của mình trong trường To:
Chúc mừng! Bạn vừa triển khai một hợp đồng thông minh lên chuỗi Ethereum 🎉
Để hiểu những gì đang diễn ra bên trong, hãy điều hướng đến tab Explorer (Trình khám phá) trong bảng điều khiển Alchemy (opens in a new tab) của chúng ta. Nếu bạn có nhiều ứng dụng Alchemy, hãy đảm bảo lọc theo ứng dụng và chọn “Hello World”.

Tại đây, bạn sẽ thấy một số lệnh gọi JSON-RPC mà Hardhat/Ethers đã thực hiện ngầm cho chúng ta khi chúng ta gọi hàm .deploy(). Hai lệnh gọi quan trọng cần nhắc đến ở đây là eth_sendRawTransaction (opens in a new tab), đây là yêu cầu thực sự ghi hợp đồng của chúng ta lên chuỗi Sepolia, và eth_getTransactionByHash (opens in a new tab) là yêu cầu đọc thông tin về giao dịch của chúng ta dựa trên mã băm (một mẫu điển hình khi thực hiện các giao dịch). Để tìm hiểu thêm về việc gửi các giao dịch, hãy xem hướng dẫn này về cách gửi các giao dịch bằng Web3
Đó là tất cả cho phần 1 của hướng dẫn này, trong phần 2, chúng ta sẽ thực sự tương tác với hợp đồng thông minh của mình bằng cách cập nhật thông điệp ban đầu của chúng ta, và trong phần 3, chúng ta sẽ xuất bản hợp đồng thông minh của mình lên Etherscan để mọi người đều biết cách tương tác với nó.
Bạn muốn tìm hiểu thêm về Alchemy? Hãy xem trang web (opens in a new tab) của chúng tôi. Không bao giờ muốn bỏ lỡ một bản cập nhật nào? Đăng ký nhận bản tin của chúng tôi tại đây (opens in a new tab)! Đảm bảo cũng tham gia Discord (opens in a new tab) của chúng tôi..





