Создание и проверка доказательств дерева Меркла с использованием смарт-контрактов 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. Нам нужно только хэшировать значение с той же хеш-функцией, получить доказательство и проверить его.
В реальном приложении вы должны выполнить следующие шаги, чтобы безопасно сгенерировать хэш и отправить его в свой контракт:
- Адрес Ethereum нажимает кнопку для чеканки (или чего-то еще).
- Клиент через API запрашивает у сервера подтверждение адреса пользователя.
- Сервер возвращает доказательство клиенту.
- Клиентская сторона вызывает смарт-контракт с web3js и передает доказательство в качестве параметра функции контракта.
Поскольку в каждом проекте используется разная серверная часть с разными структурами API, в этой статье я не буду описывать, как это сделать. Но теперь давайте перейдем к контрактной стороне.
Контрактная сторона
Чтобы эта статья была минимальной, я буду использовать Remix для быстрого создания и тестирования смарт-контракта на виртуальной цепочке блоков.
Мы будем использовать контракт OpenZeppelin v4 MerkleProof для проверки нашего доказательства. Итак, давайте начнем с импорта его в наш смарт-контракт.
Следующее, что нам нужно сделать, это каким-то образом получить корень нашего дерева внутри контракта. И, наконец, нам нужно создать функцию, которая проверяет доказательство, которое мы получаем от сервера. Эта функция либо отменяет, либо возвращает true
.
Теперь, для этого примера, нам нужно вручную скопировать контрольный хэш и вставить его в ремикс, чтобы убедиться, что он работает. Или вы можете продолжить самостоятельно и развернуть контракт и создать API для его вызова. Удачи!
Заключение
Большое спасибо за чтение и хорошего дня.
Подумайте о том, чтобы поддержать меня, подписавшись на Medium. Это мне очень помогает, вам ничего не будет стоить, и вы можете читать сколько угодно статей на Medium!
Подпишитесь на меня в Twitter и gm.xyz, чтобы быть в курсе меня и моих проектов.
Проверьте Pixel Pizzas на блокчейне Polygon.
Вы можете купить мне кофе на Ко-фи!
ПРИСОЕДИНЯЙТЕСЬ К ДИСКОРДУ
Контент, распространяемый Learn.Block6.tech
👉 Дискорд — живые разговоры
👉 Твиттер — Последние статьи