Wie überprüfe ich, ob struct zur Adresse gehört?

Ich versuche, einen Smart Contract zu erstellen, der es dem Vertragsersteller ermöglicht, Asset-Eigenschaften hinzuzufügen und einer Adresse zuzuordnen. Sobald dies erledigt ist, kann die Empfängeradresse es nun an eine andere Adresse senden, nur wenn es sich um den aktuellen Eigentümer handelt.

Ich habe versucht, eine Struktur „Asset“ zuzuweisen, indem ich eine Adresse der AssetId zuordnete, die die Anzahl der erstellten Assets ist.

Ich bin mir nicht sicher, ob es der richtige Ansatz ist, dies zu tun. Auch etwas verwirrt darüber, wie ich den aktuellen Besitzer anhand der AssetId überprüfen kann (da es keine where-Klausel wie in c#/LINQ gibt.) Und was wäre der richtige Weg, um ein Asset vom aktuellen Besitzer dem nächsten Besitzer zuzuweisen.

pragma solidity ^0.4.2;

contract AssetDistribution { 
address public issuer;
uint public assetCount;

event AllocationDetails(address from, address to, string description);

function AssetDistribution() {
    issuer = msg.sender;
    //ContractorDetails(issuer);
}

struct Asset {
    uint assetId;
    address currentOwner;
    string description;
    uint cost;
}
mapping (address=> mapping(uint=>Asset)) private owners;
//mapping(address=> mapping(uint=>bool)) private ownerPropertyCheck;

//creates an asset and allocates it to an address at the same time. 

function setCreateAsset(address newOwner, string description, uint cost) 
    returns(string) {
    if (msg.sender == issuer) {
    assetCount++;
    Asset memory myAsset = Asset(assetCount,newOwner,description,cost);      
    owners[newOwner][assetCount] = myAsset;
    AllocationDetails(msg.sender,newOwner,description);
    return "created By: government";
    //return strConcat("created By: ","test");
    } else { 
        return "This is not the creator";
    }
}

function getassetCount() constant returns(uint) {
    return assetCount;
}

function getOwner(uint id) returns(address) {
   //return
}

}

In C# hätte ich meistens eine Klasse mit Asset-Eigenschaften erstellt und den currentOwner geändert, wenn eine Übertragung erfolgt ist. Hier habe ich Probleme, mich auf ähnliche Weise zu nähern. Soll ich dafür überhaupt struct verwenden?

Edit One - Lösung für mich

Das Zuordnen der AssetId zu OwnerAddress und das Zuordnen von Adressen + AssetId zu Strukturen löste das Dilemma, das ich hatte

mapping(uint=>address) assetAddress;
mapping(address=>mapping(uint=>Asset)) ownerAssets ;

gibt die aktuelle Eigentümeradresse des Assets zurück

function getCurrentOwner(uint assetId) constant public returns (address) {
    return assetAddress[assetId];
}

prüft, ob die assetId (Id der Struktur) zur Adresse gehört

function isOwnerOfAsset(address userId, uint assetId) private constant returns(bool) {
    return assetAddress[assetId] == userId? true:false;
}

PS Ich habe meistens in C#/Backend codiert, der Sprung zur Solidität verwirrt mich ein wenig. Wenn Sie gute Ressourcen kennen, auf die Sie verweisen können, können Sie sie gerne teilen.

Antworten (1)

Da Zuordnungen nicht iterierbar sind, schlage ich vor, dass Sie eine Zuordnung beibehalten, um den Eigentümer eines Assets wie folgt zu identifizieren:

mapping (uint => address) private assetOwners;

Wenn Sie ein Asset erstellen setCreateAsset, legen Sie den Wert der Kontonummer mit dem Schlüssel von assetId fest.

assetOwners[assetCount] = newOwner;

Um die Kontonummer des Asset-Eigentümers der angegebenen AssetId zu erhalten,

address assetOwner = assetOwners[assetId];

Um ein Asset neu zuzuweisen, können Sie Folgendes tun:

 Asset newAsset = owners[currentOwner];
 newAsset.currentOwner = newOwner;
 owners[newOwner] = newAsset;
 delete owners[currentOwner];
Danke dir! Ihre Antwort gab mir eine gute Idee, wie ich an das herangehen sollte, was ich versuchte zu tun :)