2015-12-11 3 views
2

Я играю с частным блоком Ethereum, и я заинтересован в реализации некоторых умных контрактов. Тем не менее, информация очень ограничена, поскольку это более новая реализация блочной цепи.Каков наиболее эффективный способ хранения данных контракта по цепочке блоков Ethereum?

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

В псевдокоде эти два варианта выглядят следующим образом.

Вариант 1 (экземпляр нового контракта для каждого человека):

contract = // contract code 

ethereum.newContract(contract, userInfo); 

Вариант 2 (держать информацию о всех пользователей в рамках одного контракта):

contract = { 
    var users = []; 

    // other contract code 
} 

ethereum.newContract(contract, userInfo); 

Вот как мы можем количественно «эффективность» в этом случае:

  1. Каждый раз, когда создается новый контракт, мы должны разминировать блок для контракта, а затем выполнить любые транзакции, которые пользователь заключает с контрактом. Если мы только экземпляр один контракта, однако, мы только помоему развертывание контракта раз, а потом какая-либо сделка в дальнейшем, но ...
  2. Если мы идем с возможностью хранения всю информацию для всех пользователей в рамках одного контракта , представляет собой только «разницу» данных контракта («массив» всех пользователей), хранящихся в виде блока, или весь набор данных, хранящихся в каждом блоке? Или ...
  3. Если мы идем с опцией «контракт на пользователя», то это «пустошь», если мы храним все определение контракта несколько раз (и стоит ли это, возможно, избыточную добычу, место)?

Надеюсь, в моем вопросе был ясен, но если нет, сообщите мне. Я считаю, что этот вопрос является одним из «компромиссов».

(Re: теги - я использую реализацию golang из Эфириума и JavaScript API для взаимодействия с ним.)

ответ

3
  1. Да. Однако каждый раз, когда вы хотите добавить пользователя, вам придется отправить транзакцию для добавления новой записи в существующий контракт.

  2. Блоки состоят из транзакций. Каждый раз, когда вы добавляете пользователя, вам необходимо создать транзакцию для соответствующего вызова функции. Однако вам нужно будет сделать это только один раз, а данные не будут повторно скопированы в будущие блоки.

  3. Да.

Из-за того, что ваш вопрос структурирован, кажется, вам следует снова прочитать разницу между транзакциями и блоками.

0

Достаточно одного контракта для всех пользователей, учитывая, что объекты пользователя не слишком велики.

Из приведенного выше кода предлагаем использовать map, что позволит более эффективно извлекать пользовательские записи, чем массив. Введите записи любой строкой, например first + last name.

mapping(string => user_struct) public users;