在配置雲端服務整合觸發器時,您可以為觸發器配置過濾器,以便對區塊鏈資料進行過濾和簡單的處理。區塊鏈各類事件的資料結構請參考Fabric樣本訊息。 過濾器運算式遵循的文法請參考jq工具基本文法。
下面介紹如何使用過濾器對區塊鏈事件進行過濾和簡單的預先處理,本樣本通過Function Compute觸發器來示範功能,您需要按如下步驟準備環境:
下載雲端服務整合範例程式碼。
安裝Function Compute工具 Serverless Devs,具體可參見 Serverless Devs介紹及安裝方式。
進入目錄
event-with-filter使用s deploy將函數部署到Function Compute。進入Function Compute控制台,為我們剛才建立的函數
LoggerFunc開通日誌查詢。
配置雲端服務整合觸發器:
根據協助,填寫Function Compute執行個體的相關資訊。
在進階選項中,根據以下不同的樣本情境,填寫過濾器運算式。
進入
blockchain2sms目錄,按照注釋修改 main.js 中的配置參數,填入REST API地址、Refresh Token、通道名和智能合約名稱。更多資訊請參考文檔使用REST API。執行
npm install安裝依賴包,通過node main.js發起樣本交易。查看Function Compute的日誌,觀察收到的事件內容。
樣本情境
一、只推送滿足特定條件的事件
只推送智能合約事件名稱為 event-create-task 的事件:
事件類型選擇: Contract
過濾器配置:
select(.name=="event-create-task")推送資料樣本:
{
"content": "eyJuYW1lIjoidGFzay0xNTgwOTcxODQyOTM3IiwiY3JlYXRvciI6ImUyZWhtZnFhc3RoTVNQLm9jdG9wdXNfMjY4NDJfMTIzNDU2Nzg5MDEyMzQiLCJyZXF1aXJlcyI6WyJlMmVobWZxYXN0aE1TUC5vY3RvcHVzXzI2ODQyXzEyMzQ1Njc4OTAxMjM0Il0sImFwcHJvdmVkIjpudWxsLCJkZXNjcmlwdGlvbiI6IuekuuS+i+S7u+WKoe+8jHJlcXVpcmVzIOmFjee9ruWuoeaJueS7u+WKoeWujOaIkOmcgOimgemCo+S6m+eUqOaIt+WQjOaEj+OAgueUqOaIt+aPj+i/sOS4uiAn57uE57uHTVNQLueUqOaIt+WQjeensCcifQ==",
"id": "contract-131-ca144c3385f56a429b9e8874173f7c97fbb49de69f931aec583ec50222a3a2ed",
"instance_id": "csi-e2ehmfqasth-bcw7tzao2dzeo",
"name": "event-create-task",
"network": "channel3",
"platform": "Fabric",
"type": "Contract"
}二、只推送有效特定交易事件
只推送發送給智能合約 taskmgr 的交易,且交易狀態為有效:
事件類型選擇: Tx
過濾器配置:
select(.content.to=="taskmgr" and .content.state=="VALID")推送資料樣本:
{ "content": { "events": [ "event-create-task" ], "from": "e2ehmfqasthMSP.octopus_26842_12345678901234", "id": "3a2e0e375c6ee0d9c6c20d756e787db44d50bfeba51f22d8f262dd1556dedba0", "input": "[\"create\",\"task-1580971842937\",\"{\\n \\\"requires\\\": [\\\"e2ehmfqasthMSP.octopus_26842_12345678901234\\\"],\\n \\\"description\\\": \\\"樣本任務,requires 配置審批任務完成需要那些使用者同意。使用者描述為 '組織MSP.使用者名稱稱'\\\"\\n }\"]", "state": "VALID", "to": "taskmgr" }, "id": "tx-128-3a2e0e375c6ee0d9c6c20d756e787db44d50bfeba51f22d8f262dd1556dedba0", "instance_id": "csi-e2ehmfqasth-bcw7tzao2dzeo", "name": "3a2e0e375c6ee0d9c6c20d756e787db44d50bfeba51f22d8f262dd1556dedba0", "network": "channel3", "platform": "Fabric", "type": "Tx" }
三、只推送事件的部分內容
只推送智能合約事件的內容,且事件的名稱為 event-create-task:
事件類型選擇: Contract
過濾器配置:
select(.name=="event-create-task") | .content推送資料樣本:
"eyJuYW1lIjoidGFzay0xNTgwOTcxODQyOTM3IiwiY3JlYXRvciI6ImUyZWhtZnFhc3RoTVNQLm9jdG9wdXNfMjY4NDJfMTIzNDU2Nzg5MDEyMzQiLCJyZXF1aXJlcyI6WyJlMmVobWZxYXN0aE1TUC5vY3RvcHVzXzI2ODQyXzEyMzQ1Njc4OTAxMjM0Il0sImFwcHJvdmVkIjpudWxsLCJkZXNjcmlwdGlvbiI6IuekuuS+i+S7u+WKoe+8jHJlcXVpcmVzIOmFjee9ruWuoeaJueS7u+WKoeWujOaIkOmcgOimgemCo+S6m+eUqOaIt+WQjOaEj+OAgueUqOaIt+aPj+i/sOS4uiAn57uE57uHTVNQLueUqOaIt+WQjeensCcifQ=="
四、擷取區塊鏈的寫入情況
只推送智能合約 taskmgr 中所有 Key 的寫入情況,且狀態為有效交易:
事件類型選擇: Tx
過濾器配置:
select(.content.state=="VALID" and .content.to=="taskmgr") | .content.data.data.actions.[0].payload.action.proposal_response_payload.extension.results.ns_rwset[] | select(.namespace=="taskmgr") | .rwset.writes推送資料樣本:
[{"is_delete":false,"key":"\u0000e2ehmfqasthMSP.octopus_26842_12345678901234\u0000task-1581479306267\u0000","value":"eyJuYW1lIjoidGFzay0xNTgwOTcxODQyOTM3IiwiY3JlYXRvciI6ImUyZWhtZnFhc3RoTVNQLm9jdG9wdXNfMjY4NDJfMTIzNDU2Nzg5MDEyMzQiLCJyZXF1aXJlcyI6WyJlMmVobWZxYXN0aE1TUC5vY3RvcHVzXzI2ODQyXzEyMzQ1Njc4OTAxMjM0Il0sImFwcHJvdmVkIjpudWxsLCJkZXNjcmlwdGlvbiI6IuekuuS+i+S7u+WKoe+8jHJlcXVpcmVzIOmFjee9ruWuoeaJueS7u+WKoeWujOaIkOmcgOimgemCo+S6m+eUqOaIt+WQjOaEj+OAgueUqOaIt+aPj+i/sOS4uiAn57uE57uHTVNQLueUqOaIt+WQjeensCcifQ=="}]
五、對特定Key進行監控
監控智能合約 taskmgr 中特定 Key 的 Value 變化情況,且狀態為有效交易:
事件類型選擇: Tx
過濾器配置:
select(.content.state=="VALID" and .content.to=="taskmgr") | .content.data.data.actions.[0].payload.action.proposal_response_payload.extension.results.ns_rwset[] | select(.namespace=="taskmgr") | .rwset.writes[] | select(.key=="special_key")推送資料樣本:
{"is_delete":false,"key":"special_key","value":"MTA="}
六、匯出資料到資料庫表
利用過濾器我們可以將區塊鏈資料匯出至資料庫的自訂表格中。過濾器對資料進行處理轉換成一個Object的數組,每個Object表示需要插入的一行資料,Object的Key為表的列名,Value為需要插入的資料:
[
{
"columnName1": "value1",
"columnName2": "value2",
"columnName3": "value3",
},
{
"columnName1": "value3",
"columnName2": "value4",
"columnName3": "value5",
},
...
]將智能合約 taskmgr 所有合法交易的寫入內容匯出到以下表中:
表結構:
主鍵: (
event_id,namespace,key)event_id, 事件ID
namespace, 寫入的命名空間(智能合約名稱)
key, 寫入的Key
value, 經過Base64編碼的寫入值
create_time, 寫入的時間
tx_id, 對應的交易ID
is_delete, 是否為刪除操作
creator, 寫入操作的發起者
過濾器配置:
select(.content.state=="VALID" and .content.to=="taskmgr") | .id as $eventID | .content.id as $txID | .content.from as $creator | content.data.header.channel_header.timestamp as $createTime | .content.data.data.actions.[0].payload.action.proposal_response_payload.extension.results.ns_rwset | ap(.namespace as $namespace | .rwset.writes | map( .event_id = $eventID | .namespace = $namespace | .tx_id = $txID | .create_time = $createTime | .creator = $creator )) | dd事件類型選擇: Tx
推送資料樣本:
[ { "event_id": "tx-128-3a2e0e375c6ee0d9c6c20d756e787db44d50bfeba51f22d8f262dd1556dedba0", "namespace": "taskmgr", "tx_id": "3a2e0e375c6ee0d9c6c20d756e787db44d50bfeba51f22d8f262dd1556dedba0", "is_delete": false, "key": "\u0000e2ehmfqasthMSP.octopus_26842_12345678901234\u0000task-1581479306267\u0000", "value": "eyJuYW1lIjoidGFzay0xNTgwOTcxODQyOTM3IiwiY3JlYXRvciI6ImUyZWhtZnFhc3RoTVNQLm9jdG9wdXNfMjY4NDJfMTIzNDU2Nzg5MDEyMzQiLCJyZXF1aXJlcyI6WyJlMmVobWZxYXN0aE1TUC5vY3RvcHVXzI2ODQyXzEyMzQ1Njc4OTAxMjM0Il0sImFwcHJvdmVkIjpudWxsLCJkZXNjcmlwdGlvbiI6IuekuuS+i+S7u+WKoe+8jHlcXVpcmVzIOmFjee9ruWuoeaJueS7u+WKoeWujOaIkOmcgOimgemCo+S6m+eUqOaIt+WQjOaEj+OAgueUqOaIt+aPj+i/sOS4uiAn57uE57uHTVNQLueUqOaIt+WQjeensCcifQ==", "create_time": "2020-02-06T06:50:42.267092Z", "creator": "e2ehmfqasthMSP.octopus_26842_12345678901234" } ]