1. Đơn vị

1.1. Các đơn vị chung

  • kỳ lạ là đơn vị nhỏ nhất của Ether (1 kỳ lạ == 1)
  • gwei là đơn vị phụ thường được sử dụng để mô tả giá xăng (1) gwei == 1e9)
  • ete đơn vị (1) ete == 1e18)
Ghi chú:
Trong Solidity, chúng ta sẽ sử dụng số nguyên cho các phép tính và ngôn ngữ này không hỗ trợ việc sử dụng số nguyên. trôi nổi kiểu dữ liệu. Vấn đề biểu diễn số thực gây ra lỗi làm tròn (làm tròn) tạo ra những lỗ hổng logic để tấn công.

1.2. Đơn vị thời gian

  • 1 == 1 giây
  • 1 phút == 60 giây
  • 1 giờ == 60 phút
  • 1 ngày == 24 giờ
  • 1 tuần == 7 ngày

Ví dụ

chức năng f ( uint start, uint daysAfter ) public {    nếu (block.timestamp >= start + daysAfter * 1 days) {        // ...
} }

2. Biến toàn cục

2.1. Thuộc tính khối và giao dịch

  • blockhash(uint blockNumber) trả về (bytes32): mã băm của khối đã cho khi số khối là một trong 256 khối gần đây nhất; nếu không thì trả về số không.
  • block.basefee (uint): phí cơ bản của khối hiện tại
  • block.chainid (uint): ID chuỗi hiện tại
  • block.coinbase (địa chỉ thanh toán)Địa chỉ của người khai thác khối hiện tại:
  • block.gaslimit (uint): giới hạn khí của khối hiện tại
  • khối.số (uint): số khối hiện tại
  • block.timestamp (uint): dấu thời gian của khối hiện tại tính bằng giây kể từ kỷ nguyên Unix
  • gasleft() trả về (uint256)lượng khí còn lại
  • msg.data (bytes calldata): dữ liệu cuộc gọi hoàn chỉnh
  • msg.sender (địa chỉ)Người gửi tin nhắn (cuộc gọi hiện tại)
  • msg.sig (bytes4): bốn byte đầu tiên của dữ liệu cuộc gọi (tức là mã định danh hàm)
  • msg.value (uint): số lượng wei được gửi kèm theo tin nhắn
  • tx.gasprice (uint): giá xăng của giao dịch
  • tx.origin (địa chỉ): người gửi giao dịch (chuỗi lệnh gọi đầy đủ)

2.2. Xử lý lỗi

  • khẳng định(điều kiện boolean): gây ra lỗi Panic và do đó dẫn đến việc đảo ngược trạng thái nếu điều kiện không được đáp ứng - được sử dụng cho các lỗi nội bộ.
  • yêu cầu (điều kiện boolean): Hoàn nguyên nếu điều kiện không được đáp ứng - được sử dụng cho các lỗi trong dữ liệu đầu vào hoặc các thành phần bên ngoài.
  • yêu cầu (điều kiện boolean, thông báo bộ nhớ chuỗi): Hoàn nguyên nếu điều kiện không được đáp ứng - được sử dụng cho các lỗi trong dữ liệu đầu vào hoặc các thành phần bên ngoài. Đồng thời cung cấp thông báo lỗi.
  • hoàn tác(): Hủy bỏ quá trình thực thi và hoàn tác các thay đổi trạng thái
  • hoàn nguyên (lý do bộ nhớ chuỗi): dừng thực thi và hoàn tác các thay đổi trạng thái, cung cấp một chuỗi giải thích

2.3. Các thành viên của các loại địa chỉ

  • <address>.balance (uint256): số dư của Địa chỉ ở Wei
  • <address>.code (bytes memory)Mã số tại địa chỉ (có thể để trống)
  • <address>.codehash (bytes32): mã băm của địa chỉ
  • <address payable>.transfer(uint256 amount): Gửi số tiền Wei đã cho đến địa chỉ, sẽ hoàn trả nếu giao dịch thất bại, sẽ chuyển tiếp khoản trợ cấp xăng 2300, không thể điều chỉnh
  • <address payable>.send(uint256 amount) returns (bool): Gửi số tiền Wei đã cho đến địa chỉ, trả về false nếu thất bại, chuyển tiếp khoản trợ cấp xăng 2300, không thể điều chỉnh
  • <address>.call(bytes memory) returns (bool, bytes memory): Phát lệnh CALL cấp thấp với dữ liệu được cung cấp, trả về điều kiện thành công và dữ liệu trả về, chuyển tiếp toàn bộ gas khả dụng, có thể điều chỉnh
  • <address>.delegatecall(bytes memory) returns (bool, bytes memory): Phát lệnh DELEGATECALL cấp thấp với dữ liệu được cung cấp, trả về điều kiện thành công và dữ liệu trả về, chuyển tiếp tất cả gas khả dụng, có thể điều chỉnh
  • <address>.staticcall(bytes memory) returns (bool, bytes memory): Phát lệnh STATICCALL cấp thấp với dữ liệu đã cho, trả về điều kiện thành công và dữ liệu phản hồi, chuyển tiếp toàn bộ gas khả dụng, có thể điều chỉnh

