Ich versuche, mit MetaMask und web3.js ein Asset in einem Smart Contract zu erstellen:
contract AssetTracker {
struct Asset {
string name;
string description;
string manufacturer;
uint price;
uint id;
address owner;
bool initialized;
}
Asset[] public assets;
mapping(address => mapping(uint => bool)) public walletStore;
function createAsset(string _name, string _description, string _manufacture, uint _price, uint id) public {
Asset memory newAsset = Asset(_name, _description, _manufacture, _price, id, msg.sender, true);
assets.push(newAsset);
walletStore[msg.sender][id] = true;
}
}
Ich rufe erstellte Assets ab und rendere sie alle als Tabelle:
const assets = await Promise.all(
Array(parseInt(assetCount))
.fill()
.map((element, index) => {
return tracker.methods.assets(index).call();
})
);
renderRows() {
return this.props.assets.map((asset, index) => {
return (
<AssetRow
key={index}
id={index}
asset={asset}
/>
);
});
}
Das Problem ist, dass Adressen nicht richtig angezeigt werden. Sie sind wie 0x0x00000000000000000000000000000000000001 oder 0x000000000000000000000000000000000000007.
Das Konto, das einen Vermögenswert erstellt, wird Eigentümer dieses Vermögenswerts. In der createAsset-Funktion habe ich also msg.sender als Eigentümer und ich denke, das hat das Problem gemäß diesem Link verursacht. Die Lösungen im Link waren jedoch für meinen Fall nicht nützlich. Kann mir jemand helfen das Problem zu lösen? Um Adressen richtig anzuzeigen, wie sie in MetaMask sind.
Es besteht die Möglichkeit, dass dies ein Entwicklungsproblem ist, Sie können mit der alten Version von Smart Contract in einem bestimmten Netzwerk kommunizieren. Stellen Sie sicher, dass Sie das richtige Netzwerk und die richtige Vertragsadresse verwenden, oder Sie können die neueste Vertragsversion neu kompilieren, bereitstellen und einen neuen Vertrag ausprobieren.
Erhalten Sie gespeicherte Assets mit dem richtigen Index? weil das Testen sowohl mit Remix als auch mit Trüffel funktioniert
Die Verwendung Ihres Vertrags für Remix funktioniert wie erwartet
auch das Testen mit Trüffel funktioniert
const Manager = artifacts.require('AssetTracker');
contract('asset manager', () => {
it('works', async () => {
let instance = await Manager.deployed();
await instance.createAsset("asset1", "house", "bob builder", 123, 0);
await instance.createAsset("asset2", "house", "bob builder", 123, 1);
await instance.createAsset("asset3", "house", "bob builder", 123, 2);
const stored_assets = "3";
const assets = await Promise.all(
Array(parseInt(stored_assets))
.fill()
.map((element, index) => {
return instance.assets(index);
})
);
console.log(assets);
})
})
gute Stimmung
Asset(_name, _description, _manufacture, _price, id, msg.sender, true);
setzen Sieonwer
aufmsg.sender
, was unmöglich sein kann0x0000000000000000000000000000000000000001
(geschweige denn, dass alle den gleichen Wert erhalten). Irgendetwas in Ihrer angezeigten Tabelle ist durcheinander.Parasto