Ethereum: ETH отправка транзакции, метод sendRawTransaction, подпись данных и процесс проверки

внешний интерфейс алгоритм программист блокчейн Эфириум
Ethereum: ETH отправка транзакции, метод sendRawTransaction, подпись данных и процесс проверки

Автор: Линь Гуаньхун / Призраки под рукой

Самородки:Талант /user/178526…

Блог:www.cnblogs.com/linguanh/

Гитхаб:GitHub.com/afan913337456…

Облачная колонка Tencent:cloud.Tencent.com/developer/U…


содержание

  • пролог
  • подпись данных
    • Общий процесс
    • Асимметричное шифрование
    • Сериализация RLP
  • проверка данных
  • фальсификация данных

пролог

Самой последней работой была разработка DApps на основе общедоступной сети Ethereum.Хотя я хорошо понимаю ее вызовы API, часть исходного кода не была подробно прочитана. Если вы хотите делать свою работу хорошо, вы должны сначала отточить свои инструменты, поэтому я планирую прочитать исходный код go-версии Ethereum, а в будущем обновлю серию статей. В этой статье в основном рассказывается о том, как sendRawTransaction обеспечивает безопасность наших транзакций.

PS: Моя техническая книга: «Практика разработки блокчейн-приложений Ethereum» опубликована, и ее можно приобрести онлайн.

1. Подпись данных

метод:sendRawTransaction

Общий процесс:

  1. Передайте параметры ---->
  1. использоватьfromсоответствующийprivateKeyиsecp256k1Пара алгоритмов各入参Подпись дает три величины:V,R,S ---->
  1. RLP (递归长度前缀) последовательность способов сравнивает подписанные данные с исходными входными данными ---->
  1. Отправить на узел 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. Проверка данных

соответствует ЭфириумуsendRawTransactionRPC-интерфейс.

  1. После получения сериализованных данных 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)
}
  1. Базовая проверка данных, в основном некоторые ограничения диапазона и проверка ограничений формата
    • tx.Size() > 32*102
    • tx.Value().Sign() < 0
    • pool.currentMaxGas < tx.Gas()
    • ...
  2. 检查签名, с помощью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 при проверке подписи он найдет несоответствие и выдаст ошибку.

Категории