Ich versuche, ein DAPP mit zwei Verträgen zu erstellen, die Vermögenswerte generieren. Einer fungiert als "Fabrik" für die anderen Verträge. Von letzterem versuche ich, eine Funktion in der Fabrik aufzurufen, ohne ihre Adresse noch zu kennen, daher möchte ich sie als Argument übergeben. Dies führt zu einem Fehler in Remix, da dieser Vertrag offensichtlich noch nicht existiert.
Um die Situation zu vereinfachen, stellen Sie sich dieses Szenario in Remix vor (beide Verträge werden in dieselbe Datei geschrieben):
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;
}
}
Irgendwelche Ideen oder andere Ansätze? Mir ist klar, dass die Idee hinter dem obigen Vertrag in diesem Beispiel nicht viel Sinn macht, aber ich habe versucht, es so kurz wie möglich zu halten.
Danke schön!
Es gab eine Reihe von Kompilierungsfehlern in Ihrem Beispielcode, aber sobald ich diese behoben und address factory
in geändert habe AssetFactory factory
, scheint alles in Ordnung zu sein.
(Ich habe nur erraten, was name
Sie in der Zeile gemeint haben factory.createAsset(name)
. Wenn Sie ein einfaches Beispiel erstellen, stellen Sie sicher, dass Sie es tatsächlich getestet haben.)
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;
}
}
Nebenbei sind mir einige seltsame Vorgänge aufgefallen und ich fand einige Alternativen erwähnenswert.
Pragma Solidität 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; } }
Marlon Gelpke