11 sự kiện (events) thông dụng trong code web3 smart contract?
- Tải web3: Sự kiện này xảy ra khi web3 được tải vào trình duyệt của người dùng.
- Kết nối đến node: Sự kiện này xảy ra khi trình duyệt của người dùng kết nối đến một node của blockchain.
- Truy cập smart contract: Sự kiện này xảy ra khi trình duyệt của người dùng truy cập một smart contract được deploy trên blockchain.
- Gửi giao dịch: Sự kiện này xảy ra khi người dùng gửi một giao dịch đến smart contract.
- Nhận phản hồi giao dịch: Sự kiện này xảy ra khi trình duyệt của người dùng nhận được phản hồi từ smart contract sau khi gửi giao dịch.
- Lỗi: Sự kiện này xảy ra khi có lỗi xảy ra trong quá trình gửi giao dịch hoặc truy cập smart contract.
- Thay đổi trạng thái: Sự kiện này xảy ra khi trạng thái của smart contract hoặc dữ liệu trong smart contract thay đổi sau khi thực hiện một giao dịch.
- Truy vấn dữ liệu: Sự kiện này xảy ra khi người dùng truy vấn dữ liệu trong smart contract bằng cách sử dụng các hàm query.
- Đăng ký sự kiện: Sự kiện này xảy ra khi người dùng đăng ký để nhận thông báo về các sự kiện trong smart contract.
- Hủy đăng ký sự kiện: Sự kiện này xảy ra khi người dùng hủy đăng ký để nhận thông báo về các sự kiện trong smart contract.
- Hết hạn: Sự kiện này xảy ra khi một smart contract hoặc giao dịch hết hạn và không thể thực hiện nữa.
Chúng ta sẽ đi vào các đoạn code ví dụ cho các sự kiện bên trên để giúp bạn hiểu hơn về cách thực hiện:
Table of Contents
1. Tạo smart contract:
pragma solidity ^0.8.0;
contract MyContract {
address owner;
constructor() public {
owner = msg.sender;
}
}
Trong đoạn code trên, sự kiện tạo smart contract xảy ra khi contract MyContract được deploy lên blockchain và thực hiện hàm constructor(). Trong hàm constructor(), biến owner được gán bằng người gửi giao dịch (msg.sender)
2. Giao dịch:
pragma solidity ^0.8.0;
contract MyContract {
address owner;
uint balance;
constructor() public {
owner = msg.sender;
}
function deposit() public payable {
require(msg.value > 0);
balance += msg.value;
}
}
Trong đoạn code trên, sự kiện giao dịch xảy ra khi hàm deposit() được gọi. Hàm này yêu cầu người gửi giao dịch gửi tiền và sau đó cộng dồn số tiền vào biến balance.
3. Thay đổi dữ liệu:
pragma solidity ^0.8.0;
contract MyContract {
address owner;
uint balance;
mapping(address => bool) authorizedUsers;
constructor() public {
owner = msg.sender;
}
function authorizeUser(address _user) public {
require(msg.sender == owner);
authorizedUsers[_user] = true;
}
}
Trong đoạn code trên, sự kiện thay đổi dữ liệu xảy ra khi hàm authorizeUser() được gọi. Hàm này yêu cầu người gửi giao dịch phải là chủ sở hữu của smart contract và sau đó thay đổi trạng thái của người dùng trong bảng mapping authorizedUsers.
4. Hủy bỏ giao dịch:
pragma solidity ^0.8.0;
contract MyContract {
address owner;
uint balance;
mapping(address => bool) authorizedUsers;
constructor() public {
owner = msg.sender;
}
function cancelTransaction() public {
require(msg.sender == owner);
require(balance > 0);
msg.sender.transfer(balance);
balance = 0;
}
}
Trong đoạn code trên, sự kiện hủy bỏ giao dịch xảy ra khi hàm cancelTransaction() được gọi. Hàm này yêu cầu người gửi giao dịch phải là chủ sở hữu của smart contract và có số dư trong tài khoản của contract. Sau đó, hàm sẽ chuyển tiền về cho người gửi giao dịch và xóa số dư trong contract.
5. Lỗi:
pragma solidity ^0.8.0;
contract MyContract {
address owner;
uint balance;
mapping(address => bool) authorizedUsers;
constructor() public {
owner = msg.sender;
}
function withdraw() public {
require(msg.sender == owner);
require(authorizedUsers[msg.sender]);
require(balance >= msg.value);
msg.sender.transfer(msg.value);
balance -= msg.value;
}
}
Trong đoạn code trên, sự kiện lỗi xảy ra khi hàm withdraw() được gọi và một trong các yêu cầu (require) không được thỏa mãn (ví dụ: người gửi giao dịch không phải là chủ sở hữu của contract, người gửi giao dịch không được xác thực trong bảng mapping hoặc số dư trong contract không đủ để rút tiền).
6. Kết thúc:
pragma solidity ^0.8.0;
contract MyContract {
address owner;
uint balance;
mapping(address => bool) authorizedUsers;
constructor() public {
owner = msg.sender;
}
function selfdestruct() public {
require(msg.sender == owner);
selfdestruct(owner);
}
}
Trong đoạn code trên, sự kiện kết thúc xảy ra khi hàm selfdestruct() được gọi. Hàm này yêu cầu người gửi giao dịch phải là chủ sở hữu của smart contract và sau đó gỡ bỏ smart contract và chuyển tiền còn lại trong contract cho chủ sở hữu.
7. Truy cập web3:
if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
} else {
// set the provider you want from Web3.providers
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
}
Trong đoạn code trên, sự kiện truy cập web3 xảy ra khi web3 được tải vào trình duyệt của người dùng. Nếu web3 đã được tải trước đó, nó sẽ sử dụng web3.currentProvider, nếu không nó sẽ thiết lập provider từ Web3.providers và kết nối đến một node cụ thể trên địa chỉ http://localhost:8545.
8. Truy cập smart contract:
var contract = new web3.eth.Contract(abi, contractAddress);
Trong đoạn code trên, sự kiện truy cập smart contract xảy ra khi một đối tượng contract mới được tạo bằng cách sử dụng web3.eth.Contract với tham số ABI (Application Binary Interface) và địa chỉ của smart contract được deploy trên blockchain.
9. Đăng ký sự kiện:
contract.events.EventName({fromBlock: 0, toBlock: 'latest'}, function(error, event){ console.log(event); })
.on('data', function(event){
console.log(event);
})
.on('changed', function(event){
// remove event from local database
})
.on('error', console.error);
Trong đoạn code trên, sự kiện đăng ký sự kiện xảy ra khi hàm events.EventName() được gọi. Hàm này sẽ đăng ký cho sự kiện có tên “EventName” và truy vấn các giao dịch từ khối bắt đầu cho đến khối mới nhất. Khi sự kiện được gửi, hàm truyền vào sẽ được gọi với thông tin của sự kiện đó.
10. Hủy đăng ký sự kiện:
var event = contract.events.EventName({fromBlock: 0, toBlock: 'latest'}, function(error, event){ console.log(event); });
event.unsubscribe();
Trong đoạn code trên, sự kiện hủy đăng ký sự kiện xảy ra khi hàm unsubscribe() được gọi trên đối tượng sự kiện đã đăng ký. Điều này sẽ ngừng theo dõi và nhận thông báo về sự kiện đó.
11. Hết hạn:
pragma solidity ^0.8.0;
contract MyContract {
address owner;
uint balance;
uint expirationDate;
constructor() public {
owner = msg.sender;
expirationDate = now + 1 days;
}
function checkExpiration() public view returns (bool) {
return now >= expirationDate;
}
}
Trong đoạn code trên, sự kiện hết hạn xảy ra khi hàm checkExpiration() được gọi hoặc khi biến expirationDate đạt giá trị thời gian hiện tại hoặc sau nó. Trong hàm constructor(), expirationDate được gán bằng thời gian hiện tại cộng với một ngày. Hàm checkExpiration() trả về true nếu thời gian hiện tại lớn hơn hoặc bằng expirationDate, ngược lại trả về false.
Vietnam Pham – Click Digital
- Nếu bạn muốn đầu tư vào các công ty quảng cáo blockchain, chỉ cần MUA token Saigon (SGN) trên Pancakeswap: https://t.co/KJbk71cFe8 (đừng lo lắng về tính thanh khoản, hãy trở thành nhà đầu tư sớm)
- Được hỗ trợ bởi Công ty Click Digital
- Nâng cao kiến thức về blockchain
- Lợi nhuận sẽ dùng để mua lại SGN hoặc đốt bớt nguồn cung SGN để đẩy giá SGN tăng.
- Địa chỉ token trên mạng BSC: 0xa29c5da6673fd66e96065f44da94e351a3e2af65
- Twitter: https://twitter.com/SaigonSGN135
- Staking SGN: http://135web.net
- If you’d like to invest in blockchain advertising companies, just BUY Saigon token (SGN) on Pancakeswap: https://t.co/KJbk71cFe8 (do not worry about low liquidity, be the early investor)
- Backed by Click Digital Company
- Enhancing blockchain knowledge
- The profits will be used to repurchase SGN or burn a portion of the SGN supply to drive up the SGN price.
- BSC address: 0xa29c5da6673fd66e96065f44da94e351a3e2af65
- Twitter: https://twitter.com/SaigonSGN135
- Staking SGN: http://135web.net
Digital Marketing Specialist