以太坊: ETH 发送交易 sendRawTransaction 方法数据的签名 和 验证过程
作者:林冠宏 / 指尖下的幽灵
GitHub : https://github.com/af913337456/
腾讯云专栏: https://cloud.tencent.com/developer/user/1148436/activities
目录
- 前序
- 数据签名
- 整体流程
- 非对称加密
- RLP 序列化
- 数据验证
- 数据篡改
前序
最近的工作一直是基于 以太坊公链 做 DApp 开发,虽然对其各 API 的调用都已经很了解了,但是源码部分一直还没深入去看过。工欲善其事,必先利其器,故计划阅读完 以太坊go 版源码,后续会更新系列文章。本文主要简谈 sendRawTransaction 是如何保证我们交易安全的。
1.数据签名
方法:sendRawTransaction
整体流程:
- 传入各参数 ---->
- 使用
from
对应的privateKey
与secp256k1
算法对各入参
签名得出三个量:V
,R
,S
---->
RLP
(递归长度前缀
) 方式序列比签名的数据 与 原入参数据 ---->
- 发送到 ETH 节点
sendRawTransaction
函数的各个入参:
- from 发送者钱包地址
- value 数值,为与 decimal 的乘积
- gas 油费,非最终真实使用值,真实为 gasUsed
- gasPrice 油费单价
- data 附属的数据,可做智能合约函数入参
- nonce 交易系列号,类似id
它们都将会被 from
所对应的密钥
进行签名而得出三个量:V
,R
,S
。同时,各个入参依然以原来的可见的形式进入序列化步骤。
注意:
还有另外一个叫做 sendTransaction
的方法,通过分析源码
,可以发现 sendTransaction
内部其实会帮助我们根据我们传参的 from
字段到节点的 accountManager
账号管理器中获取from
的密钥,来帮我们进行数据签名,所以,sendTransaction
一般不会用于远程调用,而用于本地调用,因为只有在本地启动节点的时候,才能配置我们解锁的钱包。
所用的签名加密方式是:非对称加密
中的 secp256k1
椭圆曲线算法
非对称加密:
它是一类加密方式的统称。具体到某种能实现它的算法有下面几种:
- RSA
- secp256k1 (椭圆曲线)
- ElGamal
- ...
而 sendRawTransaction
用到的就是 secp256k1
RLP 序列化
RLP
(递归长度前缀
)提供了一种适用于任意二进制数据数组的编码,RLP已经成为以太坊中对对象进行序列化的主要编码方式。RLP的唯一目标就是解决结构体的编码问题;对原子数据类型(比如,字符串,整数型,浮点型)的编码则交给更高层的协议;以太坊中要求数字必须是一个大端字节序的、没有零占位的存储的格式。
签名后,数据将会被发送到 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. 数据篡改
因为签名生成的 V R S 是由私钥进行签名的,如果修改者只修改了外部的值,例如 value
,本来是要转 10 个 ETH , 被改成转 100 个,等数据传到以太坊的时候,在检查签名的时候,就会发现不匹配,而抛出错误。
以太坊: ETH 发送交易 sendRawTransaction 方法数据的签名 和 验证过程的更多相关文章
- 以太坊ETH中智能合约消耗的Gas、Gas Limit是什么?
以太坊ETH中智能合约消耗的Gas.Gas Limit是什么? 数字货币交易一般是有交易费的,比特币(BTC)的交易费很容易理解,就是直接支付一定额度的BTC作为手续费.而以太坊(ETH)的交易费表面 ...
- 以太坊 EVM内交易执行分析(一)
以太坊上交易最终都会由EVM进行解析存入数据库,今天就来探讨一下,一笔交易是如何别EVM执行的.我们可以把交易分为三种.(注意,和交易相关的模块很多,交易的生命周期存在于整个以太坊中,我们这次只是分析 ...
- 以太坊 EVM内交易执行分析(二)
接着上次的分析,分析一下run方法是如何执行智能合约的.至于以太币的交易,在上一篇中,已经由分析的那两个函数完成了: 合约的运行是从run开始的,go-ethereum/core/vm/evm.go ...
- 以太坊中的账户、交易、Gas和区块Gas Limit等概念
什么是账户 以太坊账户与我们所知的账户概念有一定相似之处,却又有很大的区别,更不同于比特币中UTXO. 账户分两类: - 外部拥有账户(EOA),也就是普通账户 - 合约账户 普通账户 所谓的普通账户 ...
- 以太坊和IPFS如何存储数据
如何将JSON文件存储在IPFS上,并使用Oraclize访问智能合约中的数据呢? 以太坊是一个成熟的区块链,使开发人员能够创建智能合约,在区块链上执行的程序可以由交易触发.人们经常将区块链称为数据库 ...
- 数字货币比特币以太坊买卖五档行情数据API接口
数字货币比特币以太坊买卖五档行情数据API接口 数字货币一般包含比特币BTC.以太坊ETH.瑞波币XRP.泰达币USDT.比特币现金BCH.比特币SV.莱特币LTC.柚子币EOS.OKB. ...
- 理解以太坊的Layer 2扩容解决方案:状态通道(State Channels)、Plasma 和 Truebit
-宾夕法尼亚州的尼科尔森大桥建设照片(图源).罗马人的工程原理扩展至新的应用 对于以太坊来说,2018年是专注底层架构之年.今年很多早期参与者会测试网络极限,并且重新关注以太坊的扩容技术. 以太坊仍然 ...
- 死磕以太坊源码分析之Ethash共识算法
死磕以太坊源码分析之Ethash共识算法 代码分支:https://github.com/ethereum/go-ethereum/tree/v1.9.9 引言 目前以太坊中有两个共识算法的实现:cl ...
- 死磕以太坊源码分析之txpool
死磕以太坊源码分析之txpool 请结合以下代码阅读:https://github.com/blockchainGuide/ 写文章不易,也希望大家多多指出问题,交个朋友,混个圈子哦 交易池概念原理 ...
随机推荐
- 【map离散&容斥】Ghosts @Codeforces Round #478 (Div. 2) D
传送门 题意:给你一条直线的斜率a和截距b,和某一时刻n个在直线上的点的横坐标,以及沿坐标轴方向的速度.问你这些点在(-∞,+∞)的时间内的碰撞次数. solution 设两个点在t时刻相碰,有: x ...
- C# Xamarin移动开发基础进修篇
一.课程介绍 英文原文:C# is the best language for mobile app development. Anything you can do in Objective-C, ...
- python测试开发django-50.jquery发送ajax请求(get)
前言 有时候,我们希望点击页面上的某个按钮后,不刷新整个页面,给后台发送一个请求过去,请求到数据后填充到html上,这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新.Ajax可以完美的 ...
- java使用httpclient封装post请求和get的请求
在我们程序员生涯中,经常要复用代码,所以我们应该养成时常整理代码的好习惯,以下是我之前封装的httpclient的post和get请求所用的代码: package com.marco.common; ...
- 关于TF(词频) 和TF-IDF(词频-逆向文件频率 )的理解
##TF-IDF TF(词频): 假定存在一份有N个词的文件A,其中‘明星‘这个词出现的次数为T.那么 TF = T/N; 所以表示为: 某一个词在某一个文件中出现的频率. TF-IDF(词频-逆向 ...
- Mongodb系列- CRUD操作介绍
---恢复内容开始--- 一 Create 操作 在MongoDB中,插入操作的目标是一个集合. MongoDB中的所有写入操作在单个文档的层次上都是原子的. For examples, see In ...
- Oracle数据库远程连接配置教程
本人前一段时间做过Oracle数据库的相关工作.可是发现数据库的监听程序和服务名比較难搞定,并且网上也没有现成的教程.所以经过自己的探索之后将这片文章贡献给大家,如有不当之处还请谅解并请联系本人. 此 ...
- Spring Boot 2.x 学习专栏
Spring Boot 2.0 入门指南 Spring Boot 2.0 返回JSP页面实战 Spring Boot 2.0 热部署指南 Spring Boot 2.0 整合FreeMarker模板引 ...
- 使用 Node.js 搭建API 网关
外部客户端访问微服务架构中的服务时,服务端会对认证和传输有一些常见的要求.API 网关提供共享层来处理服务协议之间的差异,并满足特定客户端(如桌面浏览器.移动设备和老系统)的要求. 微服务和消费者 微 ...
- lua中table的遍历,以及删除
Lua 内table遍历 在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: 1. ipairs for index, value in ipair ...