Чтение списка сообщений с использованием структуры

Я попытался прочитать список сообщений, используя приведенный ниже код.

struct posts {

  bytes32 postTag;
  string post;
  address[] acceptedBy;
  uint8[] voteCount;

}

mapping(address => posts) totaluserPosts;

Я пытался читать все сообщения по-разному, но не мог найти способ сделать это.

Можно ли прочитать все посты через один запрос?

Вы пытаетесь вернуть массив сообщений структуры?

Ответы (1)

Короткий ответ: вам нужно создать функцию, потому что «бесплатный» геттер, который вы получаете через сопоставление, publicэтого не делает.

Лучший ответ — пересмотреть необходимость создания массива данных. Обычно мне достаточно, если вы генерируете события каждый раз, когда что-то вставляется в эту структуру, и это означает, что программные клиенты уже должны быть проинформированы об этой информации. Следовательно, зачем просить об этом снова, если это газоемко и не особенно быстро. Более полное описание этого мышления: https://blog.b9lab.com/the-joy-of-minimalism-in-smart-contract-design-2303010c8b09

Предположение. Соглашения об именах:

struct PostStruct {

  bytes32 postTag;
  string post;
  address[] acceptedBy;
  uint8[] voteCount;

}

mapping(address => posts) postStructs;

Примеры пользовательских функций:

function getPostAddressCount(address post, uint row) public returns(uint count) {
  return postStructs[post].address.length;
}

function getPostAcceptedBy(address post) public returns(address[] acceptedBy) {
  return postStructs[post].acceptedBy;
}

Поскольку стоимость вышеописанной функции возрастает с масштабированием до такой степени, что становится неработоспособной, рекомендуется включить альтернативу с фиксированной стоимостью:

function getPostAcceptedByByRow(address post, uint row) public returns(address acceptedBy) {
  return postStructs[post].acceptedBy[row];
}

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

можете ли вы объяснить, что вы имели в виду под сопоставлением (адрес => сообщения) postStructs? @Роб Хитченс B9lab
Исправил для последовательного переименования.