Что такое java криптовалюта

Как стать разработчиком криптовалюты

Что такое криптовалюта

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

  • Децентрализация. Ни одна страна, ни один банк не могут владеть и управлять криптовалютой, в то время как естественная экономика фактически зависит от действий ограниченного круга лиц.
  • Защищённость. Одна из главных особенностей электронных денег — наличие сложного алгоритма шифрования у каждой единицы, что делает невозможным любые противоправные действия.
  • Открытость. Любой человек в мире может начать добывать криптовалюту, используя «майнинг».

Последний пункт как раз вызывает невероятный интерес в СМИ. На деле же всё предельно просто. Каждая криптовалюта имеет сложные алгоритмы шифрования. Для того, чтобы обработать эти алгоритмы, требуются вычислительные мощности (обычно это видеокарты, так как необходимы параллельные вычисления). С ростом количества криптовалюты растёт и сложность шифрования, что в конечном счёте уводит «майнинг» с персональных компьютеров к огромным хранилищам железа. Если в 2010 году вы могли сгенерировать биткоин на игровом ноутбуке за пару дней, то теперь для этого потребуется месяц непрерывной работы техники или целый шкаф вычислительных машин.

Какие бывают криптовалюты

Рынок криптовалют молод и не слишком стабилен. Отсюда резкие падения и взлёты курса, а также нерегламентируемое количество основных игроков. Bitcoin — самая известная и одна из старейших криптовалют имеет объём торгов районе 1,5 млрд долларов в месяц. Как правило, в масс-медиа, когда говорят о криптовалюте, подразумевают как раз Bitcoin.

На втором месте по текущей популярности расположился Ethereum, у него оборот в районе 600 млн долларов за последние 30 дней. Дальше в порядке убывания: Ripple, Litecoin, Dash, NEM и так далее. Всего на бирже зарегистрировано свыше 1000 криптовалют, для большей части которых колебания курса на 20-30% за неделю — норма.

Что надо знать для разработки

Главная прелесть электронных финансов — вы можете создать свою собственную валюту, вывести на биржу и сколотить на этом состояние. Разумеется, только теоретически. Фактически вам потребуется проделать следующие шаги:

  1. Изучить алгоритмы шифрования. Для изготовления монет вы должны прекрасно знать свойства металлов, а для создания криптовалюты алгоритмы шифрования. Начните с базовых — SHA256 и Scrypt. В процессе придётся пойти дальше и изучить X11, X13, X15, Nist5, NeoScrypt, Keccak, Quark и Qubit.
  2. Изучить Bitcoin. Это самая стабильная криптовалюта на бирже, именно её надо брать за ориентир и развивать идею. Проблема заключается в том, что Bitcoin настолько проработанная валюта, что вам потребуются месяцы на изучение и поиск недостатков.
  3. Найти команду. В одиночку даже майнингом тяжело заниматься, а уж для разработки своей валюты вам потребуется минимум 5-6 человек со знанием С++ и Python. Именно на этих языках написана большая часть клиентов, поэтому так будет проще копипастить.
  4. Заниматься продвижением криптовалюты. Вам потребуется от полугода до года на то, чтобы запустить проект в жизнь, но это лишь начало. На бирже действуют стандартные законы бизнеса: без ежедневной доработки, без явных преимуществ над конкурентами, все усилия пропадут за пределами топ-1000 рейтинга.

Перспективы трудоустройства

Связать свою карьеру с криптовалютой можно тремя способами:

  1. Выступить в команду разработки новой валюты или создать собственную. Как правило, это работа на общественных началах за кусок будущего пирога или за небольшие деньги. Объявления о поиске разработчиков можно найти на бирже фриланса или на форумах криптовалют.
  2. Найти стандартную работу с уклоном на криптовалюты. Среди вариантов: разработчики Java, Go, Fullstack и т.д.
  3. Попроситься в официальную команду разработчиков уже существующей криптовалюты. Например в IRC-канале сообщества Bitcoin.

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

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

