Contract-Development

智能合約功能能否提示不同實體進行某些輸入

  • December 26, 2020

假設在我的系統中我有不同的節點。在定期的時間間隔中,這些節點中的一些可以被選為“黃金節點”,這意味著例如它們需要進行一些計算。是否有可能製作一個智能合約功能,它接受來自每個“黃金節點”的輸入並僅在每個“黃金節點”輸入其輸入後執行?

這個問題有點不清楚,但是……

如果您指的是乙太坊智能合約:

是的,契約可以有公共方法,它接受來自任何地方的輸入(並過濾它 - 即通過一些預定義的特徵確定您條款中的“黃金節點”)。

是的,在收集了一些輸入請求之後,契約可能會做其他事情(“執行”你寫的東西)。

但契約不能主動做某事。這意味著它應該“在”最後一個(來自最後一個“黃金節點”)請求中執行進一步的操作。您在這裡的職責是定義最後一個請求(以及什麼節點是“黃金”,正如我上面提到的)

這個問題還不夠清楚,但如果我理解你的話。當所有的 goldNodes 都回复時,您需要執行一個操作,然後等待。我正在分享一個範常式式碼,其中allGoldNodesReplied為假,當所有節點回复時,它被認為是真。

為此,您的合約必須知道所有goldNodes資訊及其數量,也許還有更多資訊,以防止一個 GoldNode 回复兩次,因此您可能必須為此管理許多狀態。希望給出的例子有所幫助。


contract GoldNodes {

   address goldNodeOwner ;

   // tracking all goldNodes
   mapping (address => bool) isGoldNode;
   uint goldNodeCount = 0;

   // prevent same node from replying twice
   mapping (address => bool) hasGoldNodeReplied;    
   uint replyCount = 0;

   // action that has to be performed when all GoldNodes reply
   bool allGoldNodesReplied = false;


   constructor() public{
       goldNodeOwner = msg.sender;
   }


   function addGoldNode(address _goldNode) public {
       // some admin that can invoke smart contract when some gold node is added to the system
       require(msg.sender == goldNodeOwner, "only gold owner allowed");
       isGoldNode[_goldNode] = true;
       goldNodeCount++; // use SafeMath here
   }

   function reply() public {
       require(isGoldNode[msg.sender], "only gold nodes can reply");
       require(!hasGoldNodeReplied[msg.sender], "Can not reply twice");
       replyCount++;
       hasGoldNodeReplied[msg.sender] = true;
       if(replyCount == goldNodeCount){
           allGoldNodesReplied = true;
       }

   }

}

引用自:https://ethereum.stackexchange.com/questions/39782