Klaytn Docs Archive VN
  • Tài liệu của Klaytn
  • -
    • Tổng quan về Klaytn
      • Tại sao nên chọn Klaytn
      • Thiết kế của Klaytn
        • Cơ chế đồng thuận
        • Tài khoản
        • Giao dịch
          • Cơ bản
          • Ủy thác phí
          • Ủy thác phí một phần
          • Ethereum
        • Tính toán
          • Hợp đồng thông mình Klaytn
          • Mô hình thực thi
          • Chi phí tính toán
            • Chi phí tính toán (Các tài liệu trước)
          • Máy ảo Klaytn
            • Máy ảo Klaytn (Các tài liệu trước)
        • Lưu trữ
        • Phí giao dịch
          • Phí giao dịch (Các tài liệu trước)
        • Đồng tiền mặc định của Klaytn - KLAY
        • Nền kinh tế token
        • Quản trị
        • Đa kênh
        • KNI
      • Các giải pháp mở rộng
    • Bắt đầu
      • Triển khai hợp đồng thông minh bằng Foundry
      • Triển khai hợp đồng thông minh bằng Hardhat
      • Triển khai hợp đồng thông minh bằng KEN
        • Khởi chạy nút điểm cuối
        • Nạp tiền vào tài khoản
        • Cài đặt các công cụ phát triển
        • Triển khai hợp đồng thông minh
        • Kiểm tra quy trình triển khai
        • Quản lý tài khoản
          • Tạo tài khoản
          • Quản lý tài khoản
      • Môi trường phát triển
      • Nhận KLAY
    • Hợp đồng thông minh
      • Solidity - Ngôn ngữ của hợp đồng thông minh
      • Hợp đồng đã lập trước
        • Hợp đồng đã lập trước (Các tài liệu trước)
      • IDE và công cụ
        • Truffle
      • Hợp đồng mẫu
        • KlaytnGreeter
        • ERC-20
          • 1. Soạn hợp đồng thông minh ERC-20
          • 2. Triển khai hợp đồng thông minh
          • 3. Tương tác với token ERC-20 từ Ví Klaytn
        • ERC-721
          • 1. Soạn hợp đồng thông minh ERC-721
          • 2. Triển khai hợp đồng thông minh
      • Hướng dẫn kiểm thử
      • Hướng dẫn triển khai
      • Token tương thích Klaytn
      • Di chuyển hợp đồng Ethereum
    • Chạy một Node
      • Triển khai
        • Nút điểm cuối
          • Yêu cầu hệ thống
          • Hướng dẫn cài đặt
            • Tải xuống
            • Hướng dẫn cài đặt
            • Cấu hình
            • Khởi động EN
            • Thử việc cài đặt
          • các lệnh CLI ken
          • API JSON-RPC
        • Core Cell
          • Yêu cầu hệ thống
          • Cấu hình mạng
          • Hướng dẫn cài đặt
            • Tải xuống
            • Trước khi cài đặt
            • Thiết lập nút đồng thuận
              • Hướng dẫn cài đặt
              • Cấu hình
              • Khởi động CN
            • Thiết lập nút proxy
              • Hướng dẫn cài đặt
              • Cấu hình
              • Khởi động PN
            • Kiểm tra Core Cell
          • Giám sát thiết lập
          • Thiết lập H/A
        • Chuỗi dịch vụ
          • Bắt đầu
            • Thiết lập chuỗi dịch vụ 4 nút
            • Kết nối với Baobab
            • Chuyển giá trị chuỗi chéo
            • HA (Tính sẵn sàng cao) dành cho Chuỗi dịch vụ
            • Chuỗi dịch vụ lồng nhau
            • Chuyển giá trị giữa các chuỗi dịch vụ kết nối
          • Hướng dẫn sử dụng tham chiếu
            • Yêu cầu hệ thống
            • Tải xuống
            • Hướng dẫn sử dụng SCN
              • Cài đặt
              • Cấu hình
              • Bắt đầu/dừng SCN
              • Kiểm tra trạng thái nút
              • các lệnh kscn
              • các lệnh homi
            • Hướng dẫn sử dụng SPN/SEN
              • Cài đặt
              • Cấu hình
              • Bắt đầu/dừng nút
              • Kiểm tra trạng thái nút
            • Cấu hình cầu nối
            • Neo
            • Neo KAS
            • Chuyển giá trị
            • Tập tin cấu hình
            • Tập tin bản ghi
            • Genesis JSON
            • Nâng cấp & Nâng cấp căn bản
          • Hướng dẫn sử dụng
        • Tải Về Các Gói Dịch Vụ
          • v1.11.1
          • v1.11.0
          • v1.10.2
          • v1.10.1
          • v1.10.0
          • v1.9.1
          • v1.9.0
          • v1.8.4
          • v1.8.3
          • v1.8.2
          • v1.8.1
          • v1.8.0
          • v1.7.3
          • v1.7.2
          • v1.7.1
          • v1.7.0
          • v1.6.4
          • v1.6.3
          • v1.6.2
          • v1.6.1
          • v1.6.0
          • v1.5.3
          • v1.5.2
          • v1.5.1
          • v1.5.0
          • v1.4.2
          • v1.4.1
          • v1.4.0
          • v1.3.0
          • v1.2.0
          • v1.1.1
          • v1.0.0
          • v0.9.6
          • v0.8.2
    • Hướng dẫn hoạt động
      • Cấu hình
      • Nhật ký nút
      • Ghi bản ghi hoạt động
      • Lỗi & xử lý sự cố
      • Lệnh Klaytn
      • Thay đổi dữ liệu chuỗi
      • Di chuyển dữ liệu chuỗi
    • dApp Developers
      • API JSON-RPC
        • Tham chiếu API
          • eth
            • Cảnh báo
            • Tài khoản
            • Khối
            • Giao dịch
            • Cấu hình
            • Bộ lọc
            • Gas
            • Khác
          • klay
            • Tài khoản
            • Khối
            • Giao dịch
              • Làm việc với các loại giao dịch của Klaytn
            • Cấu hình
            • Bộ lọc
            • Gas
            • Khác
          • net
          • gỡ lỗi
            • Ghi bản ghi
            • Tạo hồ sơ
            • Theo dõi thời gian chạy
            • Gỡ lỗi thời gian chạy
            • Theo dõi VM
            • Theo dõi tiêu chuẩn VM
            • Kiểm tra chuỗi khối
          • quản trị viên
          • cá nhân
          • txpool
          • quản trị
        • Tham chiếu API chuỗi dịch vụ
          • cầu nối chính
          • cầu nối phụ
        • Mã lỗi giao dịch
      • Nhà cung cấp dịch vụ RPC
        • Điểm cuối công khai
      • SDK & thư viện để tương tác với Nút Klaytn
        • caver-js
          • Bắt đầu
          • Gửi giao dịch mẫu
          • Tham chiếu API
            • caver.tài khoản
            • caver.wallet
              • caver.wallet.keyring
            • caver.transaction
              • Cơ bản
              • Ủy thác phí
              • Ủy thác phí một phần
            • caver.rpc
              • caver.rpc.klay
              • caver.rpc.net
              • caver.rpc.governance
            • caver.contract
            • caver.abi
            • caver.kct
              • caver.kct.kip7
              • caver.kct.kip17
              • caver.kct.kip37
            • caver.validator
            • caver.utils
            • caver.ipfs
          • caver-js ~v1.4.1
            • Bắt đầu (~v1.4.1)
            • Tham chiếu API
              • caver.klay
                • Tài khoản
                • Khối
                • Giao dịch
                  • Cũ
                  • Chuyển giá trị
                  • Ghi chú về chuyển giá trị
                  • Cập nhật tài khoản
                  • Triển khai hợp đồng thông minh
                  • Thực thi hợp đồng thông minh
                  • Cancel
                • Cấu hình
                • Bộ lọc
                • Khác
              • caver.klay.net
              • caver.klay.tài khoảns
              • caver.klay.Contract
              • caver.klay.KIP7
              • caver.klay.KIP17
              • caver.klay.abi
              • caver.utils (~v1.4.1)
            • Di chuyển từ web3.js
        • caver-java
          • Bắt đầu
          • Tham chiếu API
          • caver-java ~v1.4.0
            • Bắt đầu (~v1.4.0)
            • Di chuyển từ web3j
        • ethers.js
        • web3.js
      • Hướng dẫn
        • Bộ công cụ trực tuyến của Klaytn
        • Ví dụ về ủy thác phí
        • Count DApp
          • 1. Thiết lập môi trường
          • 2. Sao chép Count DApp
          • 3. Cấu trúc thư mục
          • 4. Soạn hợp đồng thông minh
          • 5. Tổng quan về mã Frontend
            • 5-1. Thành phần số khối
            • 5-2. Thành phần xác thực
            • 5-3. Thành phần đếm
          • 6. Triển khai hợp đồng
          • 7. Chạy ứng dụng
        • Klaystagram
          • 1. Thiết lập môi trường
          • 2. Sao chép Klaystagram DApp
          • 3. Cấu trúc thư mục
          • 4. Soạn hợp đồng thông minh Klaystagram
          • 5. Triển khai hợp đồng
          • 6. Tổng quan về mã Frontend
          • 7. Trang thông tin
            • 7-1. Kết nối hợp đồng với Frontend
            • 7-2. Thành phần UploadPhoto
            • 7-3. Thành phần nguồn cấp dữ liệu
            • 7-4. Thành phần TransferOwnership
          • 8. Chạy ứng dụng
        • Building a Buy Me a Coffee dApp
          • 1. Project Setup
          • 2. Creating a BMC Smart Contract
          • 3. Testing the contract using scripts
          • 4. Deploying BMC Smart contract
          • 5. Building the BMC Frontend with React and Web3Onboard
          • 6. Deploying Frontend code on IPFS using Fleek
          • 7. Conclusion
        • Migrating Ethereum App to Klaytn
        • Connecting MetaMask
        • Connecting Remix
        • Verifying Smart Contracts Using Block Explorers
      • Công cụ dành cho nhà phát triển
        • Ví
          • Kaikas
          • Ví Klaytn
          • Két Klaytn
            • Thiết kế két Klaytn
            • Tạo két
            • Thêm tài sản
            • Gửi tài sản
            • Tương tác hợp đồng
            • Trình xây dựng giao dịch
            • Các điểm đến nút
            • Câu hỏi thường gặp
          • Thư Viện Ví
            • Web3Auth
            • Web3Modal
            • Web3-Onboard
        • Oracle
          • Hệ Thống Orakl
          • Witnet
          • SupraOracles
        • Trình duyệt khối
          • Klaytnscope
          • Klaytnfinder
        • Klaytn Contracts Wizard
    • Glossary
  • ---
    • Lịch sử nâng cấp căn bản của Klaytn
    • Klaytn 2.0
      • Gói Metaverse
      • Tính hoàn thiện và cải tiến
      • Tương thích với Ethereum
      • Quản trị phi tập trung
      • Quỹ sinh thái lớn
    • Câu hỏi thường gặp
    • Mã nguồn mở
    • Điều khoản sử dụng
    • Ngôn ngữ
  • ℹ️Latest Klaytn Docs
