Solidity

嵌套結構堅固?

  • October 3, 2018

結構內部可以有結構嗎?我不確定數據類型的內部結構,但我基本上是在嘗試做類似(虛擬碼)的事情:

library IpfsUtils {

 struct IpfsHash {
   bytes32 hash;
   uint8 hashFunction;
   uint8 hashSize;
 }

 function insert(bytes _hash) {}
 function combine() {}
}

contract Members {

 struct Member {
    IpfsUtils.IpfsHash profile;
    uint id;
 }
 mapping (address => Member) public members;

 function addMember(uint id, bytes profileHash) {
   Member m = members[msg.sender];
   m.id = id;
   m.profile.insert(profileHash);
 } 
}

我正在嘗試儲存具有固定長度數據類型的 IPFS 雜湊,並且我考慮將 ipfs 雜湊函式、大小和實際 bytes32 雜湊的儲存提取到它自己的結構中。

有人可以指點我某個地方以了解有關內部結構的更多資訊嗎?

編輯: 嵌套結構是可能的。但是映射(此處members)不能公開,導致以下錯誤:TypeError: Internal type is not allowed for public state variable

您可以將 a 儲存struct在 a 中struct

pragma solidity ^0.4.11;

contract Nest {

 struct IpfsHash {
   bytes32 hash;
   uint hashSize;
 }

 struct Member {
   IpfsHash ipfsHash;
 }

 mapping(uint => Member) members;

 function addMember(uint id, bytes32 hash, uint size) public returns(bool success) {
   members[id].ipfsHash.hash = hash;
   members[id].ipfsHash.hashSize = size;
   return true;
 }

 function getMember(uint id) public constant returns(bytes32 hash, uint hashSize) {
   return(members[id].ipfsHash.hash, members[id].ipfsHash.hashSize);
 }
}

如果我假設每個成員只有一個 IPFS,那麼這種嵌套有點毫無意義。我不想修復太多而偏離原來的問題。

是的,您可以在結構中嵌套結構。映射和數組,甚至是結構或結構數組的映射。

可能有幫助:結構聲明只是聲明一個類型而不是該類型的實例。

在協調所有這些以使某些東西變得有用方面,請查看此處的模式:Solidity 是否有解決良好且簡單的儲存模式?

如果您正在尋找一對多(每個成員多個 IPFS),此模式可能會有所幫助:https ://medium.com/@robhitchens/enforcing-referential-integrity-in-ethereum-smart-contracts-a9ab1427ff42

希望能幫助到你。

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