【emit】
我們可以寫一個函數裡面加上 emit
這個動詞來觸發事件。
舉例來說:如果我們先建立事件並且於函數裡觸發它。
pragma solidity ^0.8.11;
contract Test {
event Deposit(address indexed _from, bytes32 indexed _id, uint _value);
function deposit(bytes32 _id) public payable {
emit Deposit(msg.sender, _id, msg.value);
}
}
後在 Javascript 使用 web3.js 的套件呼叫合約事件,web3.js 在之後的章節會特別介紹!
var abi = /* abi as generated using compiler */;
// 要使用合約內容必須要得到合約在 compiler 之後輸出的 abi
var ClientReceipt = web3.eth.contract(abi);
var clientReceiptContract = ClientReceipt.at("0x1234...ab67" /* address */);
// 呼叫事件 Deposit:
var event = clientReceiptContract.Deposit(function(error, result) {
if (!error)console.log(result);
});
在前端(dapp)回傳的結果如下:
{
"returnValues": {
"_from": "0x1111...FFFFCCCC",
"_id": "0x50...sd5adb20",
"_value": "0x420042"
},
"raw": {
"data": "0x7f...91385",
"topics": ["0xfd4...b4ead7", "0x7f...1a91385"]
}
}
如果我們今天輸入 0x05416460deb76d57af601be17e777b93592d8d4d4a4096c57876a91c84f4a712
也可以直接在 Remix 的下方互動環境看見一些資訊,包含 logs
等:
logs =
[
{
"from": "0x9DD41ECd6e1701CE34523ed98423c1eFb0805aBD",
"topic": "0x19dacbf83c5de6658e14cbf7bcae5c15eca2eedecf1c66fbca928e4d351bea0f",
"event": "Deposit",
"args": {
"0": "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4",
"1": "0x05416460deb76d57af601be17e777b93592d8d4d4a4096c57876a91c84f4a712",
"2": "0",
"_from": "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4",
"_id": "0x05416460deb76d57af601be17e777b93592d8d4d4a4096c57876a91c84f4a712",
"_value": "0"
}
}
]
接下來我們會一一介紹 indexed
, data
, topics
等專有名詞。
Last updated
Was this helpful?