Блокчейн и Ethereum

Автор:Нуль, Создано: 2016-05-05 17:31:57, Обновлено: 2016-05-05 17:32:31

Источник:https://jysperm.me/2016/05/blockchain-slides/

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

Блокчейн, также называемый блокчейном, можно считать одним из видов HashTree, поэтому он имеет некоторые сходства с HashTree:

blockchain-hash-tree

Изображениеhttp://happypeter.github.io/bitcoin_basics/book/017_merkle_tree.html

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

Я могу привести приложение для HashTree: "100% доказательство резерва", которое относится к категории "проверки нулевого знания". Мы можем рассмотреть сценарий, в котором владелец Bitcion должен отправить биткойны на биржу для совершения транзакций, и теоретически биржа может использовать эти деньги (баланс счета всех пользователей), что пользователи не хотят видеть, а биржа также хочет убедиться: биржа сначала публикует свой адрес биткойна, и все подтверждают, что транзакция действительно имеет столько биткойнов в качестве резерва, но как доказать, что эти деньги действительно больше суммы всех пользователей?

blockchain-proof-of-reserves

Изображениеhttp://blog.bifubao.com/2014/03/16/proof-of-reserves

Мы можем построить HashTree, где все конечные узлы представляют одного пользователя и содержат баланс пользователей.Σ) и распределение идентификаторов пользователей (например, адреса почтового ящика)h), а родительский узел содержит сумму остатков его подчиненных узлов.sum) и распределение информации всех поднодов (((hashДля каждого пользователя достаточно показать ему свой собственный конечный и братский узлы, все его родительские узлы и даже братские узлы родительских узлов, так как этот пользователь может подтвердить свой баланс путем постепенного отслеживания родительского узла, чтобы убедиться, что он был включен в родительский узел и, наконец, включен в корневой узел.

Таким образом, информация, показанная каждому пользователю, представляет собой только его собственную информацию и некоторую информацию, которая была объединена, и каждый пользователь может подтвердить, что его баланс включен в корневой узел, не зная других балансов.hДляe4df9d12Нот не должен быть конечным узлом, представляющим пользователя, а должен быть объединенным информационным узлом (этот узел может содержать пользователя с балансом 3333, и виртуального пользователя с балансом 0), чтобы избежать утечки конфиденциальной информации определенного пользователя.

А теперь давайте посмотрим на Git, который является типичным приложением для блокчейна:

blockchain-git-objects-example

Изображениеhttp://gitbook.liuhui998.com/1_2.html(GPL v2)

В Git, будь то файл (Blob), индекс (Tree) или обязательство (Commit), есть Hash, который определяется его содержанием, и если два объекта имеют одинаковое содержание, то у них есть один и тот же Hash. В Git, история всего хранилища - это блокчейн, каждый обязательство является блоком, в котором есть Hash предыдущего обязательства и Hash последнего измененного соответствующего объекта, Hash самого обязательства определяется его содержанием и этими метаинформациями.

Git использует Blockchain для определения уникальной истории для хранилища. О, если изменится Commit, изменится и Hash всех последующих Commit. Конечно, поскольку Git - это просто инструмент контроля версий, это не мешает вам изменить историю (в конце концов, вы можете перебазировать его).push --forceВ этом случае, если вы хотите, чтобы ваш сайт был доступным для всех пользователей, вы можете использовать его в качестве своего сайта.

Еще одно классическое применение блокчейна - это биткоин, который распространил слово "блокчейн" (и эта концепция существует всегда):

blockchain-bitcoin-block-data

Изображениеhttps://commons.wikimedia.org/wiki/File:Bitcoin_Block_Data.png(CC-BY-SA-3.0)

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

Биткойн

Первая часть этого сообщения - простой обзор биткоина.

Создание блоков в Биткойне осуществляется с помощью "доказательства объема работы", то есть все "майнеры", участвующие в "майнинге", должны выполнять расчетные расчеты, связанные с вычислительной силой, которые имеют случайный характер, чтобы получить право выпускать блок до тех пор, пока не будет вычислено случайное число, которое удовлетворяет определенным условиям.

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

Биткоин был разработан для создания нового блока каждые 10 минут, и это время было достигнуто благодаря совместному наблюдению за интервалом между прошлыми блоками, чтобы изменить сложность создания следующего блока. Когда последние несколько блоков были созданы быстрее, чем ожидалось, люди считали, что следующий блок должен быть с более высокой сложностью.

Обычно каждый биткойн-нод должен хранить полную блокчейн-данную, чтобы подтвердить законность транзакции. Но сейчас полноценный блокчейн насчитывает уже 66 Г, и растет примерно на 0.1 Г в день. Если требовать, чтобы каждый пользователь биткоина хранил полную блокчейн-данную, это не слишком сложно, поэтому биткоин имеет механизм "упрощенное подтверждение SPV, упрощенная проверка платежей", так называемый "легкий клиент", который может выбрать не хранить полную блокчейн-данную, а прикрепить ее к одному или нескольким целым блокам и хранить только всю элементарную информацию (Hash, содержащий объем транзакций, Hash), а затем проверять объем работы каждого блока, чтобы убедиться, что транзакция была завершена каждый раз, когда требуется проверка.

blockchain-bitcoin-state-machine

Изображениеhttps://github.com/ethereum/wiki/wiki/White-Paper

  • Блокчейн, Счетная книжка, Счетная книжка, Журнал изменений состояния
  • Transaction кнопка кнопка кнопка однократное изменение состояния
  • Блокчейн: "Консенсус" по текущему состоянию

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

Альт монета

На основе биткоина также было создано множество других криптографических валют, которые обычно называются "альт-коинтами", и обычно такие валюты имеют две реализации:

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

Второй вариант - использовать сеть Bitcoin для реализации "метапротоколов", которые содержат настраиваемую информацию над транзакцией Bitcoin для реализации собственной логики. Такие преимущества, как возможность использовать масштаб вычислительной способности Bitcoin для защиты от атак, но в то же время, поскольку не все майнеры, привязанные к сети Bitcoin, будут соблюдать правила кошельков, не смогут предотвратить несовместимые с правилами блоки в блокчейн, которые могут только фильтровать несовместимые с правилами транзакции на клиенте, и не смогут использовать функции упрощенного подтверждения, предоставленные Bitcoin, упомянутые выше.

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

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

Эфириум

blockchain-ethereum

Изображениеhttps://www.ethereum.org/assets(CC 3.0)

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

Перед тем, как подробно рассказать об Эфириуме, я расскажу о двух основных принципах (как я считаю) децентрализованной сети: криптологии и азартных играх. Конечно, криптология, естественно, не требует больших слов, а математически гарантирует безопасность с помощью алгоритмов шифрования с открытыми ключами, цифровых подписей, расчётов и обобщений; а азартные игры означают, что в децентрализованной сети, в которой может участвовать любой, включая тех, кто намеренно хочет атаковать эту сеть, необходимо размышлять о взаимосвязи интересов с точки зрения каждого участника при проектировании децентрализованной сети, чтобы обеспечить максимальное соблюдение интересов правил, а нарушение правил может привести к убыткам или риску.

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

Таким образом, в децентрализованной сети не все проблемы решаются "технологией", а те, что не достигаются технологией, должны решаться с помощью прибыли, с помощью экономических стимулов. Также из-за необходимости "экономических стимулов" Ethereum также имеет систему кошельков (валютная единица называется "Эфир"), в которой каждый пользователь имеет адрес кошелька в качестве своего единственного идентификатора, что в этом отношении аналогично Bitcion.

"Контракт" является наиболее важным понятием, введенным Ethereum. В Bitcoin все адреса принадлежат одному пользователю. Когда мы говорим "пользователь", мы на самом деле говорим о паре публичных и частных ключей. Но в Ethereum, помимо адреса, принадлежащего ключу, есть адрес, принадлежащий "коду", т.е. Contract.

  • Ввод и вывод может осуществляться только с помощью блокчейна, поэтому вычисления повторяются. Результаты фактических вычислений не должны храниться в блокчейне, поскольку вычисления могут быть выполнены снова в любое время.
  • Можно вызвать функции в других контрактах (код и данные других контрактов также существуют на блокчейне).
  • В процессе исполнения могут быть созданы новые сделки (манипулировать балансом собственного кошелька), которые могут быть отправлены на выполнение других контрактов.

Начнем с примера "многопользовательского кошелька", в официальном клиенте Ethereum есть функция создания многопользовательского кошелька:

blockchain-ethereum-multi-sig-wallet

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

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

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

Мы будем называть тех, кто хочет сохранить неизменную стоимость монеты, "рисковидами", а тех, кто готов взять на себя риск колебаний стоимости монеты и извлечь выгоду из этого, "рисковиками", так что они могут договориться о сумме (например, 1000 CNY) и временном окне (например, месяц) и создать контракт, выполняющий следующую логику:

  • Рискованный уклоняется от риска, отправляя в адрес кошелька Contract 1000 CNY Эфира, а рискованный уклоняется от риска, отправляя в Contract 1000 CNY (или более) Эфира в качестве компенсации (если никто не соглашается, уклоняющийся от риска может получить обратно свой Эфир).
  • Спустя месяц рискованный уклоняющийся может вывести из контракта 1000 CNY Эфира, а оставшиеся Эфиры возвращаются рискованным независимо от курса между Эфиром и CNY.

Если Ether повышается в цене, то рисковщик получает прибыль, если Ether падает в цене, то рисковщик теряет, но избегающий риска всегда не теряет ничего. Конечно, избегающий риска и рисковщик могут договориться заранее о "страховании", которое должен заплатить избегающий риска, или договориться о том, что рисковщик должен предоставить гарантию в несколько раз больше 1000 CNY ("чем выше коэффициент, тем больше риска").

В приведенном выше примере также есть проблема, которая не очень хорошо решена, а именно, как определить курс между эфиром и фиксированной валютой, о которой мы упоминали ранее, что контракт может получить доступ только к данным на блокчейне, а фиксированная валюта - это данные, которые существуют в физическом мире, а не в криптологическом мире, и мы должны каким-то образом ввести такие "данные из некриптологического мира" в блокчейн.

Мы можем спроектировать другой Контракт, который задаст логику, чтобы извлечь из физического мира обменные курсы между Эфиром и фиксированной валютой в каждом временном окне (например, час):

  • Все могут внести в Contract залог и предоставить обменный курс.
  • По окончании окна времени Contract рассчитывает среднее значение предлагаемого всем курса (в зависимости от суммы залога) и публикует его.
  • В результате, сумма собранных гарантий будет распределена между теми, кто ближе всего к среднему значению - 25% (в зависимости от суммы гарантии, взвешенной).

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

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

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

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

Одним из возможных источников случайных чисел является Hash следующего блока, и в большинстве случаев эта степень случайности является достаточной. Но на самом деле майнер может до некоторой степени манипулировать этим случайным числом. Предположим, что майнер участвует в каком-то азарте, и прибыль от азарта больше, чем прибыль от добычи одного блока.

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

Поэтому нам необходимо разделить окно сбора семян на две части, чтобы получить число, которое никто не может предсказать и вмешаться:

  • Первый этап: каждый может внести вклад в контракт и предоставить "счетную стоимость на случайный выбор семян".
  • Второй этап: участники первого этапа предоставляют контракту несеменные семена.
  • Завершение второго этапа: Контракт распределяет все законные семена, генерирует и публикует набор случайных чисел; возвращение второй стадии - гарантия того, кто предоставил правильные семена.

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

Ранее мы упоминали о том, что Bitcoin Script не предоставляет возможности циркуляции, регрессии, прыжков и т. д., возможно, Bitcoin является причиной контроля за временем выполнения Bitcoin Script, поскольку, согласно "западной теореме" Тьюрина, программы, написанные программируемым языком Тьюрина, не всегда могут судить только с точки зрения статического анализа, закончатся ли они после ограниченного количества шагов, так что злоумышленники могут создать транзакцию, которая вызовет смертельный цикл, чтобы помешать нормальной работе майнеров.

Ethereum, в свою очередь, обошел эту проблему с помощью "экономических стимулов". Контракт работает в виде opcode (кода действия) на виртуальной машине под названием EVM (Ethereum Virtual Machine), EVM - это виртуальная машина с собственной "счеткой", в стандарте EVM, определяется количество потребляемого газа для каждого opcode в зависимости от требуемой памяти и времени процессора, что является вычислительным ресурсом, приобретаемым Ether. Когда целью сделки является Contract, как упоминалось ранее, код контракта выполняется, а инициатор сделки требует оплаты за потребляемый в процессе выполнения контракта Gas Gas, а также заявляет "максимальное количество, которое он готов заплатить", и если промежуточный промежуток исчерпается, контракт прекращается.

Затем мы снова обсуждаем вопрос "промежуток консенсуса", о котором мы говорили ранее, что в биткоине каждый 10 минут появляется новый блок, то есть вся сеть достигает "консенсуса" каждые 10 минут, поэтому обычная биткойн-транзакция ждет несколько минут, прежде чем она будет подтверждена, а если вычисления не очень высоки, то может потребоваться ждать час, прежде чем люди будут считать эту транзакцию надежной.

Это потому, что более быстрые интервалы согласия в какой-то степени увеличивают преимущества "централизованного майнинга". Так называемый "майнинг" означает, что майнеры Bitcoin собираются вместе, чтобы добывать, и майнеры безоговорочно следуют инструкциям майнинга, и в конечном итоге соглашаются с майнингом на разделение прибыли.

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

blockchain-ethereum-without-uncles

Время трансляции может занять несколько секунд, что не очень важно для 10 минут, но если сократить интервал согласия, то преимущества централизованного майнинга станут все более очевидными. Но Ethereum решила эту проблему, введя концепцию "Uncle Block", сократив интервал согласия до 15 секунд, что значительно улучшило скорость подтверждения платежей по сравнению с Bitcoin.

В блокчейне биткойна блок может иметь только один родительский блок и только один дочерний блок. Но в Ethereum новообразованный блок может иметь родительский блок и несколько дядей. Возвращаясь к примеру выше, если в A был добыт новый блок, но другие еще не получили его в течение времени трансляции, если кто-то добывает новый блок, но из-за того, что трансляция не была принята всеми, то этот блок может стать "дядем" следующего блока.

blockchain-ethereum-uncles

Изображениеhttps://blog.ethereum.org/2014/07/11/toward-a-12-second-block-time

Неразрешенные проблемы

В следующей части я расскажу вам о некоторых проблемах, которые Ethereum пока не решает.

Во-первых, существует общее мнение, что Ethereum, как и Биткоин, гарантируется POW (проверка объема работы), и только ноты, которые выполняют определенное количество работы, могут участвовать в работе по созданию блоков. Проблема с доказательством объема работы заключается в том, что это будет тратить большое количество вычислительной силы на обеспечение безопасности сети, хотя это также основано на мысли о "экономических стимулах", о которых мы упоминали ранее, но на самом деле может быть улучшено.

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

Эта модель очень похожа на POW, в которой шахтеры делают ставки с помощью собственной вычислительной силы, и если однажды есть длинная цепочка, то необходимо переключиться на эту цепочку, чтобы продолжить добычу.

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

Конечно, в настоящее время POS не используется, потому что есть еще некоторые проблемы, которые еще не решены, одна из которых, как и в случае с POW, - это проблема 51%-ной атаки, при которой централизованная 51%-я вычислительная мощность всей сети в POW имеет определенные физические ограничения.

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

Таким образом, Ethereum надеется в будущем ввести механизм "раскола", чтобы разделить всю сеть на несколько частей, между которыми можно проводить проверку транзакций независимо друг от друга. Однако между фрагментами будет использоваться структура указателей для ссылки на данные других фрагментов, а также асинхронные вызовы, чтобы повлиять на другие фрагменты. Таким образом, вся сеть остается единой с точки зрения пользователей, но обработка всей сети будет иметь очень сильную масштабируемость.

Контракт

В этом разделе я покажу вам некоторые реальные, работающие коды контрактов. Контракты могут быть написаны во многих различных языках парадигм, которые в конечном итоге будут компилированы в opcode и выполнены на EVM. Сегодня мы выберем язык JavaScript типа Solidity, который является одним из наиболее поддерживаемых языков EVM.

contract Test {
  uint storedData; // State variable

  struct Voter { // Struct
    uint weight;
    bool voted;
    address delegate;
    uint vote;
  }

  event HighestBidIncreased(address bidder, uint amount); // Event

  function func() { // Function
    if (msg.sender.balance < 10 finney) {
        msg.sender.send(10 finney);
    }

    sha256("...");

    address nameServer = 0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2;
    nameServer.delegatecall("isAvailable", "MyName");
    nameServer.call("register", "MyName");
  }
}

Ниже приведены некоторые основные грамматические демонстрации, которые вы можете объявить в Solidity.uint storedData;Если вы используете блокчейн, то вы можете использовать его для создания новых файлов.structДля декларирования сложных структур данных; также могут быть определены функции, которые выполняются при получении транзакции, и инициатор транзакции может выбрать, какие функции выполнять. Таким образом, контракт может предоставлять несколько функций, в которых можно производить логические суждения, циркулировать, изменять значения.

В языке встроены несколько удобных функций, таких как распространенные алгоритмы шифрования.sha256∂ обмен на единицы ∂10 finneyПосмотрите на это видео.0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2(Смеется)msgЭто встроенная глобальная переменная, из которой можно читать информацию, связанную с данной транзакцией, например, инициатор, сумма и т. д.delegatecallЭто равносильно тому, что код другого Contract выполняется в текущем контексте, как если бы вы вводили библиотечную функцию;callЛогика заключается в том, чтобы запустить новую сделку, чтобы запустить другой контракт.

Как же тогда контракт читает и записывает данные из блокчейна? Эта сложная работа абстрагирована для "переменной состояния", на которой хранится данные, то есть переменная состояния. Фактически, изменения переменной состояния во время выполнения контракта не сохраняются в блокчейне, поскольку выполнение контракта - это вычисление определенности.

В следующей статье я покажу вам действительно доступный Contract Bin, который выпустит собственный токен на базе сети Ethereum:

contract Coin {
    // The keyword "public" makes those variables
    // readable from outside.
    address public minter;
    mapping (address => uint) public balances;

    // Events allow light clients to react on
    // changes efficiently.
    event Sent(address from, address to, uint amount);

    // This is the constructor whose code is
    // run only when the contract is created.
    function Coin() {
        minter = msg.sender;
    }
    function mint(address receiver, uint amount) {
        if (msg.sender != minter) return;
        balances[receiver] += amount;
    }
    function send(address receiver, uint amount) {
        if (balances[msg.sender] < amount) return;
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        Sent(msg.sender, receiver, amount);
    }
}

Код был полученhttp://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html#subcurrency-example(МИТ)

Этот контракт, называемый Coin, объявляет две переменные состояния.minterСоздатели этого токона, используемого для хранения, создают функцию (((function Coin()) в которой данной переменной присвоено значение инициатора первой транзакции, которая была использована для создания контракта; также заявлена карта адреса кошелька на цифруbalances, который обозначает баланс каждого владельца этого кода.

mintВ этой функции заранее определяется, является ли инициатор сделки создателем токенов, и если это так, то в соответствии с параметрами функции определенное количество токенов добавляется к указанному адресу.sendЭта функция может быть вызвана всеми и вычитает определенное количество баланса (если есть достаточный баланс) из адреса инициатора сделки и добавляет его к адресу цели, что соответствует функции перевода.

Мы также объявили о создании проекта под названиемSentВ будущем это также поможет в реализации легких клиентов (легкие клиенты принимают только события, но не фактически выполняют контракты).

blockchain-ethereum-mix

Ethereum предоставляет IDE под названием Mix для декомпиляции этого кода, на правой стороне Mix вы можете создать несколько блоков и учетных записей, чтобы протестировать свой контракт, а также увидеть, как изменяется значение каждой переменной состояния в процессе выполнения. Стоит отметить, что Contract не может быть изменен, как только он выйдет, и его последующее функционирование полностью зависит от транзакций других людей, что будет очень неприятно для программистов, которые ежедневно пишут ошибки, но контракт, по сути, означает "контракт", иначе кто будет доверять вашему контракту, как только вы выпустите контракт, который естественно не может быть изменен.

После того, как мы закончим писать этот контракт, мы сможем опубликовать его в сети с помощью кошелька Ethereum:

blockchain-ethereum-create-contract

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

blockchain-ethereum-wallet-contract

На левой стороне вы видите два значения переменных состояния.minterВ этом случае, если вы не хотите, чтобы кто-то из ваших друзей был вашим другом, вы должны быть готовы к этому.balancesПоскольку это карта, вы можете ввести адрес, чтобы узнать его баланс. На правой стороне вы можете запустить новую сделку с этим контрактом, и есть выпадающее меню, которое вы можете выбрать.sendИлиmintФункция, в которой вы можете заполнить параметры для передачи контракта. Так как здесь мы отправляем транзакцию с целью передачи сообщения, а не передачи эфира, нам не нужно устанавливать сумму транзакции.

В следующий раз я расскажу вам об одном очень интересном контракте, который реализует эффект, называемый "панчевым обманом", в котором вы можете заплатить за контракт 1 эфир, чтобы присоединиться к игре, и каждый третий человек, который присоединится, получит 3 эфира в том же порядке, что и первый, кто присоединится:

contract Pyramid {
    struct Participant {
        address etherAddress;
    }

    Participant[] public participants;

    uint public payoutIdx = 0;

    // events make it easier to interface with the contract
    event NewParticipant(uint indexed idx);

    // fallback function - simple transactions trigger this
    function() {
        enter();
    }

    function enter() {
        if (msg.value < 1 ether) {
            msg.sender.send(msg.value);
            return;
        }

        if (msg.value > 1 ether) {
            msg.sender.send(msg.value - 1 ether);
        }

        uint idx = participants.length;
        participants.length += 1;
        participants[idx].etherAddress = msg.sender;

        NewParticipant(idx);

        // for every three new participants we can
        // pay out to an earlier participant
        if (idx != 0 && idx % 3 == 0) {
            // payout is triple, minus 10 % fee
            uint amount = 3 ether;
            participants[payoutIdx].etherAddress.send(amount);
            payoutIdx += 1;
        }
    }

    function getNumberOfParticipants() constant returns (uint n) {
        return participants.length;
    }
}

Код упрощенhttps://ethereumpyramid.com/contract.html

Код довольно прост, этот контракт заявляет, чтоparticipantsМассив, используемый для хранения адреса кошельков всех участников в порядке, или объявленный как одинpayoutIdxДля записи количества участников, которые получили 3 Эфира.enterОсновная функция реализации этого контракта состоит в том, чтобы сначала проверить параметры, чтобы гарантировать, что каждый участник заплатит 1 Эфир, а затем поставить нового участника в один и тот же контракт.participantsНаконец, если число предыдущих участников является кратным 3, 3 эфира отправляются в число.payoutIdxВ этом случае, мы должны быть готовы.payoutIdxВ этом случае мы будем говорить о следующем участнике.

Ссылки

HashTree:

Биткойн:

Проблема с остановкой:

Эфириум

Сеть Ethereum:

Следующий Ethereum:

Контракт:

Контрактный IDE:


Больше

Маленькие мечтыЯ не знаю, что это такое, но я знаю, что это такое, и я знаю, что это такое.

СюаньшуаньВ конце концов, начальство пошло на BTC и ETH.

МомоксНепонятно