精通以太坊-4~6章-思维导图

区块链、以太坊专题链接直达

区块链入门
精通以太坊-1~3章-思维导图
精通以太坊-4~6章-思维导图
精通以太坊-7~9章-思维导图
精通以太坊-10~14章-思维导图

《精通以太坊》

第四章~第六章

学习笔记 思维导图
在这里插入图片描述

附:文本结构

精通以太坊-4~6章
	密码学
		概念知识
			密码学是以太坊的技术基石
			以太坊协议本身没有任何加密信息
				所有通信和交易数据都不是加密的
				因此所有人都可以读取到交易数据等
				每个人都可以验证状态更新的正确性并达成共识
			只有账户地址和数字签名可以在链上传输和存储
			资金的访问和控制权是通过数字签名实现的
			第4章主要是介绍以密钥和地址的形式来控制资金所有权的公钥密码学(PKC)
			两类账户可以操作以太币
				外部账户
					对以太币的所有权是通过私钥、以太坊地址、数字签名建立起来的
				合约账户
					没有私钥来控制所有权
		随机数生成器生成私钥
			使用密码学安全的伪随机数生成器
				并使用熵源充足的随机源做种子
				如CSPRNG
			不要使用“简易”随机数生成器
				因为这种假随机更容易重复
		椭圆曲线加密算法(ECC)
			加法
				Y坐标不同时,A+B=AB连线与曲线的交点P‘,再取交点P‘关于X轴的对称点P
			二倍运算
				A和A为同一点时,A+A=2A,即二倍运算,由切线得出交点P‘,再得到P
			正负取反
				即取该点的X轴对称点
					P=-P
			无穷远点
				互为正反点时,由于没有交点,故称P+(-P)=无穷远点
			ECC比起RSA更快更安全
				RSA基于因数分解难度大
			公钥的计算公式
				公钥K=私钥k*生成点G
					G+G+G+...+G
						G+G=G2
							第一次加法
						G2+G=G3
							第二次加法
						G3+G=G4
							第三次加法
						......
							K=k*G是可以计算得出的
								累加法是最笨最慢的方法
								还有很多更快更先进的方法
									
							已知K、G,求k是几乎不可能的
								每次加法都是基于新的点,k是256位,10^77次方的可能性,快赶上人类已知的原子个数10^80次方了。
							已知一百亿次加法,那就做一百亿次加法,就能得到K
								反过来,不知道是一百亿次,那就得从1次开始尝试推导出k1,用k1试试能不能开锁,不能再尝试第2次加法,直到尝试到一百亿次加法,才能发现开锁成功了,即使一亿秒能完成这么多次尝试,也需要将近三年时间。更何况k远大于一百亿。
			以上特性决定了私钥不可被破解
				接下来,我们需要保证公钥加密的内容只能通过私钥解密,公钥也不能解密
		哈希函数
			概念
				将任意长度数据映射成固定长度数据的数学函数
			是多对一的函数
				可能存在多种输入,得到同一个输入
					这个问题被称为哈希碰撞问题
					哈希碰撞情形越少代表哈希函数性能越好
			特性
				确定性
					同样的输入总会产生同样的哈希值
				可验证性
					计算非常高效(线性计算性能)
				无关联性
					输入消息的微小变化将输出巨大变化哈希值
				不可逆性
					反向计算得出原始信息是不现实的
				碰撞保护性
					???
					防止碰撞的方法
						拉链法
							完全避免碰撞,但实现较复杂
						多哈希法
							依然存在碰撞
						开放地址法
						建域法
			应用
				数据指纹
				数据一致性,错误侦测
				工作量证明
				身份认证
				伪随机数生成器
				消息承诺
				唯一标识符
			基本思路
				对每一个字符计算得出一个散列值并汇总,且每个字符都对后面的字符产生影响
				位数不够的需填充补齐
			以太坊使用的哈希函数
				Keccak-256
		以太坊地址格式
			ICAP协议
				互换客户端地址协议
					一种与国际银行账号(IBAN)编码部分兼容的以太坊地址编码形式
					ICAP是一个去中心化实现
					IBAN是一个中心化,收到高度监管的服务
				ICAP地址可用于编码以太坊地址
				也可用于编码注册再以太坊域名注册服务之下的通用名称
			EIP-55
				十六进制编码地址的大写校验
				能很快速地校验出地址是否拼写错误
	钱包
		概念
			一个用户界面
				控制对以太币的访问、管理私钥和地址、跟踪账户余额、创建并签名交易
			存储和管理用户密钥的系统
				对开发者来说
		私钥保存形式
			JSON格式的keystore文件
			钱包类型
				非确定性(随机钱包)
					这个文件并使用额外的密码进行加密
					额外的密码进行262144轮的哈希计算后,再用于加密,进一步大大提高了破解难度
				确定性(种子密钥)钱包
				层次式确定性钱包
					从单一种子中衍生出多个密钥
				种子密钥和助记词
			最佳实践
				不同钱包类型实现的各种标准
				说白了就是生成密钥和保存密钥的方案
	交易
		概念
			交易由外部账户发出的经过签名的消息,通过以太坊的网络传播,由矿工记录在区块链上
				交易是唯一能够出发区块链状态改变,或出发EVM上的合约执行的东西
			以太坊是一个全局的单体状态机,交易是唯一能让这台状态机向前推进并改变状态的东西
				合约不会自动运行
				以太坊也不会在“后台”运行
				所有这一切,都是由交易触发的
		交易的结构
			交易在以太坊网络上打包和传输的基本结构
				交易是一串打包在一起的二进制数据,包括以下内容
					nonce
						一个序列编号
						由构建这个交易的外部账户提供
						用于防止交易的重放攻击
					gas price
						交易发起方愿意支付的gas
					gas limit
						交易发起方愿意为这个交易支付的gas上限
					recipient
						目标以太坊地址
					value
						发送给目标地址的以太币数量
					data
						附在交易中的可变长度的数据
					v,r,s
						由构建交易的外部账户提供
						椭圆曲线签名的三个组成部分
						可推算出公钥
							进而推算出发起方的地址
						目的是节省区块链数据空间
		交易的随机数
			一个数值
				等于这个地址发出的交易数量
				当这个地址与合约关联时,是这个地址所创建的合约数量
			只在发送地址的上下文中才有意义
				不会作为账户状态的一部分显式的保存在区块链上
				通过计算发送方地址已经确认的交易数量而动态计算的
			重要作用
				交易创建顺序中的可用性特征
					如果没有随机数
						节点会以任意顺序接收交易
						没有任何方法能保证某个节点在另外一个节点之前接收到某笔交易
					一个例子
						当你有10ether时,先发起6ether交易,再发起8ether交易时
							在没有随机数的情况下,接收与否完全时随机的
							如果包含了随机数,假设6e的交易随机数是3,8e的交易随机数时4,那么即使8e先被接收到,也会先处理0到3的交易
								如果nonce跳跃提交,那该交易不会进入区块链,而是保存在待确认交易内存池中,只有在缺失的部分都补齐后,才会写入区块链,并按顺序被处理
				交易重复保护的重要特征
					如果没有随机数,一笔交易可以被攻击者不断复制重放,造成你的损失
					而有了随机数,一笔交易被复制多次也只会被完成一次
			nonce是从0开始计数的
			getTransactionCount
				当有待确认交易时,无法获取到正确的nonce
			parity_nextNonce
				Parity支持的更加准确的获取nonce值的方法
			并发情况下的随机数
				策略一:一台计算机分配nonce,其他计算机先到先得
					问题1:这台计算机可能会单点故障,导致其他计算机拿不到nonce
					问题2:其他计算机只要有1台单点故障,就会导致这台处理的nonce后面的nonce交易被堵住
				策略二:其他计算机发起交易,不带nonce和签名,集中到一台计算机后分配nonce和签名
					问题1:这台分配nonce的计算机单点故障即无法处理任何交易
					缓解问题2:其他计算机个别出故障时,互相不影响
				策略三:不得不抛弃并发
					1:单进程处理所有交易
					2:间歇性重新计算余额
		交易的gas
			以太坊的燃料
			跟以太币存在汇率关系
			控制交易对资源的使用
			独立于以太币,以太币价格大幅度波动情况下也能保护系统的灵活性
				对于各种消耗gas的资源,gas能够管理它们之间重要而敏感的汇率关系
			案例:将以太币从一个账户转账到另一个账户
				所需要的gas数量是固定的21000单位个的gas
				gasPrice
					gasPrice允许交易的发起方设定针对gas的汇率
					计量单位是wei/gas
						如本书中的实例,钱包软件把gasPrice设定为3(gwei)
					gasPrice越高,交易被确认的速度也越快
						对ETH汇率越高,同等数量的gas(21000)对应支付的ETH也就越高
					gasPrice可以为0,在区块有多余空间时也会被矿工打包提交到区块链之上
						有可能永远不被确认,但区块链上存在这种交易已成功处理
				gas*gasPrice=21000*3(gwei)= 63000(gwei)=63000/10亿(ETH)
					10亿(gwei)= 1ETH
			gasLimit
				是发起方愿意支付的最大gas数量
					如果交易目标地址是一个合约,那么需要的gas数量是可以估计,但很难精确算出
						合约可以根据不同初始条件,选择不同的执行路径,这样就会导致不同的gas开销
						因此你需要提供一个足够执行完成的gas数量,最终按实际消耗扣除费用
					发出交易时,验证交易的第一步时确保发起交易的账户中有足够的以太币来支付对应的gas费用(gasPrice*gas)
						但是不会从账户中直接扣除gas
						而是直到交易执行结束后才会扣除
						你只会被扣除交易执行所实际发生的gas
						但是账户中必须有高于你在交易中指定的最高gas费用对应的以太币,这个交易才能被通过验证
		交易的接收方
			to字段指定
				20字节的地址
					外部账户地址
					合约地址
				不会验证地址,只要20字节的值都会被认为是正确的
				如果向一个没有对应私钥的地址发送以太币,相当于是销毁以太币
				接收方地址的验证工作需要在用户应用这一层完成
					十六进制编码地址的大写校验
				由于以太币的数量是有限的,合理销毁以太币能有效地将价值传到所有以太币持有者手上(按持有以太币的比例)
		交易中的以太币和数据
			核心
				value
				data
					函数选择器
						被调用函数原型的哈希值的前4个字节
							可准确无误地识别被调函数
					函数参数
						函数的参数
							追加到函数选择器后,填满32字节
					Data组成实例
						2e1a7d4d000000000000000000000000000000000000000000000000002386f26fc10000
							函数
								2e1a7d4d
									web3.sha3(”withdraw(uint256)”)
							参数
								2386f26fc10000
									0.01ether
			交易类型
				同时包含value和data
				只有value
					转账
				只有data
					调用合约
				没有value也没有data
					什么也不发生
			目标地址
				外部账户
					存在此账户就增加余额
					不存在就创建这个地址并初始化余额为此value
					通常对外部账户发起的交易中的data字段内容没有意义,以太坊协议没有对此作出规。只有少部分特定的钱包软件(接受者)会对此解读
				合约
					data字段指定要调用的函数
					如果data为空,则调用回退函数
						回退函数如果是可支付的,那么根据函数的代码来决定下一步动作
						如果没有回退函数,则增加合约的余额
		合约创建
			特殊交易
				to:0x0
					目标地址为零地址
					仅用来合约注册,但也可能误操作而销毁以太币
				data为编译后的合约字节码,value字段包含以太币可为合约设置起始余额(这是可选的)
		数字签名
			椭圆曲线数字签名算法
				ECDSA
			三个作用
				证明签名方是私钥的持有人
					授权以太坊转账或合约的执行
						身份认证
				证明这个授权是不可否认的
					发送方不能否认
				确保交易数据在经过签名之后没有也不能被任何人修改
					完整性
			工作原理
				创建签名
					使用私钥签名
				验证签名
					任何人使用消息和公钥验证签名
			具体算法
				略
		签名的前缀和公钥恢复
			公钥恢复
				获得公钥之后,很容易计算出发起方的以太坊地址
			v字段
				偶数
					R是正确的值
				奇数
					R‘是临时公钥
		离线签名
			签名和广播分开处理
				离线签名,保证私钥的安全
				广播是需要连接到互联网上
			签名和广播的机器分开两台机器处理,并且保证签名的机器是未联机的
				USB离线传输签名
				离线签名生成QR码,扫码传输
		交易的传播
			平均每个节点维护了至少13个跟它直接相连的其他节点,称为邻居
				每个邻居节点都会在收到交易数据包后立刻进行验证
				如果它们确认交易数据包合法,这些节点就会保留一份交易副本,然后把交易数据包广播给与它们相连的邻居(除去消息来源的那个上游节点)
					因此,交易就像水中的波纹一样,在整个网络中迅速传播开,直到所有节点都收到了一份交易的副本
				节点可对所广播的消息进行过滤,但默认情况下,会广播收到的所有验证消息
				在短短几秒内衣他以太坊交易就能到达全球范围内的所有以太坊节点
				从单个节点的角度而言,它无从知晓这个消息的来源
					因此攻击者必须控制网络中的大部分节点
		记录在区块链上
			合理验证过的交易最终会被包含在一个区块中,并且记录在以太坊的区块链上
				记录到区块链之后,交易就会更改以太坊网络的单体,修改账户余额,或者调用改变内部状态的合约
			到此就是一笔交易的全过程
				创建
				签名
				写入区块链
		多签名交易
			创建多重账户
			该账户只有在多方共同签名的情况下才能花费其中的资金
				利用“钱包合约”编程
				将以太币转移到多重签名合约
				安全性由这个多重签名合约的代码决定
			比特币有多重签名系统,以太坊则依赖另外的合约实现
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值