W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
當(dāng)智能合約中發(fā)生智能合約想要與 ?dapp
?和其他智能合約通信的有意義的事情時(shí),智能合約會(huì)發(fā)出所謂的事件。 智能合約的開(kāi)發(fā)人員決定何時(shí)發(fā)出這些事件。 例如 - 當(dāng)有人發(fā)送 ERC20 代幣時(shí) - 代幣合約將發(fā)出一個(gè)包含有關(guān)轉(zhuǎn)賬的所有數(shù)據(jù)的 ?Transferevent
?。
當(dāng)您構(gòu)建 ?dapps
?時(shí),能夠?qū)崟r(shí)收聽(tīng)這些事件對(duì)您來(lái)說(shuō)非常重要。 例如,如果您正在構(gòu)建 NFT 市場(chǎng),您的 ?dapp
?需要知道何時(shí)有人創(chuàng)建了新的拍賣(mài)或有人對(duì)某項(xiàng)商品出價(jià)——智能合約將通過(guò)發(fā)出事件來(lái)傳達(dá)這些事件。
幸運(yùn)的是,Moralis Server 內(nèi)置了此功能。
您可以實(shí)時(shí)收聽(tīng)智能合約事件,還可以獲取特定事件的所有歷史事件。
您可以從特定的智能合約主題中獲取所有歷史事件并實(shí)時(shí)收聽(tīng)新事件。 它需要以下信息:
_description
?:_用于標(biāo)識(shí)此同步作業(yè)的簡(jiǎn)短描述。_topic
?: _你將要聽(tīng)的主題,這可以是定義或 sha3:bet(address,uint256,bool)
?0x20d932006281d267f137cd3921b707c2097e1f041b1291181cc3d0e86f449ebb
?abi
?:如果您為此事件提供 abi,Moralis 將自動(dòng)解析所有字段并相應(yīng)地填充架構(gòu)。address
?:您將為此事件收聽(tīng)的地址。tableName
?:將在 Moralis 數(shù)據(jù)庫(kù)中創(chuàng)建的子類(lèi)的名稱(chēng)。如果您不提供 _**abi **_,則將使用以下架構(gòu):
{
"objectId": String,
"block_hash": String,
"topic0": String,
"topic1": String,
"block_timestamp": Date,
"ACL": ACL,
"data": String,
"updatedAt": Date,
"transaction_hash": String,
"transaction_index": Number,
"address": String,
"log_index": Number,
"createdAt": Date,
"block_number": Number
}
這是一個(gè)有效 ?abi
?的示例:
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "bet",
"type": "uint256"
},
{
"indexed": true,
"internalType": "bool",
"name": "win",
"type": "bool"
},
{
"indexed": false,
"internalType": "uint8",
"name": "side",
"type": "uint8"
}
],
"name": "bet",
"type": "event"
}
如果提供的 ?abi
?包含“?id
?”輸入,則由于在 Moralis.Object 中保留字段“?id
?”,它將被解析為“?uid
?”
表名不允許包含數(shù)字字符(0 到 9)
以 ?_
? 開(kāi)頭的名稱(chēng)字段暫時(shí)不起作用,例如 ?"name": "_side"
? 將不起作用,您必須將其更改為 ?"name": "side"
? 才能使其起作用 .
如果創(chuàng)建的同步作業(yè)會(huì)導(dǎo)致檢索更多歷史事件,則?Sync_historical
?選項(xiàng)將被禁用并且不會(huì)保存歷史數(shù)據(jù)??梢月?lián)系支持人員升級(jí)您的帳戶(hù)以啟用保存它,無(wú)論如何,但在這樣做之前要仔細(xì)考慮是否真的有必要??梢詫?shí)時(shí)處理事件而無(wú)需將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中。
要編輯同步作業(yè),請(qǐng)單擊安裝插件的服務(wù)器上的查看詳細(xì)信息,然后轉(zhuǎn)到?sync
?選項(xiàng)卡。 在那里,您將看到所有同步作業(yè)。 單擊?Edit
?按鈕。
由于進(jìn)行任何更改都可能對(duì)事件架構(gòu)造成重大更改,因此保存更改需要提供新的 ?tableName
?。
如果未提供新表名,您將看到以下錯(cuò)誤消息:
想象一下,您只想根據(jù)某些條件在數(shù)據(jù)庫(kù)中獲取事件。
Moralis 為您提供了一種基于 ABI 變量定義過(guò)濾器的簡(jiǎn)單方法。
例如,下面的過(guò)濾器將僅同步可變?price
?等于 80000000000000000 的事件實(shí)例:
?{“eq”:[“price”,“80000000000000000”]}
?
下面是更多過(guò)濾器示例。 您可以為事件中的任何變量設(shè)置條件。
If ?sender
?= ?0x0
? AND ?receiver
?=? 0x0
?
{
"and": [
{ "eq": ["sender", "0x0"] },
{ "eq": ["receiver", "0x0"] }
]
}
If ?sender
?= ?0x0
? OR ?receiver
?= ?0x0
?
{
"or": [
{ "eq": ["sender", "0x0"] },
{ "eq": ["receiver", "0x0"] }
]
}
If (?sender
?= ?0x0
? AND ?amount
?= ?1000
?) OR (?receiver
?= ?0x0
? AND ?amount
?= ?100
?)
{
"or": [
{
"and": [
{ "eq": ["sender", "0x0"] },
{ "eq": ["amount", "1000"]}
]
},
{
"and": [
{ "eq": ["receiver", "0x0"] },
{ "eq": ["amount", "1000"]}
]
}
]
}
如果一個(gè)事件有 ?wei
?命名的值,你可以使用 ?<name>_decimals
? 字段來(lái)運(yùn)行比較(比如大于/小于):
{
"and": [
{ "eq": ["sender", "0x0"] },
{ "gt": ["amount_decimals", "1000"]}
]
}
Moralis Server 有一個(gè)特殊的云功能,稱(chēng)為 ?watchContractEvent(options)
?。 您可以使用主密鑰調(diào)用它。
注意:?limit
?參數(shù)僅適用于 Nitro 服務(wù)器(具有 ?coreservices
?插件的服務(wù)器)。 如果未提供限制參數(shù),則默認(rèn)值為 500000。
注意:目前通過(guò)代碼創(chuàng)建的事件不會(huì)在管理界面中看到,您只能在數(shù)據(jù)庫(kù)中看到它們,我們正在努力正確連接管理界面
// code example of creating a sync event from cloud code
let options = {
chainId: "0x1",
address: "0x5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f",
topic: "PairCreated(address, address, address, uint256)",
abi: {
anonymous: false,
inputs: [
{
indexed: true,
internalType: "address",
name: "token0",
type: "address",
},
{
indexed: true,
internalType: "address",
name: "token1",
type: "address",
},
{
indexed: false,
internalType: "address",
name: "pair",
type: "address",
},
{
indexed: false,
internalType: "uint256",
name: "test",
type: "uint256",
},
],
name: "PairCreated",
type: "event",
},
limit: 500000,
tableName: "UniPairCreated",
sync_historical: false,
};
Moralis.Cloud.run("watchContractEvent", options, { useMasterKey: true });
// unwatch event that has TABLE_NAME as table in the database
let options = { tableName: "TABLE_NAME" };
Moralis.Cloud.run("unwatchContractEvent", options, { useMasterKey: true });
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: