Как хранить небольшую базу данных, редактируемые данные в блокчейне, доступные через смарт-контракт?

Новое в блокчейне и смарт-контрактах. Провожу исследование и понимаю, что не могу обновить смарт-контракт транзакции. Можно ли хранить данные базы данных в качестве записи в бухгалтерской книге или в другом смарт-контракте, который только я обновляю, чтобы смарт-контракт транзакции мог получить доступ к данным?

Например

Пользователь хочет сделать пожертвование в пользу организации. Его кошелек должен включать все возможные организации, чтобы он мог выбрать из базы данных, которую я хотел бы децентрализовать.

Где я могу хранить организации и адреса их кошельков, а также обновлять или удалять их? Также я хочу добавить подразделы организации и ее адрес.

Например

Кошелек пользователя втягивает:

  • Больница, адрес
  • Больница, лаборатория, адрес,
  • Больница скорой помощи, адрес
  • Пожарная часть, адрес
  • Пожарная часть, фонд техники, адрес
  • Пожарная служба, фонд снабжения, адрес
  • И т.п.

Я бы читал только о добавлении организаций и их удалении. Есть ли способ сделать все это децентрализованным внутри блокчейна?

Крис

Ответы (1)

Смарт-контракты могут иметь массивы и карты в качестве структур данных, которые постоянно хранят состояние в блокчейне, а функции смарт-контракта могут их изменять.

Для вашего примера вы можете использовать что-то вроде этого:

pragma solidity ^0.4.16;

contract MyOrgDatabase {
  struct Organization {
    address _where;
    string _name;
  }
  Organization[] public availableOrgs;
  address public owner = msg.sender;

  function addOrg(address _where, string _name) {
    require(msg.sender == owner);
    availableOrgs.push(Organization(_where, _name));
  }
}

Этот контракт имеет общедоступную availableOrgsсобственность, которую любой может прочитать из блокчейна. Но только адрес, по которому был создан контракт ( owner), может добавлять организации в этот список (возможно, вы также захотите добавить функции для удаления организаций из списка или изменения владельца контракта для полнофункционального контракта, но это должен дать вам представление).

Вы используете адрес в структуре организации неправильно. Предполагается, что это строка на _where
@EduardoPereira: Если целью было сохранить почтовый адрес (почтовый адрес), то строка была бы уместна. Но цель этого — сохранить их адрес Ethereum (поскольку в исходном вопросе упоминается вариант использования для отправки им средств). Поле addressтипа имеет размер, специально предназначенный для хранения адресов Ethereum (обычно это длинные числа в шестнадцатеричном кодировании).
@MidnightLightning Я думаю, что это не будет решением для постоянного хранения. Например, если мы закроем наше соединение с эфириумом или закроем ganache-cli, в следующий раз, когда мы его откроем, мы не получим данные. Правильно?.. Пожалуйста, поправьте меня, если я ошибаюсь
@AnikethSaha Я считаю, что ты не прав; то, как я изложил контракт здесь (имея «общедоступный» список структур «Организация»), является стандартным способом постоянного хранения данных в блокчейне Ethereum. Ethereum существует как сеть компьютеров, на которых запущено клиентское приложение Ethereum («узлы»), которые выполняют все транзакции. Поэтому в тот момент, когда я отправляю транзакцию для запуска функции «addOrg», все узлы записывают это как изменение. Если я отключусь от одного из узлов, это не удалит данные; он все еще присутствует на всех узлах, которые видели транзакцию.
@AnikethSaha Ganache — это отдельная ситуация; Ganache — это тестовое пространство, где разработчики могут работать над своими приложениями, не рискуя реальными деньгами в реальном блокчейне Ethereum. В вашей сети Ganache есть только один компьютер (ваш), поэтому, если ваш компьютер потеряет свои данные, он действительно исчезнет. Но просто остановка и запуск Ganache не удалит все на нем (это так же, как остановка и перезапуск сервера базы данных). Однако есть специальные команды, которые говорят Ganache выбросить все данные блокчейна и начать заново, после чего ваши прошлые действия будут потеряны.