1. Đơn vị
1.1. Các đơn vị chung
kỳ lạlà đơn vị nhỏ nhất của Ether (1kỳ lạ== 1)gweilà đơ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ổikiể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== 60giây - 1
giờ== 60phút - 1
ngày== 24giờ - 1
tuần== 7ngà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 khisố khốilà 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ạiblock.chainid (uint): ID chuỗi hiện tạiblock.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ạikhối.số (uint): số khối hiện tạiblock.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 Unixgasleft() trả về (uint256)lượng khí còn lạimsg.data (bytes calldata): dữ liệu cuộc gọi hoàn chỉnhmsg.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ắntx.gasprice (uint): giá xăng của giao dịchtx.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áihoà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, vì, 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ọi Và Callee.
// 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;
}
}
Mục tiêu
Sau khi hoàn thành bài học này, bạn sẽ hiểu:
Tiến triển