Как проверить, принадлежит ли структура адресу?

Я пытаюсь создать смарт-контракт, который позволит создателю контракта добавлять свойства актива и выделять его по адресу. Как только это будет сделано, адрес получателя теперь может отправить его на другой адрес, только если он является текущим владельцем.

Я попытался выделить структуру «Актив», сопоставив адрес с идентификатором актива, который является количеством создаваемых активов.

Я не совсем уверен, что это правильный подход к этому. Также немного смущен тем, как я могу проверить текущего владельца на основе AssetId (поскольку нет предложения where, как в С#/LINQ.) И как правильно назначить актив от текущего владельца следующему владельцу.

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
}

}

В C# я бы в основном создал класс со свойствами активов и изменил бы currentOwner при выполнении передачи. Здесь у меня возникают проблемы с подходом аналогичным образом. Должен ли я даже использовать структуру для этого?

Изменить один - решение для меня

сопоставление assetsId с ownerAddress и сопоставление адресов + assetsId со структурами решило дилемму, с которой я столкнулся

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

возвращает текущий адрес владельца актива

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

проверяет, принадлежит ли assetsId (идентификатор структуры) адресу

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

PS Я в основном кодировал на C#/Backend, переход к Solidity меня немного смущает. Если вы знаете какие-либо хорошие ресурсы, на которые можно сослаться, не стесняйтесь делиться ими.

Ответы (1)

Поскольку сопоставления не повторяются, я предлагаю вам сохранить сопоставление для идентификации владельца актива следующим образом:

mapping (uint => address) private assetOwners;

при создании актива внутри setCreateAssetустановить значение номера счета с ключом assetsId,

assetOwners[assetCount] = newOwner;

Чтобы получить номер учетной записи владельца актива с заданным идентификатором актива,

address assetOwner = assetOwners[assetId];

Чтобы переназначить актив, который вы можете сделать,

 Asset newAsset = owners[currentOwner];
 newAsset.currentOwner = newOwner;
 owners[newOwner] = newAsset;
 delete owners[currentOwner];
Спасибо! Ваш ответ дал мне хорошее представление о том, как подойти к тому, что я пытался сделать :)