Powered by GitBook
On this page
  • Solidity và Klaytn
  • Cách viết hợp đồng thông minh
  • Cách biên dịch, triển khai và thực thi hợp đồng
  • Gỡ lỗi hợp đồng thông minh
  • Thực hành tốt nhất về hợp đồng thông minh
  • Tài liệu tham khảo
  1. -
  2. Hợp đồng thông minh

Solidity - Ngôn ngữ của hợp đồng thông minh

PreviousHợp đồng thông minhNextHợp đồng đã lập trước

Last updated 1 year ago

Chương này chỉ mô tả các khái niệm bậc cao, quy trình phát triển và các ví dụ được viết bằng Solidity vì tài liệu tham khảo về Solidity đã được cung cấp đầy đủ trang web chính thức của ngôn ngữ lập trình này. Về tiêu chuẩn kỹ thuật hoặc triển khai ngôn ngữ, vui lòng tham khảo các dưới đây. Nội dung của chương này được lấy từ nhiều trang web khác nhau được liệt kê trong phần .

Solidity và Klaytn

là một ngôn ngữ lập trình bậc cao kiểu tĩnh, hướng đến hợp đồng, được sử dụng để triển khai các hợp đồng thông minh trên nền tảng Ethereum. Mặc dù Solidity ban đầu được thiết kế cho Ethereum nhưng ngôn ngữ này cũng đủ tổng quát để viết các hợp đồng thông minh. Do đó, có thể sử dụng ngôn ngữ này trên các nền tảng blockchain khác, chẳng hạn như Klaytn.

