Contract-Deployment

部署同一合約的多個實例

  • November 10, 2018

我正在使用 truffle/web3/react 開發一個去中心化的公證應用程序。它需要部署同一合約的多個實例。

我設法通過系統資料庫 MyContractRegistry 部署了合約的多個實例 MyContract。

 const contractRegistry = contract(MyContractRegistry);
 contractRegistry.setProvider(web3.currentProvider);

 contractRegistry.deployed().then(function(instance) {
   registryInstance = instance;

   myArray.map(function(){
       return registryInstance
         .createCertificate(
           params
           { from: issuer }
         )        
   });

  });

上述程式碼有效,但如果 myArray 有 10 個元素,則 Metamask 將彈出 10 個確認對話框。是的,它應該和預期的一樣。

所以,我的問題是解決上述問題的更好方法是什麼。

最好的方法是擁有一個部署合約的合約。通過這種方式,您只需要一個交易來部署 N 個合約,它是 gas 高效的,並且您將擁有所有已部署合約的鏈上系統資料庫。

我遵循了 Jaime 建議的方法。它有效,再次感謝 Jaime!

MyContractRegistry.sol

function createCertificates(address[] _owners, bytes32[] _ownerNames, bytes32[] _grades) public {

   // Of course the isuer is allowed to create certificate!
   require(msg.sender == owner);

   for( uint i = 0; i<_owners.length; i++ ){

       address newCertificate = new MyContract(_owners[i], _ownerNames[i], _grades[i]);

       // store each certificate
       registeredCertificates.push(newCertificate);

       emit ContractCreated(newCertificate, _owners[i]);
   }
}

客戶端 web3:

contractRegistry.deployed().then(function(instance) {
return instance.createCertificates(
   owners,     // public addresses, "0xfE6D20...Fc4DdeaA"
   ownerNames, // "John", "Jimmy", etc
   grades,     // For example "A", "B", etc
   { from: issuer }
)});

但是,它僅適用於最多 15 個元素的數組。我希望它至少可以處理 100 個元素。有任何想法嗎?

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