Contract-Deployment
部署同一合約的多個實例
我正在使用 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 個元素。有任何想法嗎?