Klaytn có khả năng tương thích chính thức với Máy ảo Ethereum (EVM) phiên bản London. Không đảm bảo tính tương thích ngược với các phiên bản EVM khác trên Klaytn. Do đó, chúng tôi khuyến nghị nên biên dịch mã Solidity với phiên bản mục tiêu Istanbul. Vui lòng tham khảo .

Nâng cấp giao thức v1.7.0 - thay đổi không tương thích bao gồm các mục liên quan đến lần hard fork Istanbul và các mục riêng của Klaytn. Nó đã được kích hoạt từ số khối #75,373,312 đối với mạng lưới Baobab và #86,816,005 đối với mạng lưới Cypress.

Nâng cấp giao thức v1.7.3 - thay đổi không tương thích bao gồm Base Fee từ lần hard fork London. Nó đã được kích hoạt từ số khối #80,295,291 đối với mạng lưới Baobab và #86,816,005 đối với mạng lưới Cypress.

Nâng cấp giao thức v1.8.0 - thay đổi không tương thích bao gồm Base Fee từ lần hard fork London. Nó đã được kích hoạt từ số khối #86,513,895 đối với mạng lưới Baobab và #86,816,005 đối với mạng lưới Cypress.

Có thể sử dụng các công cụ phát triển như (IDE hoạt động trên trình duyệt) và (công cụ phát triển) khi phát triển các hợp đồng thông minh cho Klaytn. Nhóm phát triển Klaytn sẽ cố gắng duy trì tính tương thích giữa các công cụ phát triển của Ethereum và Klaytn nhưng cũng có thể lựa chọn cung cấp cho các nhà phát triển hợp đồng thông minh trên Klaytn các phiên bản cải tiến hoặc cập nhật của các công cụ đó khi cần thiết.

