Одной из основных целей, которых стремятся достичь проекты на основе блокчейна, является проверка данных. В качестве живых примеров вы можете посмотреть цифровую идентификацию и онлайн-хранилище и проверку документов. Действительно, любой из этих случаев требует проверки инициатора действия/транзакции для подтверждения физического или юридического лица. Например, если у человека есть цифровой вид документа, удостоверяющего личность, становится крайне важно обеспечить право собственности. Таким образом, это отличный пример проблемы проверяемости данных. Рассмотрим простейшую форму решения — цифровую подпись, тестирование которой является одним из важнейших моментов при разработке смарт-контракта.
Подход прост:
1) система формирует сообщение по известным всем правилам
2) подписывающая сторона получает сообщение и добавляет определенный набор символов — цифровую подпись, код, созданный из сообщения с помощью закрытого ключа.
3) сгенерированная подпись теперь отправляется в контракт, где она разлагается для получения адреса подписывающей стороны.
Solidity предлагает вам алгоритм ECDSA для генерации подписи и дальнейшей декомпозиции. Нам не нужно глубоко погружаться в сам алгоритм (нужную информацию вы можете найти в соответствующих источниках). Все, что нам нужно знать, это то, что ECDSA — это пример асимметричной криптографии, где первый пользователь создает подпись с помощью своего закрытого ключа, а второй пользователь применяет стандартный алгоритм для получения открытого ключа подписавшего. Таким образом, он может проверить источник подписи. Вместо этого давайте сосредоточимся на практической части — использовании и тестировании сигнатур.
Прежде всего, нам нужно признать проблему. Например, контракту необходимо выполнить какое-то действие, скажем, сохранить адрес вызывающего абонента. Хотя контракт должен выполнять сохранение только в том случае, если вызывающая сторона проверена, мы должны быть уверены, что никто не сможет использовать свой адрес без разрешения. Чтобы получить подлинного вызывающего абонента, нам нужно сгенерировать какое-то сообщение, подписать его и разложить по контракту.
Вы можете найти стандартное решение в документации Solidity (например, в 0.8.4 — последняя стабильная версия на момент публикации). Документы предлагают нам контракт, для которого необходимы следующие встроенные функции: генерация сообщений, разделение подписи и ассемблерный код для получения подписывающего лица. В примере показаны все необходимые методы, и он довольно прост, но имеет два недостатка: ему не хватает универсальности и нет хорошего примера тестирования решения. Поэтому я предоставляю свою версию кода и (собственную цель) — стратегию тестирования контракта.
Конечно, вы можете использовать стандартная библиотека OpenZeppelin для операций ECDSA, но вы снова столкнетесь с теми же проблемами — отсутствием гибкости и подходов к тестированию. Итак, давайте углубимся в мой пример логики, основанной на сигнатурах. Вы можете найти полную рабочий пример в моем GitHub, но мало мест, которые хочется показать полностью.
Прежде всего, мы подготовим сообщение. Как видите, он формируется из двух упакованных и хешированных адресов кошелька:
Второй важный фрагмент кода — хеширование сообщения вместе со стандартным сообщением Ethereum:
Он показывает, что сообщение было отправлено внутри сети Ethereum и имеет длину 32 байта, что не является случайным числом. После предыдущих операций у нас есть хэш длиной 32 байта. Очень важно иметь дополнительную функцию хеширования в такой форме, и мы обсудим это чуть позже.
Остальные фрагменты кода довольно стандартны. Функция разделения подписи выглядит следующим образом:
и вот функция для получения подписывающего лица:
Для внешнего интерфейса мы будем использовать пользовательскую функцию, которая получает подпись и необходимые аргументы, проверяет, зарегистрирован ли уже пользователь, формирует сообщение и проверяет подпись:
Сначала мы сымитируем сообщение, которое необходимо подписать. Мы будем использовать эфиры.js библиотека, которая (вместе с Web 3) самая используемая и удобная библиотека. Поскольку это библиотека с открытым исходным кодом, вы можете свободно исследовать его код и документация. Кроме того, эта библиотека предоставляет нам идеальный интерфейс для создания следующего сообщения:
Один из минусов обоих Web 3 и простые эфиры библиотек заключается в том, что они не имеют всех функций для локальной среды Ganache, поскольку обе библиотеки предназначены для работы с полными узлами Ethererum. Тем не менее, существует подход к локальному тестированию с использованием функциональность web3-аккаунта. Однако вам необходимо создать дополнительную учетную запись, которая будет реализовывать функционал певца и обеспечивать подключение к текущему провайдеру web3:
Итак, теперь у нас есть сгенерированное и подписанное сообщение. Но это еще не все; есть еще несколько вещей, о которых стоит поговорить. Обе библиотеки (web3 и ethers) «под капотом» обеспечивают дополнительное хеширование сообщения перед созданием подписи. Кроме того, сообщение не просто хэшируется, а объединяется со стандартным сообщением Ethereum, которое мы видели ранее:
И именно поэтому мы добавили в контракт дополнительный метод. Итак, если вы хотите использовать собственные сообщения, пропустить дополнительное хеширование и т. д., вам необходимо создать собственную версию функции подписи. Причину мы обсуждали выше — обе стандартные библиотеки реализуют типичный подход к подписанию сообщения, изменить который можно только переопределив функциональность.
В качестве последнего шага давайте запустим тест и проверим, правильно ли он работает:
Мы протестировали генерацию подписи, сгенерированное сообщение, утверждение и отклонение подписи. Так что это довольно полный набор тестов для проверки функционала.
- Учетная запись
- Действие
- дополнительный
- алгоритм
- Все
- Аргументы
- гайд
- аутентичный
- Немного
- случаев
- Проверки
- код
- контракт
- криптография
- Текущий
- данным
- Развитие
- Интернет
- цифровая идентификация
- Документация
- Окружающая среда
- Эфириума
- эфирная сеть
- Face
- Во-первых,
- Трансформируемость
- Фокус
- форма
- Бесплатно
- полный
- функция
- хорошо
- хэш
- Хеширования
- HTTPS
- ia
- Личность
- информация
- IP
- IT
- Основные
- последний
- Библиотека
- локальным
- средний
- сеть
- узлы
- предлагают
- Предложения
- онлайн
- открытый
- с открытым исходным кодом
- Операционный отдел
- частная
- Секретный ключ
- проектов
- что такое варган?
- публичный ключ
- обзоре
- Run
- набор
- просто
- So
- основательность
- раскол
- диск
- магазин
- Стратегия
- система
- тестXNUMX
- Тестирование
- тестов
- Источник
- us
- проверка
- Кошелек
- Википедия.
- в
- Работа
- работает