web3 gibt 0x000000000000000000000000000000000000001 als Adresse zurück

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.

Geben Sie hier die Bildbeschreibung ein

In Asset(_name, _description, _manufacture, _price, id, msg.sender, true);setzen Sie onwerauf msg.sender, was unmöglich sein kann 0x0000000000000000000000000000000000000001(geschweige denn, dass alle den gleichen Wert erhalten). Irgendetwas in Ihrer angezeigten Tabelle ist durcheinander.
Wenn ich das erste Element von Assets[] protokolliere, erhalte ich das gleiche Ergebnis. Im Remix funktioniert es aber einwandfrei.

Antworten (2)

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.

Du hattest Recht. Ich habe den Vertrag neu aufgesetzt und jetzt ist alles in Ordnung. Danke!

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 erwartetRemix-Ergebnisse

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);

    })
})

Ergebnisse des Trüffeltests

Du hast Recht, aber es funktioniert nicht mit web3. ====> const asset1 = warte auf tracker.methods.assets(0).call(); Konsole.log (asset1); gibt dasselbe zurück:===> Ergebnis { '0': 'A', '1': 'A', '2': 'A', '3': '1', '4': '1', '5': '0x0000000000000000000000000000000000001', '6': falsch, Name: 'A', Beschreibung: 'A', Hersteller: 'A', Preis: '1', ID: '1', Eigentümer: '0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000 initialisiert: falsch }
komisch, weil es bei mir nur mit web3 funktioniert. Link zu einem Gist mit dem Code, den ich verwende gist.github.com/RobertoC27/4900705b2a01d4253402964d85177a09
Haben Sie ein 0x0...001-Adresskonto?