![](/img/trans.png)
[英]In a Hyperledger Fabric Smart Contract how do I turn on logging?
[英]How do you prevent the "init" function to be called after a chaincode has been instantiated in a Hyperledger Fabric NodeJS smart contract?
我正在編寫一個簡單的 NodeJS 智能合約。 它有一個init
方法,將在鏈碼實例化時調用:
'use strict';
const { Contract } = require('fabric-contract-api');
const shim = require('fabric-shim');
class BlueCoinContract extends Contract {
async init(ctx){
console.info('============= START : Init =============');
:
:
console.info('============= END : Init =============');
}
:
:
}
要實例化鏈碼,我使用以下命令:
peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n blue-coin -l "$CC_RUNTIME_LANGUAGE" -v 1.0 -c '{"Args":["init"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"
Args
屬性需要指定方法的名稱(即init
),以便在實例化期間調用它。
我最初認為init
方法只能在實例化期間調用,因為init
方法可能包含初始化世界狀態中某些值的代碼(例如,將值設置為零)。
但是,我意識到可以通過調用 invoke 命令在初始化之外調用相同的init
方法:
peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n blue-coin -c '{"function":"init","Args":[]}'
如果用戶可以在init
之后執行init
命令,則存在世界狀態中的值將重新初始化為其初始值的風險。
有沒有辦法防止這種情況? 我正在考慮在調用init
方法后在世界狀態中保存一個flag
。 通過這種方式,我可以讓init
方法首先檢查flag
,如果檢測到它已經存在則拋出錯誤(即,因為它之前已經被調用過)。
有沒有比我描述的更可接受/更合適的解決方案?
如果您嘗試使用 invoke 再次初始化鏈碼,您將獲得Invalid Smart Contract function name 。
波紋管是一個解釋為什么
在世界狀態中使用一些flag
數據是一個很好的解決方案,這樣您就不會重新運行世界狀態的初始設置。
您還可以在 init 函數中使用ClientIdentity 類來檢查函數調用者的身份,甚至檢查 ID 的屬性,以便只有管理員或操作員才能運行 init 函數。 (基於屬性的訪問控制。)
使用 fabric-contract-api 時,ClientIdentity 對象會自動包含在合同上下文中,因此您無需明確“要求”它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.