Возможно ли иметь структуру внутри структуры? Я не уверен насчет внутреннего типа данных, но в основном я пытался сделать что-то вроде (псевдокод):
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
Вы можете хранить файл 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 .
Надеюсь, это поможет.
Дония Мансури
Ричард Хоррокс