Автор: Линь Гуаньхун / Призраки под рукой
Самородки:Талант /user/178526…
Гитхаб:GitHub.com/afan913337456…
Облачная колонка Tencent:cloud.Tencent.com/developer/U…
содержание
- пролог
- подпись данных
- Общий процесс
- Асимметричное шифрование
- Сериализация RLP
- проверка данных
- фальсификация данных
пролог
Самой последней работой была разработка DApps на основе общедоступной сети Ethereum.Хотя я хорошо понимаю ее вызовы API, часть исходного кода не была подробно прочитана. Если вы хотите делать свою работу хорошо, вы должны сначала отточить свои инструменты, поэтому я планирую прочитать исходный код go-версии Ethereum, а в будущем обновлю серию статей. В этой статье в основном рассказывается о том, как sendRawTransaction обеспечивает безопасность наших транзакций.
PS: Моя техническая книга: «Практика разработки блокчейн-приложений Ethereum» опубликована, и ее можно приобрести онлайн.
1. Подпись данных
метод:sendRawTransaction
Общий процесс:
- Передайте параметры ---->
- использовать
from
соответствующийprivateKey
иsecp256k1
Пара алгоритмов各入参
Подпись дает три величины:V
,R
,S
---->
RLP
(递归长度前缀
) последовательность способов сравнивает подписанные данные с исходными входными данными ---->
- Отправить на узел ETH
sendRawTransaction
Различные входные параметры функции:
- с адреса кошелька отправителя
- значение числовое значение, умноженное на десятичное число
- Плата за газ, а не окончательная реальная использованная стоимость, реальная стоимость - это gasUsed
- gasPrice цена за единицу газа
- data Прикрепленные данные, которые можно использовать в качестве входных параметров функции смарт-контракта.
- одноразовый серийный номер транзакции, аналогичный идентификатору
они все будутfrom
соответствующий密钥
Подписание результатов в трех количествах:V
,R
,S
. При этом каждый входной параметр по-прежнему поступает на этап сериализации в исходном видимом виде.
Уведомление:
Есть еще один, называемыйsendTransaction
метод, через分析源码
, его можно найтиsendTransaction
Внутренне это действительно поможет нам в соответствии с параметрами, которые мы передаемfrom
поле к узлуaccountManager
Получено от менеджера по работе с клиентамиfrom
Ключ, который поможет нам подписать данные, так что,sendTransaction
Обычно он используется не для удаленных вызовов, а для локальных вызовов, потому что разблокированный нами кошелек можно настроить только при локальном запуске узла.
Используемый метод шифрования подписи:非对称加密
серединаsecp256k1
Алгоритм эллиптической кривой
Асимметричное шифрование:
Это общий термин для класса методов шифрования. Конкретными для определенного алгоритма, способного его реализовать, являются следующие:
- RSA
- secp256k1 (эллиптическая кривая)
- ElGamal
- ...
иsendRawTransaction
используетсяsecp256k1
Сериализация RLP
RLP
(递归长度前缀
) обеспечивает кодировку, подходящую для произвольных массивов двоичных данных, и RLP стала доминирующей кодировкой для сериализации объектов в Ethereum. Единственная цель RLP — решить проблему кодирования структур; кодирование атомарных типов данных (таких как строки, целые числа, числа с плавающей запятой) передается протоколам более высокого уровня; в Ethereum числа должны представлять собой слова с обратным порядком байтов. Формат хранения с блочным упорядочением и нулевой занятостью.
После подписания данные будут отправлены на узел ETH.
2. Проверка данных
соответствует ЭфириумуsendRawTransaction
RPC-интерфейс.
- После получения сериализованных данных RLP сначала десериализуйте RLP.
func (s *PublicTransactionPoolAPI) SendRawTransaction(..., encodedTx hexutil.Bytes) (common.Hash, error) {
tx := new(types.Transaction)
if err := rlp.DecodeBytes(encodedTx, tx); err != nil { // 反序列化
return common.Hash{}, err
}
return submitTransaction(ctx, s.b, tx)
}
- Базовая проверка данных, в основном некоторые ограничения диапазона и проверка ограничений формата
- tx.Size() > 32*102
- tx.Value().Sign() < 0
- pool.currentMaxGas < tx.Gas()
- ...
-
检查签名
, с помощьюsecp256k1.RecoverPubkey
способ, сам secp256k1 поддерживает согласно информации о подписи反推公钥
Получите открытый ключ контрагента, используя сообщение и подпись. Затем с помощью открытого ключа, подписи и хеш-значения сообщения вычисляется вызов.
r
значение, этоr
Это часть подписи, а проверочная подпись вычисляетсяr
и в подписиr
После сравнения, если они согласуются, проверка пройдена.
if C.secp256k1_ext_ecdsa_recover(
context,
(*C.uchar)(unsafe.Pointer(&pubkey[0])),
sigdata, // 签名
msgdata) == 0 { // msgdata tx 的 hash 内容
return nil, ErrRecoverFailed
}
3. Фальсификация данных
Поскольку VR S, сгенерированный подписью, подписывается закрытым ключом, если модификатор изменяет только внешнее значение, напримерvalue
, должно было передаваться 10 ETH, но его поменяли на 100. При передаче данных в Ethereum при проверке подписи он найдет несоответствие и выдаст ошибку.