Что такое криптовалюта

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

  • Децентрализация. Ни одна страна, ни один банк не могут владеть и управлять криптовалютой, в то время как естественная экономика фактически зависит от действий ограниченного круга лиц.
  • Защищённость. Одна из главных особенностей электронных денег — наличие сложного алгоритма шифрования у каждой единицы, что делает невозможным любые противоправные действия.
  • Открытость. Любой человек в мире может начать добывать криптовалюту, используя «майнинг».

Последний пункт как раз вызывает невероятный интерес в СМИ. На деле же всё предельно просто. Каждая криптовалюта имеет сложные алгоритмы шифрования. Для того, чтобы обработать эти алгоритмы, требуются вычислительные мощности (обычно это видеокарты, так как необходимы параллельные вычисления). С ростом количества криптовалюты растёт и сложность шифрования, что в конечном счёте уводит «майнинг» с персональных компьютеров к огромным хранилищам железа. Если в 2010 году вы могли сгенерировать биткоин на игровом ноутбуке за пару дней, то теперь для этого потребуется месяц непрерывной работы техники или целый шкаф вычислительных машин.

Какие бывают криптовалюты

Рынок криптовалют молод и не слишком стабилен. Отсюда резкие падения и взлёты курса, а также нерегламентируемое количество основных игроков. Bitcoin — самая известная и одна из старейших криптовалют имеет объём торгов районе 1,5 млрд долларов в месяц. Как правило, в масс-медиа, когда говорят о криптовалюте, подразумевают как раз Bitcoin.

На втором месте по текущей популярности расположился Ethereum, у него оборот в районе 600 млн долларов за последние 30 дней. Дальше в порядке убывания: Ripple, Litecoin, Dash, NEM и так далее. Всего на бирже зарегистрировано свыше 1000 криптовалют, для большей части которых колебания курса на 20-30% за неделю — норма.

Что надо знать для разработки

Главная прелесть электронных финансов — вы можете создать свою собственную валюту, вывести на биржу и сколотить на этом состояние. Разумеется, только теоретически. Фактически вам потребуется проделать следующие шаги:

  1. Изучить алгоритмы шифрования. Для изготовления монет вы должны прекрасно знать свойства металлов, а для создания криптовалюты алгоритмы шифрования. Начните с базовых — SHA256 и Scrypt. В процессе придётся пойти дальше и изучить X11, X13, X15, Nist5, NeoScrypt, Keccak, Quark и Qubit.
  2. Изучить Bitcoin. Это самая стабильная криптовалюта на бирже, именно её надо брать за ориентир и развивать идею. Проблема заключается в том, что Bitcoin настолько проработанная валюта, что вам потребуются месяцы на изучение и поиск недостатков.
  3. Найти команду. В одиночку даже майнингом тяжело заниматься, а уж для разработки своей валюты вам потребуется минимум 5-6 человек со знанием С++ и Python. Именно на этих языках написана большая часть клиентов, поэтому так будет проще копипастить.
  4. Заниматься продвижением криптовалюты. Вам потребуется от полугода до года на то, чтобы запустить проект в жизнь, но это лишь начало. На бирже действуют стандартные законы бизнеса: без ежедневной доработки, без явных преимуществ над конкурентами, все усилия пропадут за пределами топ-1000 рейтинга.
Читайте также:  Pos майнинг raspberry pi

Перспективы трудоустройства

Связать свою карьеру с криптовалютой можно тремя способами:

  1. Выступить в команду разработки новой валюты или создать собственную. Как правило, это работа на общественных началах за кусок будущего пирога или за небольшие деньги. Объявления о поиске разработчиков можно найти на бирже фриланса или на форумах криптовалют.
  2. Найти стандартную работу с уклоном на криптовалюты. Среди вариантов: разработчики Java, Go, Fullstack и т.д.
  3. Попроситься в официальную команду разработчиков уже существующей криптовалюты. Например в IRC-канале сообщества Bitcoin.

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

Источник

Пишем майнер на Java. Кодим добытчик криптовалюты Electroneum

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

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

Создание нового блока представляет собой решение определенной математической задачи. Необходимо найти такой хеш блока, который был бы меньше значения, определяемого сетью. Это значение называется сложность (difficulty). Оно регулируется сетью, чтобы время создания блока было более-менее предсказуемо. Майнер, который первый решит задачу, получает всю награду. Награда за блок на сегодняшний день составляет 11 300,93 ETN, что примерно равно 146,2 доллара.

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

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

