Solidity

契約中的一對多關係

  • October 24, 2018

If id(Eg:1) 結構中的欄位不是唯一的,並且不同的名稱映射到相同的id=1. id=1可以從區塊鏈中獲取所有映射的名稱嗎?

pragma solidity ^0.4.4;

contract Register{

struct Details{
 bytes id;
 string name;

 }
mapping (bytes => Details) DetailsTable;

function saveBondToBC(bytes id,string name) 
payable returns(bool success){

DetailsTable[id].id = id;
DetailsTable[id].name = name;
return true;
}

function getAllNames(bytes id) return (string){
DetailsTable[id].name; //Return latest 'name' written
}     

謝謝,這個對我有用:)

struct IdStruct{

bytes12[] structArray; 
}

mapping(string => IdStruct) idStructs;

function appendNames(string id, bytes12 name) payable returns (bool success){ 
idStructs[id].structArray.push(name); 
} 

function getName(string id) returns(bytes12[]){ 
return idStructs[id].structArray; 
}

映射是唯一的(或關係數據庫術語中的多對一關係)。例如,如果 id 123 映射到名稱 Vitalik。Id 123 只能導致 Vitalik 而沒有其他價值!然而,其他 id(例如 947)也可以指向 Vitalik(多對一關係)。

例如,如果您將映射更新123 => Vitalik123 => Gavin,那麼很明顯 id 123 將僅指向 Gavin 和 Gavin。

我不確定這是否明顯,但為了清楚起見,在這些行中

DetailsTable[id].id = id;
DetailsTable[id].name = name;

您根本不會更新映射,而只會更新結構中的欄位。此外,如果您的 id 是兩個不同的值,我會找到更好的名稱。如果您在結構中的 id 與映射的 id 相同,則沒有必要再次將 id 儲存在結構中(這會產生冗餘,並且只會增加保持兩個值同步的成本)。

如果您不跟踪您的 id(在您的智能合約中或數據庫中的非區塊鏈中),您也不能循環映射既不知道哪些 id 已被初始化(所有映射都是有效的)

在您的智能合約中,您可以為此創建一個數組

bytes[] allMyUniqueIds;

然後循環allMyUniqueIds將返回你所有的Details結構

引用自:https://ethereum.stackexchange.com/questions/38838