2.4. Từ khóa liên quan đến hợp đồng

  • cái này: Hợp đồng hiện tại, có thể chuyển đổi rõ ràng sang Địa chỉ
  • siêu: Một hợp đồng ở cấp bậc cao hơn trong hệ thống phân cấp thừa kế.
  • tự hủy (địa chỉ người nhận thanh toán): Hủy hợp đồng hiện tại, chuyển tiền đến địa chỉ được chỉ định và kết thúc quá trình thực thi. Lưu ý rằng cơ chế tự hủy có một số đặc điểm riêng biệt được kế thừa từ EVM:
    • Chức năng nhận của hợp đồng nhận không được thực thi.
    • Hợp đồng chỉ thực sự bị hủy bỏ khi giao dịch kết thúc và việc hoàn trả có thể "khôi phục" lại sự hủy bỏ đó.

3. Biểu thức và cấu trúc điều khiển

3.1. Từ khóa được hỗ trợ

Có: nếu như, khác, trong khi, LÀM, , phá vỡ, Tiếp tục, trở lại, thử/nắm lấy Với ngữ nghĩa thông thường đã biết từ C hoặc JavaScript.

3.2. Gọi hàm

Chúng ta có thể gọi chức năng trong số 1 hợp đồng từ một nơi khác hợp đồngDưới đây là một ví dụ với 2 hợp đồng. Người gọiCallee.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract Callee {
    uint public x;
    uint public value;

    function setX(uint _x) public returns (uint) {
        x = _x;
        return x;
    }

    function setXandSendEther(uint _x) public payable returns (uint, uint) {
        x = _x;
        value = msg.value;

        return (x, value);
    }
}

contract Caller {
    function setX(Callee _callee, uint _x) public {
        uint x = _callee.setX(_x);
    }

    function setXFromAddress(address _addr, uint _x) public {
        Callee callee = Callee(_addr);
        callee.setX(_x);
    }

    function setXandSendEther(Callee _callee, uint _x) public payable {
        (uint x, uint value) = _callee.setXandSendEther{value: msg.value}(_x);
    }
}

3.3. Tạo hợp đồng mới với từ khóa mới

Chúng ta có thể sử dụng từ khóa mới để tạo một hợp đồng mới. AdvancedStorage.sol Ví dụ sẽ giải thích điều này chi tiết hơn.

4. Lưu trữ nâng cao

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;

contract AdvancedStorage {
    // Declare the address of a vault manager
    address public vaultManager;

    // Declare an error type for unauthorized access
    error OwnableUnauthorizedAccount(address account);

    // Constructor is a function that runs when the contract is initialized
    constructor() {
        // Assign the address of the deployer to the vault manager variable
        vaultManager = msg.sender;
    }

    // Declare the InvestmentVault Struct data type
    struct InvestmentVault {
        uint256 investmentDuration; // Thời gian đầu tư
        int256 returnOnInvestment; // % lãi suất trả về
        bool initialized; // Đã khởi tạo
        address identityCard; // Địa chỉ thẻ thông tin
    }
    // Declare a variable with the InvestmentVault type
    InvestmentVault private investmentVault;

    // This function initializes the investment vault
    function setInitialInvestmentVault(uint256 daysAfter, int256 _returnOnInvestment, address _vaultOwner) public {
        // We check if the initiator is the vaultManager
        if (msg.sender != vaultManager) {
            // This reverts all actions and reverts the transaction
            revert OwnableUnauthorizedAccount(msg.sender);
        }
        // Declare the investment duration
        uint256 _investmentDuration = block.timestamp + daysAfter * 1 days;

        // Create a new identity card for the customer
        CustomerIdentityCard customerIdentityCard = new CustomerIdentityCard(_vaultOwner);
        // Assign the address of the vault owner/customer to the mapping with the vault information
        investmentVault = InvestmentVault({investmentDuration: _investmentDuration, returnOnInvestment: _returnOnInvestment, initialized: true, identityCard: address(customerIdentityCard)});
    }

    // Function to change the return on investment
    function editReturnOnInvestment(int256 _newReturnOnInvestment) public {
        // require keyword works similarly to if and revert above
        require (msg.sender == vaultManager, "Unauthorized Manager");
        // Change the value of the interest rate
        investmentVault.returnOnInvestment = _newReturnOnInvestment;
    }

    // Function to return investmentVault information
    function retrieveInvestmentVault() public view returns (InvestmentVault memory _investmentVault) {
        return investmentVault;
    }

    // Function to return the address of the IdentityCard
    function retrieveCustomerInformation() public view returns (address) {
        return CustomerIdentityCard(investmentVault.identityCard).customer();
    }
}

// Contract that stores the address of the vault owner
contract CustomerIdentityCard {
    //  declares a variable to store the address of the customer
    address public customer;

    // initialize the contract and assign the address of the customer
    constructor(address _customer) {
        customer = _customer;
    }
}