Я пытаюсь создать DAPP с двумя контрактами, генерирующими активы. Один действует как «фабрика» для других контрактов. Из последнего я пытаюсь вызвать функцию на фабрике, еще не зная ее адреса, поэтому я хочу передать ее в качестве аргумента. Это вызывает ошибку в Remix, потому что этого контракта, очевидно, еще не существует.
Чтобы упростить ситуацию, подумайте об этом сценарии в Remix (оба контракта записаны в одном файле):
contract AssetFactory{
address[] deployedAssets;
function createAsset(string name) public {
address newAsset = new Asset(name);
deployedAssets.push(newAsset);
return newAsset;
}
}
contract Asset{
string name;
function Asset(string name) public{
name = name;
}
function ModifyAssetAndCreateNew(string name, address factory){
factory.createAsset(name);
name = name;
}
}
Любые идеи или другие подходы? Я понимаю, что идея приведенного выше контракта не имеет особого смысла в этом примере, но я постарался сделать его как можно короче.
Спасибо!
В вашем примере кода было несколько ошибок компиляции, но как только я их исправил и изменил address factory
на AssetFactory factory
, все выглядит хорошо.
(Я просто предположил, что name
вы имели в виду в строке factory.createAsset(name)
. Создавая простой пример, убедитесь, что вы действительно тестировали его.)
pragma solidity ^0.4.23;
contract AssetFactory {
Asset[] deployedAssets;
function createAsset(string name) public returns (Asset) {
Asset newAsset = new Asset(name);
deployedAssets.push(newAsset);
return newAsset;
}
}
contract Asset {
string name;
constructor(string _name) public {
name = _name;
}
function modifyAssetAndCreateNew(string _name, AssetFactory factory) public {
factory.createAsset(_name);
name = _name;
}
}
Кроме того, я заметил некоторые странные вещи и подумал, что стоит упомянуть некоторые альтернативы.
прочность прагмы 0,4,23;
contract AssetFactory { Asset[] public deployedAssets; function createAsset(string name) public returns (Asset) { Asset newAsset = new Asset(name); deployedAssets.push(newAsset); return newAsset; } function isFactory() public pure returns(bool isIndeed) { return true; } } contract Asset { string public name; AssetFactory factory; event LogAsset(address sender, bool isFactory); function Asset(string _name) public { name = _name; factory = AssetFactory(msg.sender); } // this seems like a strange thing to want. Consider removing it. function modifyAssetAndCreateNew(string _name) public { factory.createAsset(_name); name = _name; } }
Марлон Гелпке