Вложенные структуры в Solidity?

Возможно ли иметь структуру внутри структуры? Я не уверен насчет внутреннего типа данных, но в основном я пытался сделать что-то вроде (псевдокод):

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

Как передать вложенную структуру в Remix IDE?
Если у вас есть новый вопрос, пожалуйста, задайте его, нажав кнопку Задать вопрос . Включите ссылку на этот вопрос, если это помогает обеспечить контекст. - Из обзора

Ответы (1)

Вы можете хранить файл structв формате 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 .

Надеюсь, это поможет.

это здорово, спасибо. У меня есть одна проблема с отображением: почему это не может быть общедоступным - функция-получатель в основном генерируется автоматически? с отображением общедоступных членов я получаю ошибку TypeError: «TypeError: внутренний тип не разрешен для общедоступной переменной состояния»
Правильно. Я считаю, что ошибка связана с тем, что компилятор не понимает, как именно построить геттер. Это рифмуется с этой головоломкой: ethereum.stackexchange.com/questions/15060/… . Возможно, кто-то еще вмешается с подробным объяснением именно этого случая. Мой обходной путь состоял в том, чтобы просто построить геттер.