出現問題會需要寫log的日誌,區塊鏈怎麼寫入呢?就是使用Event,先看一下寫法
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract EventExample{
event Deposit(address _from, uint _value);
function deposit() public payable{
emit Deposit(msg.sender, msg.value);
}
}
通常會先定義 event 關鍵字,然後使用時用 emit 配合。
來看一下執行結果如下,正常執行!!
展開:
我們會發現多了一個 logs 這個就是智能合約的log,方便我們未來查詢log用
以下對格式說明一下:
{
"from": "0xd9145CCE52D386f254917e481eB44e9943F39138", // 重哪個錢包
"topic": "0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c",
"event": "Deposit", // 哪個function(事件)
"args": {
"0": "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4", // 參數1 index
"1": "0", // 參數2 index
"_from": "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4", // 參數1
"_value": "0" // 參數1
}
}
"topic": "0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c"
這段要特別說明,大家會想是啥
就是如下:其實是透過Keccak-256 的演算法編碼形成!(從這裡也發現 uint 預設是 uint256)
不過這部分略懂就好畢竟這個演算法如果要了解會需要很大一段時間...
知道用法後我們看一下實際會怎麼使用如果網頁上呼叫會怎樣呢?
// 這是網頁前端呼叫的部分代碼
var abi = /* abi as generated using compiler */; // 合約和個介面呼叫方式
var ClientReceipt = web3.eth.contract(abi); // web3 -> 網頁呼叫的套件(web3.js)
var clientReceiptContract = ClientReceipt.at("0x1234...ab67" /* address */); // 錢包
var event = clientReceiptContract.Deposit(function(error, result) {
if (!error)console.log(result);
});
如果有返回也是會返回前面的格式,如果有寫過程式的人就想像API即可
{
"from": "0xd9145CCE52D386f254917e481eB44e9943F39138", // 重哪個錢包
"topic": "0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c",
"event": "Deposit", // 哪個function(事件)
"args": {
"0": "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4", // 參數1 index
"1": "0", // 參數2 index
"_from": "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4", // 參數1
"_value": "0" // 參數1
}
}
進階說明:
這部份是方便查詢使用,如果你的測試都過了,這部分也不用加?俗話說不怕預防只怕萬一
特別介紹此修飾詞
Indexed
限制:此修飾詞一個function 最多3個
寫法如下:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract EventExport{
event Deposit(address indexed _from, uint indexed _value);
function deposit() public payable{
emit Deposit(msg.sender, msg.value);
}
}
有什麼不同?
let filter = this.contract_instance.filters.Transfer(null,[0x100]);
this.contract_instance.on(filter,(from, to, value, event) =>{
console.log("監控發送事件")
}
如果有這個 Indexed 方便我們操作篩選。
有任何問題可反饋: [email protected]