К сожалению, синхронизация «из коробки» может зависнуть на блоке 155750. Это связано с найденным критичным багом и кардинальными изменениями из-за этого в сети Electroneum (подробнее). Поэтому прежде чем запускать синхронизацию, нужно скачать файлик с правильной цепочкой блоков и положить его в папку .electroneum/testnet/export/blockchain.raw . Затем выполнить импорт:

Теперь смело запускаем синхронизацию:

Далее создаем кошелек для начисления заработка:

Ответив на все вопросы, получаем публичный адрес в файлике .address.txt . Если лениво заморачиваться с развертыванием сервера Electroneum, можно воспользоваться онлайн-сервисом nodes.hashvault.pro:26968 .

Настало время запустить свой любимый редактор и приступать к кодированию. Для связи с сервисом Electroneum используется протокол jsonrpc . Нам понадобится всего две команды: получить шаблон блока и отправить решение. Начнем с простого HTTP-клиента:

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Источник

Quorum blockchain: интеграция в Java код

Для тех кто интересуется темой блокчейна давно не секрет, что помимо публичных блокчейнов, таких как Ethereum, Bitcoin, Zcash и т.д., существуют также их «enterprise (private)» «братья», которые в кое чем лучше чем публичные сети, а в кое чем проигрывают им. Среди найболее известных сетей, я думаю, можно назвать Quorum (вендор — J.P. Morgan Chase), Pantheon (вендор — PegaSys) и Hyperledger (находиться под управлением The Linux Foundation). Несмотря на то, что существует довольно много публичных решений, бизнес все более интересуеться именно приватными блокчейнами благодаря тому, что они способны обеспечить нужный уровень приватности, транзакции выполняються быстрее и так далее. Отличия приватных от публичных блокчейнов, а также их преимущества и недостатки — не тема даной статьи. Если вам интересно прочитать об этом то есть, например, такая статья на Medium.

В этой статье я хотел бы расказать вам как можно испольовать Quorum блокчейн для разработки своих приложений с поддержкой приватных и публичных транзакций. Для демонстрации возможностей мы напишем небольшое Java/Spring приложение, которое будет принимать запросы на загрузку (deploy) смарт-контрактов, выполнение транзакций и чтения данных из смарт-контракта. Собственно, вот стек технологий который будет использоваться в статье:

  • Java 8
  • Gradle 5.2.1
  • Spring Framework
  • Web3j (библиотека для работы с публичными транзакциями в Ethereum подобных сетях)
  • Web3j-quorum (библиотека для работы с приватными транзакциями в Quorum сети)

Немного общей информации о Quorum

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

Важным дополнением также является enclave сервисы, которые отвечают за хранение, шифрование и распространение приватных транзакций между собой. Сейчас существуют 2 таких enclave сервиса:

  1. Constellation — написан на Haskell, первый вариант enclave, однако сейчас уже не развиваеться, и скорее всего в будущем от него откажуться в пользу нового;
  2. Tessera — новый сервис, написан на Java, поддерживаеться разработчиками из J.P. Morgan Chase, имеет больше возможностей по интеграции с БД и управлением «чуствительной» информацией (например, есть вариант итеграции с HashiCorp Vault для управления секретами).
Читайте также:  Uniswap биржа раздача uni

Что касаеться транзакций, то с точки зрения интерфейса обычной Ethereum поменялось не многое (и это хорошо). Для того что бы отправить приватную транзакцию, помимо обычной информации о транзакции, нужно ещё указать параметр privateFor — это масив строк, а строки эти — публичные ключи enclave нод. С помощью этих ключей шифруеться payload транзакции и выполняеться распространение payoad‘a между Tessera-нодами внутри блокчейна.

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

Разработка Java приложения

Как пример, я покажу небольшой RESTful API, написаный на Java/Spring, с Gradle в качестве инструмента сборки и управления зависимостями, который будет загружать смарт-контракт в блокчейн, выполнять функцию изменения состояния контракта и считывать состояние из смарт-контракта.