Việc sử dụng Remix hoặc Truffle để phát triển hợp đồng thông minh rất tiện lợi nhưng ta cũng có thể sử dụng trình biên dịch Solidity cục bộ bằng cách xây dựng hoặc cài đặt nó theo hướng dẫn được mô tả trong trang web dưới đây:

Lưu ý rằng có hai trình biên dịch Solidity dòng lệnh:

  • solc: trình biên dịch với đầy đủ tính năng

    • Được đề cập trong tài liệu Solidity

  • solcjs: liên kết JavaScript cho solc

    • Được duy trì như một dự án riêng

    • Các tùy chọn dòng lệnh của solcjs không tương thích với các tùy chọn của solc.

Có thể tham khảo những tài liệu sau đây để bắt đầu sử dụng Solidity:

Cách viết hợp đồng thông minh

Phần này trình bày một ví dụ về mã nguồn Solidity để cung cấp cho người đọc ý tưởng về giao diện của hợp đồng thông minh và cách viết hợp đồng. Lưu ý rằng mã nguồn đưa ra trong ví dụ này chỉ nhằm mục đích giải thích và không dành cho mục đích sản xuất. Trong mã nguồn này, (require) có nghĩa là dòng này là bắt buộc đối với bất kỳ tập tin nguồn Solidity nào trong khi (optional) có nghĩa là dòng này không phải lúc nào cũng cần thiết. Ký hiệu Ln: không phải là một phần của mã nguồn Solidity và được đưa ra trong ví dụ chỉ để thể hiện số thứ tự dòng. Không thêm các ký hiệu này vào mã nguồn khi sử dụng trong thực tế.

