Я пытаюсь создать смарт-контракт, который позволит создателю контракта добавлять свойства актива и выделять его по адресу. Как только это будет сделано, адрес получателя теперь может отправить его на другой адрес, только если он является текущим владельцем.
Я попытался выделить структуру «Актив», сопоставив адрес с идентификатором актива, который является количеством создаваемых активов.
Я не совсем уверен, что это правильный подход к этому. Также немного смущен тем, как я могу проверить текущего владельца на основе 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 меня немного смущает. Если вы знаете какие-либо хорошие ресурсы, на которые можно сослаться, не стесняйтесь делиться ими.
Поскольку сопоставления не повторяются, я предлагаю вам сохранить сопоставление для идентификации владельца актива следующим образом:
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];
вишнульфб