Перед тем, как начать непосредствено разработку, я должен кое что прояснить. Несмотря на то, что в Quorum официально есть 2 варианта транзакций, я предпочитаю делить их на 3 вида:

  1. Public транзакции — транзакции полностью видны всем учасникам сети (в том числе и payload), enclave-нода не принимает участвие ни в оброботке, ни в хранении транзакции. Публичные транзакции в Quorum не отличаються от транзакций в Ethereum сети;
  2. Permissioned транзакции — транзакции по сути являються приватными, но для нескольких учасников сети, то есть в публичной сети мы имеем информацию о транзакции и о статусе ее выполнения, но вместо реального payload в публичной сети мы имеет лишь 64-битную строку-хеш, которая являеться идентификатором на реальный payload в enclave ноде, сама enclave нода отвествена за подпись, шифрование, хранение и распространение payload‘a между указаными учасниками транзакции;
  3. Private транзакции — отличаються от permissioned тем что транзакция доступна только для ноды, которая эту транзакцию создала, другие учасники сети не могут увидеть payload транзакции.
    Этой класификацией я буду пользоваться на протяжении всей статьи.

Для начала я покажу, как будет выглядеть файл сборки — gradle.build :

  1. org.web3j.core — зависимость для работы с транзакциями в сети Ethereum и публичными транзакциями в сети Quorum
  2. org.web3j.quorum — зависимость для работы с приватными транзакциями в сети Quorum
  3. org.web3j.codegen — зависимость для генерации wrapper‘ов для Solidity смарт-контрактов
  4. generateWrappers — Gradle-task для генерации Java-wrapper‘ов из Solidity смарт котрактов

Далее я покажу вам код смарт-контракта, который будет использоваться в этой статье: файл QuorumDemo.sol :

Контракт намерено сделан простым, но его достаточно для целей нашей статьи. Если вы знаете Solidity, то вы можете пропустить объяснения:

  • string public user — публичная переменая типа string и названием user. В отличии от Java, Solidity автоматически генерирует getter для публичных переменных, поэтому реализововать вручную его не нужно.
  • function writeUser(. ) — функция смены значения переменой, по сути — setter.

Для того, что бы из смарт-контракта создать Java-wrapper , нужно положить файл в папку src/main/solidity/contracts с любым названием, например QuorumDemo.sol .
Далее нужно запустить Gradle-task generateWrappers командой:

после выполнения этой задачи по адресу src/main/java/com/github/quorum/component/wrappers будет создан Java-wrapper, с которым уже можно работать в Java коде.

Для того, чтобы бекенд имел возможность подписывать транзакции, нам нужно иметь возможность получить payload транзакции до того, как мы пошлём ее. Для этого было бы хорошо получить его прямо из Java-wrapper класса. Здесь я создал 2 метода внутри врапера. Первый метод просто возращает ABI контракта, который можно использовать для загрузки нового смарт-контракта. Второй метод — это формирование транзакции на изменение состояния смарт-контракта. Вот код этих методов:

Вставив их в сгенерированый Java-wrapper, вы сможете получать payload для транзакций.

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

  1. TesseraTransactionManager , для отправки приватных транзакций
  2. GethTransactionManager , для отправки публичных транзакций

Давайте разберём их. Код TesseraTransactionManager :

  • TransactionReceipt executeTransaction(. ) — реализация интерфейса, метод для выполнения транзакции в сети и обработки ошибок, если они случаються. Возращает обьект c результатом выполнения транзакции;
  • EthSendTransaction sendTransaction(. ) — метод для подписи и отправки транзакций в блокчейн. Возращает обект с статусом транзакции и его хешом;
  • TransactionReceipt processResponse(. ) — метод, который ожидает выполнения транзакции и возращает TransactionReceipt после ее выполнения;
  • BigInteger getNonce() — возращает «nonce» из сети.

И код GethTransactionManager :

  • TransactionReceipt executeTransaction(. ) — реализация интерфейса, метод для выполнения транзакции в сети и обработки ошибок, если они случаються. Возращает обьект c результатом выполнения транзакции;
  • EthSendTransaction sendTransaction(. ) — метод, который вызывает метод супер-класа для отправки транзакции в блокчейн.