L01: pragma solidity 0.5.12;   // (required) version pragma
L02:
L03: import "filename";        // (optional) importing other source files
L04:
L05: // (optional) smart contract definition
L06: contract UserStorage {
L07:    mapping(address => uint) userData;  // state variable
L08:
L09:    function set(uint x) public {
L10:       userData[msg.sender] = x;
L11:    }
L12:
L13:    function get() public view returns (uint) {
L14:       return userData[msg.sender];
L15:    }
L16:
L17:    function getUserData(address user) public view returns (uint) {
L18:       return userData[user];
L19:    }
L20: }

Mã trên khá là dễ hiểu nên nếu bạn đã quen thuộc với bất kỳ ngôn ngữ lập trình nào, bạn có thể bỏ qua phần giải thích dưới đây và chuyển đến phần tiếp theo. Tuy nhiên, đối với những người không hiểu rõ mã trên dùng để làm gì hoặc đối với những người lần đầu biết đến ngôn ngữ lập trình, chúng tôi xin đưa ra một mô tả ngắn về mã nguồn ở bên dưới:

  • Các phần nằm trong mã nguồn bắt đầu bằng hai dấu gạch chéo (//) là phần ghi chú chứ không phải mã; chúng được sử dụng để chú thích và giải thích mã. Trình biên dịch sẽ bỏ qua phần ghi chú này.

  • Câu lệnh pragma ở dòng L01 xác định phiên bản tối thiểu của trình biên dịch. - Câu lệnh import ở dòng L03 nhập tất cả các ký hiệu toàn cục từ "filename". filename phải là tên một tập tin có thực.

  • L05 - L20 xác định hợp đồng thông minh có tên là UserStorage. Từ khóa contract được đặt trước tên hợp đồng và khai báo rằng mã này đại diện cho một hợp đồng thông minh. Các hợp đồng trong Solidity tương tự như các lớp trong các ngôn ngữ hướng đối tượng. Mỗi hợp đồng có thể chứa các khai báo về biến trạng thái, hàm, mã điều chỉnh hàm, sự kiện, kiểu dữ liệu cấu trúc và kiểu dữ liệu enum. Ngoài ra, các hợp đồng có thể kế thừa từ các hợp đồng khác. Đoạn mã trong ví dụ chứa một định nghĩa hợp đồng nhưng một tập tin Solidity có thể chứa nhiều hơn một định nghĩa hợp đồng.

  • Ở dòng L07, userData là biến trạng thái thuộc loại ánh xạ. Biến trạng thái được lưu trữ vĩnh viễn trong bộ nhớ lưu trữ hợp đồng. Biến trạng thái userData duy trì một ánh xạ giữa address và một giá trị uint. Kiểu address chứa địa chỉ 20 byte (Klaytn sử dụng địa chỉ 20 byte tương tự như Ethereum).

  • Ở dòng L09, hàm public set được xác định để lưu giá trị x vào userData cho người gửi thông báo. Biến msg.sender là biến đặc biệt được xác định trong Solidity và đại diện cho địa chỉ của người gửi thông báo (tức là lệnh gọi hiện tại). Từ khóa public có nghĩa là hàm này là một phần của giao diện hợp đồng và có thể được gọi từ bên ngoài hoặc bên trong.

  • Các hàm get ở dòng L13 và getUserData ở dòng L17 được khai báo với từ khóa view, điều này có nghĩa là các hàm cam kết không thay đổi bất kỳ biến trạng thái nào. Khai báo của các hàm bao gồm returns (uint), có nghĩa là hàm trả về giá trị uint.

Cách biên dịch, triển khai và thực thi hợp đồng

Một cách để biên dịch mã Solidity là sử dụng trình biên dịch dòng lệnh solc. Trình biên dịch này có thể tạo các đầu ra khác nhau, từ các tập tin nhị phân và mã assembly đến cây cú pháp trừu tượng (parse tree). Giả sử rằng mã trên đã được lưu trong tập tin UserStorage.sol (dòng L03 không được bao gồm trong tập tin nguồn được hiển thị trên đây), dưới đây là một số ví dụ về cách biên dịch tập tin UserStorage.sol.

$ solc --bin UserStorage.sol
  • Lệnh này sẽ in kết quả biên dịch dưới dạng mã nhị phân, tức là bytecode.

solc -o output --bin --ast --asm UserStorage.sol
  • Trình biên dịch tạo một tập tin nhị phân (sử dụng --bin), cây cú pháp trừu tượng (sử dụng --ast) và mã assembly (sử dụng --asm) là các tập tin riêng biệt trong thư mục output.

solc --optimize --bin UserStorage.sol
  • Để đạt hiệu suất tốt hơn, có thể kích hoạt trình tối ưu hóa trong quá trình biên dịch bằng cách sử dụng cờ --optimize.

Dưới đây là một số tài liệu tham khảo để biên dịch, triển khai và thực thi các hợp đồng thông minh.

LƯU Ý: Mục này sẽ được cập nhật trong tương lai.

Gỡ lỗi hợp đồng thông minh

Việc gỡ lỗi mã Solidity khó hơn so với việc gỡ lỗi mã viết bằng các ngôn ngữ lập trình khác do thiếu các công cụ gỡ lỗi hiệu quả. Dưới đây là một số tài liệu tham khảo về việc gỡ lỗi Solidity.

LƯU Ý: Mục này sẽ được cập nhật trong tương lai.

Thực hành tốt nhất về hợp đồng thông minh

Việc nghiên cứu và tuân thủ các thực hành tốt nhất trong lập trình Solidity đóng vai trò rất quan trọng để loại bỏ các vấn đề về bảo mật và chất lượng mã trong hợp đồng thông minh của bạn. Dưới đây là một số tài liệu tham khảo về thực hành tốt nhất đối với Solidity.

LƯU Ý: Mục này sẽ được cập nhật trong tương lai.

Tài liệu tham khảo

Để biết thêm thông tin về cú pháp và ngữ nghĩa của ngôn ngữ Solidity, vui lòng tham khảo .

Tài liệu hướng dẫn sử dụng Solidity hàng đầu
Tài liệu Solidity
Sử dụng trình biên dịch dòng lệnh Solidity
Biên dịch hợp đồng bằng Remix
Chạy giao dịch với Remix
Tài liệu hướng dẫn Remix Learneth
Biên dịch hợp đồng bằng Truffle
Triển khai hợp đồng bằng Truffle
Gỡ lỗi giao dịch bằng Remix
Hướng dẫn về cách gỡ lỗi giao dịch bằng Remix
Gỡ lỗi hợp đồng bằng Truffle
Thực hành bảo mật hợp đồng thông minh
Trang Solidity GitHub
Bộ tài liệu Solidity
Bộ tài liệu Remix
Bộ tài liệu Truffle
Solidity
cách thiết lập phiên bản EVM của solc
Remix
Truffle
Cài đặt Trình biên dịch Solidity
solc-js
Tài liệu tham khảo
Tài liệu tham khảo