Создание и проверка доказательств дерева Меркла с использованием смарт-контрактов Solidity и JavaScript.

Деревья Меркла — отличный криптографический способ получить определенное доказательство. Например, вызов функции смарт-контракта поступил с вашего собственного веб-сайта или вызов функции монетного двора NFT поступил с адреса из белого списка.

В этой статье мы рассмотрим возможности деревьев Меркла в Solidity, используя контракт MerkleProof от OpenZeppelin и наш собственный сервер NodeJS с MerkleTreeJS.

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

Серверная часть

У нас не может быть работающего смарт-контракта, создающего доказательства Меркла, если мы не можем сначала создать деревья Меркла и их доказательства. Для этого я буду использовать NodeJS с MerkleTreeJS. Начнем с установки необходимых нам пакетов.

npm init -y
npm install merkletreejs keccak256

Чтобы создать дерево Меркла, нам нужно импортировать пакет и создать список, который станет нашими «листьями». Эти листья необработанных данных будут хешированы с помощью keccak256.

Здесь мы импортируем пакеты и хешируем наши листья. Теперь мы можем создать наше дерево Меркла, передав ему наши листья и хеш-функцию.

Теперь мы можем визуализировать дерево, если захотим, запустив tree.toString() . Затем он вернет дерево в удобном для чтения формате. Единственное, что нам действительно нужно, это root дерева. Мы получаем это, вызывая .getRoot() . А так как Solidity нужен он в шестнадцатеричном формате, мы также преобразуем его в шестнадцатеричный.

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

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

  1. Адрес Ethereum нажимает кнопку для чеканки (или чего-то еще).
  2. Клиент через API запрашивает у сервера подтверждение адреса пользователя.
  3. Сервер возвращает доказательство клиенту.
  4. Клиентская сторона вызывает смарт-контракт с web3js и передает доказательство в качестве параметра функции контракта.

Поскольку в каждом проекте используется разная серверная часть с разными структурами API, в этой статье я не буду описывать, как это сделать. Но теперь давайте перейдем к контрактной стороне.

Контрактная сторона

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

Мы будем использовать контракт OpenZeppelin v4 MerkleProof для проверки нашего доказательства. Итак, давайте начнем с импорта его в наш смарт-контракт.

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

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

Заключение

Большое спасибо за чтение и хорошего дня.

Подумайте о том, чтобы поддержать меня, подписавшись на Medium. Это мне очень помогает, вам ничего не будет стоить, и вы можете читать сколько угодно статей на Medium!

Подпишитесь на меня в Twitter и gm.xyz, чтобы быть в курсе меня и моих проектов.

Проверьте Pixel Pizzas на блокчейне Polygon.

Вы можете купить мне кофе на Ко-фи!

ПРИСОЕДИНЯЙТЕСЬ К ДИСКОРДУ

Контент, распространяемый Learn.Block6.tech

👉 Дискорд — живые разговоры

👉 Твиттер — Последние статьи

👉 LinkTr.ee