Обработчик запросов, которые приходять на API:

Сейчас обьясню какие методы за что отвечают.
Метод Mono deployContract(. ) — описывает общую логику загрузки (deploy) смарт-контракта, как публичного так и приватного.
Метод TransactionManager getTransactionManager(. ) — возращает обьект реализации менеджера транзакций в зависимости от типа транзакций. Для этого в теле запроса будет находиться параметр privateFor, который являеться масивом строк публичный ключей Tessera нод.
Метод boolean isPrivate(. ) — возращает «true», если параметр privateFor или пустой (private транзакция), или имеет список публичных ключей (permissioned транзакция). Возращает «false», если параметр privateFor не пустой, и первый елемент масива равен «public».
Метод APIResponse deployContract(. ) — посылает транзакцию загрузки(deploy) в блокчейн.
Метод Mono generateResponse(. ) — генерирует обьект с ответом к клиенту.
Метод Mono updateUser(. ) — описывает общую логику выполнения транзакции на изменение состояния смарт-контракта.
Метод APIResponse sendTransaction(. ) — посылает транзакцию на изменение состояния в блокчейн.
Метод APIResponse getUser() — описывает общую логику счытивания информации из смарт-контракта и возращает ответ клиенту.
Метод String readUserFromSmartContract(. ) — считывает состояние из смарт-контракта и возращает результат.

Полный код приложение доступен в GitHub репозитории, ссылка на который будет вконце этой статьи.

Проверка

Для тестирования всех 3 типов транзакций я написал тестовые класы (код находиться в GitHub репозитории). Для этого я развернул блокчейн с 3 Quorum нодами (3 ноды Geth + 3 ноды Tessera). 3 Quorum ноды это минимум нод необходимых для проверки всех типов транзакций. Имейте это ввиду, если захотите попробовать сами.

Public транзакции

Для выполнение тестового кейса с публичной транзакцией необходимо выполнить следующую команду:

Этот тест кейс пошлёт 3 запроса на API. Первый на деплой смарт-контракта в блокчейн, второй — изменение состояние контракта и третий запрос — считывание информации из смарт-контракта. В результате выполнения теста вы увидите примерно такие логи (адреса в вашей сети будут отличаться, как и хеши транзакций):

Читайте также:  Норма доходности финансового менеджмента

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

Теперь давайте проверим, что нам показывает Geth, выполняем следущую команду для подключения к IPC интерфейсу процеса Geth клиента:

После того, как мы «приатачились» к процесу, можно пересматривать полностю всю необходимую информацию. Давайте посмотрим на TransactionReceipt транзакции на деплой нового смарт-контракта, выполнив команду (хеш транзакции нужно поставить свой, и взять его из логов теста):

В качестве результата видим следущее:

Нас интересуют следущие параметры:

  • «contractAddress» — если не «null», то мы понимаем, что это транзакция на деплой смарт-контракта;
  • «status» — в даном случае оно равно «0x1» — что означает, что транзакция прошла успешно.

И давайте посмотрим на саму транзакцию. Выполнив команду:

Здесь нас интересую следущие параметры:

  • «input» — это payload транзакции;
  • «v» — в общем, это параметр для ECDSA, алгоритма цифровой подписи, но нас интересует сейчас другое — значение переменой. Важно оно потому, что у публичных и приватных транзакций оно будет отличаться. «0x1c» («28» в десятичной системе) и «0x1b» («27» в десятичной системе) характерны для публичных транзакций, а «0x25» («37» в десятичной системе) и «0x26» («38» в десятичной системе) — это коды приватных транзакций.

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

Теперь можно просмотреть на транзакцию изменения состояния смарт-контракта. Выполним команду:

Нас интересуют следущие параметры:

  • «to» — видим, что транзакция пошла на только-что задеплоиный смарт-контракт;
  • «status» — оно равно «0x1», что означает, что транзакция прошла успешно.

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

Private транзакции

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

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

В результате програма напишет такие логи:

