簡體   English   中英

在 Hyperledger Fabric NodeJS 智能合約中實例化鏈碼后,如何防止調用“init”函數?

[英]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

波紋管是一個解釋為什么

  • 一旦初始化,鏈碼只能在我們升級鏈碼時再次初始化。
  • 這是chaincode存根接口是如何設計的,該chaincodestubinterface暴露功能初始化並援引與chaincode運行時交互。
  • 存根接口的實例由 init 和 invoke 函數接收作為參數。
  • 現在基於在 init/invoke 的 args 中接收到的存根對象,我們在鏈碼中構建函數,例如 createCar、deleteCar。

在世界狀態中使用一些flag數據是一個很好的解決方案,這樣您就不會重新運行世界狀態的初始設置。

您還可以在 init 函數中使用ClientIdentity 類來檢查函數調用者的身份,甚至檢查 ID 的屬性,以便只有管理員或操作員才能運行 init 函數。 (基於屬性的訪問控制。)

使用 fabric-contract-api 時,ClientIdentity 對象會自動包含在合同上下文中,因此您無需明確“要求”它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM