椭圆曲线密码学 工作量证明
zhigang302
发表于 2023-1-1 05:40:39
424
0
0
( y" M9 }/ z8 _' L T2 i c* s, ^
椭圆曲线密码学(英语:Elliptic Curve Cryptography,缩写为ECC)是一种基于椭圆曲线数学的公开密钥加密算法。3 R2 w2 o' d. U/ [/ l
下图示例大多数加密资产使用与比特币完全相同的椭圆曲线,称为 secp256k1 。这使得重新使用比特币的许多椭圆曲线库和工具成为可能。
椭圆曲线技术用于创建由私钥派生出来的公钥。, p# M" v8 Z: d. G' w
椭圆曲线技术工作原理& W, f3 B! j' M# [( o
以一个随机生成的数字_k_的私钥开始,我们通过将它乘以称为_generator point_ G_的曲线上的预定点,在曲线上的其他位置产生另一个点,这是相应的公钥_K。生成点被指定为+secp256k1+标准的一部分,对于+secp256k1+的所有实现始终相同,并且从该曲线派生的所有密钥都使用相同的点_G_: A2 t: @+ T% K: k ?9 D3 W
; \0 d0 X2 D0 o% q4 @
K = k * G
k 是私钥
G 是预定点
3 F8 \ [' w, o' G) Q
K 是生成的公钥,曲线上的某一点' }- c5 }+ l* V. f7 {6 Q& p4 e
W# ^% g/ U4 C% Q+ o: D, _5 o2 ?
由于所有比特币用户曲线上的预定点总是相同的,私钥k乘以G将得到的公钥K始终相同.k和K之间的关系是固定的,但这种情况只存在于单向运算,即只能从k到K。这就是比特币地址(从K派生)可以与任何人共享并且不会泄露用户的私钥(k)的原因。1 j5 i, K& _ y2 v5 n; k* H2 h v8 o
7 T* S6 c0 f& T# z4 d
为了将一个点与整数相乘可视化,我们将使用比实数更简单的椭圆曲线来描述,旨在找到曲线上的预定点G的多个kG。+ E5 R/ x. N8 J$ H* Q5 m( V; U& h
! \ Q% m0 U1 N+ ^) _, i
这个运算逻辑与将G自身连续相加k次相同。在椭圆曲线中,向自身添加一个点相当于在点上绘制切线并再次找到它与曲线相交的位置,然后在x轴上反映该点。( x/ \1 j1 [# A: U1 y/ {& q7 W3 ?
+ x( V% U. f1 _2 G0 k1 U4 d' x0 H
下图显示了导出G,2G,4G的过程,作为曲线上的几何运算。
3 ~ `& h6 e& I: E% |6 ^9 }
1. 第一步是拥有可靠的随机源并获得一个随机数(256位) 。' D' v' \5 P, C9 z% ~
2. 其次,需要将SHA256应用于该数字,并将获得私钥(k)。+ y5 P: l9 K/ _3 g/ F$ q7 j
; m& ]7 h4 V- x: k
3. 通过应用椭圆曲线(加密技术),继而获得公钥(K),如上所述。7 A* `5 S' F, |: U- r* E
4. 代入SHA 256和RIPEMD160(一个不同的散列函数),最终得到比特币地址。
4 m* t. f+ e( Q/ _" C
5. 以多种不同的格式显示地址,最常见的是QR码。
区块如何相互链接?
/ w$ M# U1 {5 o, S0 K
每个区块都包含许多事务。每个区块包含有关该特定区块的特定信息。区块的主要字段是该区块的区块头。区块头包含上一个区块的哈希值(PreHash),本区块体的哈希值(Hash),以及时间戳(TimeStamp),区块的难度,Root:StateDB中的“state Trie”的根节点的RLP哈希值。Block中,每个账户以stateObject对象表示,账户以Address为唯一标示,其信息在相关交易(Transaction)的执行中被修改。所有账户对象可以逐个插入一个Merkle-PatricaTrie(MPT)结构里,形成“state Trie”。Nonce:一个64bit的哈希数,它被应用在区块的"挖掘"阶段,并且在使用中会被修改。
区块链是一个链状结构,包含链条的头节点(第一个区块)和尾节点(最后一个区块)。一旦有人计算出区块链最新数据信息的哈希值,相当于对最新的交易记录进行打包,新的区块会被创建出来,衔接在区块链的末尾。/ `$ s, L: _# s8 W5 l
. T0 Q! l; n- }7 s! K. g8 ]; s
工作量证明(POW)8 j7 P5 v3 }3 j1 Y1 x
. D4 _, l0 Y9 R6 _# `
如上所述,工作量证明(POW)系统(或协议或功能)是对应服务与资源滥用、或是阻断服务攻击的经济对策。1 f \2 p* d/ I6 b% n8 T% ^
工作原理:9 R4 [4 F( U- L9 M3 G
如上所述,区块头包含:上一个区块的哈希值(PreHash),本区块体的哈希值(Hash),以及时间戳(TimeStamp),区块的难度,Root,Nonce。
执行PoW的关键元素是Nonce。PoW的运作由分散在各处的计算机,竞赛谁能最早找出,搭配原本要打包的数据的穷举猜测值(Nonce),谁就等同获得该区块的打包权(记账权)。此猜测值被找出后,与数据、散列值一起打包成块后广播,经多数节点确认与承认,打包者就能获得打包该区块所提供的奖励。' S3 s3 n" T3 E1 z- V, |9 s
如果你是一个矿工,你需要做的第一件事就是“挖矿”找到一个区块头并并应用SHA256。 为此,你需要为Nonce分配一个数字,因为区块头的所有其他字段都是固定的。例如,假设以Nonce = 0开头。这样,你将获得一个字母数字字符串(2poiuwfsvhxnv382249j)。$ d9 ]; T' P v3 |, c5 ~
如下所示:: h7 G3 h- ?% o8 W$ R$ V; V6 L
& \, s; X/ ?) a3 p
然后,你需要做的是将所得结果与目标值进行对比。目标值是一个变量,用于在开头定义数字或字母数数字串。(例如0000000wirug43xj)。% |! P# g% T! H5 D' x3 Q/ H/ `: U
问题是:特定的Nonce的区块头的哈希值与目标值的0相同还是比它多? 例如:2poiuwfsvhxnv382249j与0000000wirug43xj相比,前者所含0比后者少。 那么你需要在区块头上标题上更改哪个变量以便应用SHA256来获得不同的结果?这是SHA256的碰撞阻力属性的益处。 碰撞阻力是加密散列函数的一个属性:如果很难找到散列到同一输出的两个输入,则散列函数H是抗冲突的;也就是说,两个输入a和b使得H = H,并且a≠b。 输入多于输出的每个散列函数都必然会发生冲突。考虑一个哈希函数,如SHA-256,它从大输入产生256位输出。 因为通过简单地将Nonce更改为区块头并应用SHA 256,结果与前一个答案完全不同(并且是随机的)。 将上述示例中的Nonce更改为 1,结果为“0057aas?hlqywirfdr334”。
0057aas?hlqywirfdr334 所含的0与0000000wirug43xj的0数量也不相同。
该过程持续进行(此过程中矿工每秒都会经历数百万次的计算,当所得结果错误时将再次进行尝试),直到获得目标的Nonce。( U: j3 m5 Y* C% z
因此,所有矿工都在竞争,以便成为第一个找到目标Nonce的人,这也体现了PoW的劣势,即浪费能源。
一旦矿工获得Nonce,他就会在网络里广播,其他节点就会发现通过输入Nonce并且应用SHA256Nonce来快速验证目标值。
8 X9 k& T; H; n3 V$ ^ l1 \
作为奖励,获取该区块Nonce的矿工以两种方式接收比特币:
* C$ {2 Q9 `7 j# H) c
1)该块中包含的交易所支付的费用。( n, d! J% D3 }! {; \/ A
2)系统创建新的比特币。(截至2017年5月,其12.5 btc / block)3 q! b9 o* B2 g. @" E
4 r) P$ _0 M' F% A+ ?
矿工找到Nonce需要多长时间?. Y1 v. k3 {, ^2 F I! i
中本聪设计比特币时,加入挖矿难度调整机制是为了使得比特币出块时间能理想的恒定在10分钟左右。比特币协议规定每隔2016个区块,将根据过去最近2016个区块出块总时间调整,自动调整下一个2016个区块的挖矿难度。理想情况下2016个块需要两周(2016*10s)时间,如果实际用时不到两周则增加难度,如果超过两周就降低难度。2 b% `5 s+ l: j" G
) B1 e' s [9 f5 c2 H* Z3 v
增加难度意味着将在目标值的开头添加零;降低难度意味着在目标值的开头减少零。
成为第一个吐槽的人