Solidity

有沒有更好的方法來實現搜尋功能?

  • December 25, 2021

以下面的程式碼為例:

pragma solidity ^0.4.23; 

import "./MyContract.sol";  

contract MyFactory {  
   address[] public myContracts;    

   function createContract(string stringOne, string stringTwo, string stringThree) public {          
       address sender = msg.sender;     
       address newContract = new MyContract(sender, stringOne, stringTwo, stringThree);            
       myContracts.push(newContract);   
   }    

   function getAllContracts() public view returns(address[]) {     
       return myContracts;   
   } 
} 

然後還有這個:

pragma solidity ^0.4.23;  

contract MyContract {   
   address public createdBy;   
   string public stringOne;   
   string public stringTwo;   
   string public stringThree;    

   constructor(address sender, string one, string two, string three) public {     
       createdBy = sender;     
       stringOne = one;     
       stringTwo = two;     
       stringThree = three;   
   }    

   function getContractSummary() public view returns(address, string, string, string) {     
       return (       
           createdBy,       
           stringOne,       
           stringTwo,       
           stringThree     
       );   
   } 
}

我認為搜尋工廠創建的所有合約的最佳方法是在工廠中創建一個映射:

mapping(string => address) public contractNames;

在創建新合約時,我們可以將 stringOne 連同創建合約的地址一起推送到映射中。

然後我們可以呼叫公共 getter,這將創建並傳遞使用者搜尋詞。如果找到搜尋詞,我們可以取回部署合約的地址。

這種方法的唯一問題是我們只會收到與搜尋詞完全匹配的結果。

有沒有更好的方法來實現這個功能?或者這是最好的嗎?

在我看來,您應該重新制定分離關注點的方式,以便搜尋功能由軟體客戶端執行,這些客戶端可以是伺服器、瀏覽器、其他東西或所有這些。

看看這篇關於這個確切問題的觀點以獲得更詳細的解釋:https ://medium.com/solidified/the-joy-of-minimalism-in-smart-contract-design-b67fb4073422

希望能幫助到你。

您可以簡單地使用客戶需要的所有資訊發出事件。通過這些事件,您可以使用按字元串過濾的查詢來創建查詢。

pragma solidity ^0.4.23; 

import "./MyContract.sol";  

contract MyFactory {  
  address[] public myContracts;    

  // define event
  event ContractCreated(address _sender, string _stringOne, , string _stringTwo, string _ stringThree);

  function createContract(string stringOne, string stringTwo, string stringThree) public {          
      address sender = msg.sender;     
      address newContract = new MyContract(sender, stringOne, stringTwo, stringThree);            
      myContracts.push(newContract);  

      // create the event for contract creation 
      emit ContractCreated(sender, stringOne, stringTwo, stringThree);
  }    

  function getAllContracts() public view returns(address[]) {     
      return myContracts;   
  } 
} 

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