bitcoin与工作量证明
卡扎菲偶遇拉登
发表于 2022-12-25 04:06:38
48
0
0
POW是个什么鬼, 我们先抛开这个概念, 玩个游戏.+ }( f s9 K7 Y$ S/ C* N. W
' r! K& B- Q& C/ H4 L% H
假如有很多人喜欢问我很八卦的问题, 但我只想答有限的几个,1 u# p9 [5 |/ A, w! Q9 E6 k
那让谁答呢? 我出个游戏规则:
8 O3 D0 U* v6 j1 X; p) y
1 先把问题列出来, 重复的问题我不回答啊. T2 c# }- h! o2 h! I ~
/ u2 k# U) i* ?/ @6 h1 F
你有异装癖么
2 做hash运算, 就做sha256吧2 F% h3 x- s T* @& h3 f# X$ y! N
require 'Digest'
Digest::SHA256.hexdigest("你有异装癖么")8 z! l: }) Y$ o9 G0 j: `# [
得到4f65c9ca420e5f191d9f2730c4f99c7fe8f2301a431bade918de9d38f7401a4e+ f3 l& I) _+ D. k0 b0 u _
3 计算hash值, 这个难度太低了, 身边的一堆程序猿都会算.
2 f, f! [; f6 j6 ^- C
我希望 你的问题 加上一个自然数,合并成一个新的字符串,再做hash运算, 得到新的hash值, 使得新的hahs值前4个都是0, 并且这个自然数是最小的, 那好,我就回答你的问题.4 M" ^( _1 ?: ?7 o
% L( R& B/ O& Y+ ^
一言不合就撸码
require 'Digest'
10000.times do |n|/ ?9 N) |2 `0 Z& K5 W# G* f6 d
* k" z4 C. S* b- @
issue = "你有异装癖么"+ b2 b# ]5 Z! C/ `
val = issue + n.to_s6 z) |' \ q4 ?$ B D) i
ret = Digest::SHA256.hexdigest(val)' F3 t' e4 r# B' s1 K, B2 |1 {
if ret[0..3] == "0000" #判断hash值的前4位是0么
puts val5 z" \& j. l3 ~( M, q* h+ r
4 {3 _# h( k: N1 `( C* q# @( t, [
puts n7 G! Y' d3 ~9 w
puts ret8 |( i ^! y$ E9 V1 `8 S8 x
- o! D( ]8 O4 m# V. g# d( ~, D) w
break: D+ E: C7 ~7 B
- t q1 {4 N6 _+ M# v
end
end, c3 V2 Y" ]- Y- H
% T$ ?# N, v; A( Y1 ?
#你有异装癖么3699' r3 M+ U# k; D3 N3 B T% \
#3699
) G8 z" _6 v' |" m3 R8 s" `
#00007ed47ec0280ca933ed5dc9396892fee27c9dbec9c07f95f0247169df1bee
; f. Z% |1 v1 @+ O3 ~, ~
得到 3699,
4 l9 e8 |1 |# \) l! b/ O* I4 V0 d
Digest::SHA256.hexdigest("你有异装癖么3699")的结果符合前4位是0.
你把问题 你有异装癖么3699给我, 我通过验证, 就回答这个问题.. Y; L3 g; p3 W: u0 t9 T! ?' R; }
, P; B) `1 x( ~* n+ l
你有疑惑了, 为啥要从 [1,10000] 这个区间顺序计算呢?
1 ~6 ?# L Q0 J8 M8 N6 g) q
不能随便从一个数字算么?
因为hash运算的结果是无序的, 而且不能进行逆运算, 顺序计算比较方便, 没有遗漏. 通过这个方式得到的自然数, 也是符合游戏规则的最小自然数, 因为是顺序计算的啊' [; z# Z1 j! @9 x0 m
嗯的, 在回到这个游戏, 大家都遵守这个规则, 我也在回答这个问题,- ^/ w; a, R( j0 s( r6 d
又过了一段儿时间, 需要回答的八卦问题还是太多了, 我吃不消了,囧.
* r; b% h9 V: ?( O: u7 u4 A
我定个新规则, 其他的不变, hash值前5位是0的, 我才回答.' v8 J8 ^$ n- G. b* a& N
然后继续运行, 到了我又吃不消的时候, 继续改, 前6位, 前7位, 前8位,
1 u) y) P% H& a6 R, g
前n位是0.
) r9 L; f: _0 z. z+ Q
如果你继续算下去, 你会发现, 算的时间会越来越长,我们可以说难度增加了. 有这样直观的感觉, 前几位是0的个数越多, 这个难度越大, 计算时间越长.# {) {9 H$ M3 ~
! c4 d6 f) K" l/ j5 x* ~! \
难度到底有多大, 也就是时间到底有多长呢?
; R" p* g; c# N( k) K
我拿自己的 2014年款的 mac pro中款粗略算了下,语言是ruby,
2 R. S5 e D0 W4 r
时间就是金钱, 这个时间还是比较可观的.' E% q K; z4 W% L4 w. t
Digest::SHA256.hexdigest("shooter36") #04b4ee0f1b56950f1f9880d076b7449c66705d5712a939a36a49d9973dd50ab3 2ms/ H2 _( m. u& q- L
Digest::SHA256.hexdigest("shooter578") #002bae033279e48835e9a3c8b71a6835bf171a202b700a10ba4bd63710bfcb49 15ms
Digest::SHA256.hexdigest("shooter4434") #00072b50cc7963a310962af33efcd5109cdfb6ac633ce6bb275ce243f3ec247b 406ms
& n8 U9 Z Z/ E3 w
Digest::SHA256.hexdigest("shooter35786") #00002d8c31f6eb29d848cdf520b499cd9f729b1d4d037275d82935b7766eaa3e 4309ms
Digest::SHA256.hexdigest("shooter717095") #00000178662b978d8d7cf930a1caceae70f097354b4fe6423eef2a45ccfb9ce7 82468ms
+ J! t; c! t- K
Digest::SHA256.hexdigest("shooter2038373") #0000001ef511d494ecdddcd2abfded0a34df87a9c76410452e01e0a2958bf0a5 272266ms
说了这么多, 这个游戏规则其实就是POW.
用到bitcoin上,无非是要替换些东西, 八卦问题 => bitcoin需要的数据,
替换bitcoin需要的难度. 理解这个思想很重要, 别的细节慢慢聊.
bitcoin系统的难度有多大呢?
. g( v& x% [7 m8 J
块高度477,360 的hash 000000000000000000e8af89716e0ea8a2aa7c7b789935e98f0a32a4a319247f有18个0.% }) Z8 c' }0 k; X5 o1 p
( n* J5 j2 U! [' ^
Nonce 是十六进制的0x71eee8ca,即算了 1911482570次, 可以试试用一般的笔记本计算19亿次hash需要多长时间.
" j. d2 o( w% p* G3 a7 r: A
POW有什么特点呢?
$ E" N3 t& Z0 [& ~ B; w3 u7 G; z
1 运算不可逆, 就代表谁也不可能偷懒1 y3 y$ S. O( [) z5 R
2 每个值的hash都不一样, 意味着不同的问题都要算, 换个新问题, 就要重新算.8 o8 n: g8 f2 K% i' J, h5 g" b
( D2 {5 R. ]' a$ Y* d
3 你算起来很费劲, 花费时间长2 ?2 |/ r4 `1 b
5 j9 \' y9 E; E6 x7 B& h [& @
4 我验证起来很简单, 把结果hash一下, 符合规则的我就回答, 不符合的抛弃
5 这个规则实现还是比较简单的
结果就是 遵守游戏规则的人很艰难的算出一个结果,会很珍惜,因为你付出了很多的计算资源跟时间, 你希望我能认可你的努力.
成为第一个吐槽的人