Изменением, по сравнению с публичными транзакциями, есть параметр privateFor — теперь он имеет значение пустого масива.
Давайте проверим TransactionReceipt по транзакции. Команда:

Из изменений, по сравнению с публичными транзакциями, стоит сказать, что вы не увидите количество газа, потраченое на выполнение транзакции — gasUsed и cumulativeGasUsed имеют значение «0».
А теперь давайте посмотрим на саму транзакцию. Выполним команду:

В результате увидим такое:

Что стоит отметить в даной транзакции:

  1. Как я уже упоминал в начале этой статьи, вместо реального payload транзакции вы увидите фиксированую строку в 64 байта (128 символов) в поле input. Эта строка — идентификатор на данные в хранилище Tessera, реальные данные вы можете получить по запросу к Tessera.
  2. «v» — вместо кодов «0x1c» или «0x1b» как в публичных транзакциях, для приватных транзакций вы увидите «0x26» или «0x25».

Теперь давайте проверим TransactionReceipt и саму транзакцию на изменение состояние контракта (команды вы уже знаете). Результат:

Ничего нового мы из этой приватной транзакции, в принципе, не узнаем.

Permissioned транзакции

Так, как это тоже приватные транзакции, просто приватные они не для 1 ноды, а для нескольких, то результаты выполнения таких транзакций ничем не будут отличаться от приватных транзакций. Разницу можна почуствувать, если попробовать получить информацию из ноды, которая была указана в privateFor и из ноды, чей публичный ключ не прописан в privateFor (сможете получить информацию с первой ноды и не сможете со второй).
Что бы запустить тест-кейс с транзакциями приватными для нескольких учасников сети (permissioned транзакции), нужно выполнить следущую команду:

Результаты в Geth-клиенте, на деплой нового смарт-контракта, TransactionReceipt и сама транзакция соотвествено:

И транзакция на изменение состояния, TransactionReceipt и сама транзакция:

HTTP запросы

Несмотря на то, что мы увидели, как публичные транзакции отличаються от приватных с точки зрения Geth-клиента, это не показывает реального ограничения на получение информации. Поэтому для того, чтобы показать вам, что действительно можно ограничить число нод, способных прочитать вашу транзакцию, я сделаю несколько запросов с помощью CURL на 3 ноды, для считывания информации со смарт-контракта (запросы будут касаться сделаных private и persmissioned транзакций).
HTTP запросы будут иметь в теле запроса 2 параметра:

  1. «endpoint» — непосредстверно endpoint к Quorum ноде, нужно для подключения к ноде.
  2. «contractAddress» — адрес контракта, с которого будут считываться данные.

В моем случае «endopint» будет иметь один хост — localhost — но разные порты для 3 Quorum нод: 22000 (с этой ноды делались все транзакции), 22001 (ее публичный ключ был указан в permissioned транзакциях), 22002 (не должна иметь доступ к информации).

Начнем с private транзакции (только нода на 22000 порте должна иметь возможность просматривать информацию в смарт-контракте).

CURL запрос на ноду которая делала транзакции:

Как результ мы получили следущее:

Это означает, что нода имет возможность просматривать информацию в смарт-контракте.

Теперь давайте просмотрим, что вернет нам нода на 22001 порту. CURL запрос:

Отлично! В результате мы получили следущее сообщение об ошибке:

В данном случае это означает, что мы не можем прочитать информацию из смарт-контракта — то чего мы добивались!

И ещё надо проверить последнюю, 3-ую ноду. CURL запрос:

Отлично! API возращает ошибку:

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

Делаем CURL запросы на считывание данных из созданого «permissioned» смарт-контракта из ноды, запущеной на порту 22000:

Это означает, что нода имеет доступ на чтение данных из контракта, что не удивительно, так как эта нода их и создавала.

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

Отлично! В результате выполнения запроса мы действительно смогли прочитать данные:

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

Отлично! Последняя нода действительно не смогла прочитать информацию из смарт-контракта. Как и было задумано.

Заключение

В этой статье я хотел показать, как можно использовать Quorum blockchain для разработки Java приложений. Надеюсь что у меня всё получилось, и вы нашли что-то важное и интересное для себя.

Источник

Оцените статью