Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

bitcoin与工作量证明

卡扎菲偶遇拉登
160 0 0
挖矿的时候需要经常听到一个词 工作量证明 , 即Proof Of Work,简称POW.
+ N; Z% j% M$ B
! f/ f* F! y2 w7 E3 F; q4 HPOW是个什么鬼, 我们先抛开这个概念, 玩个游戏.
& U4 @( g; `' n& K7 d; x- Z" E/ J) h2 u
假如有很多人喜欢问我很八卦的问题, 但我只想答有限的几个,( v  @, f& E1 ?. o; \6 D

$ C( D( ?/ d) n那让谁答呢? 我出个游戏规则:
( R# c% O1 s8 q# _& z5 X& @; ^$ x; e- g# r9 p; w+ [- L! h  s
1 先把问题列出来, 重复的问题我不回答啊+ x+ K3 \  w6 h& A9 x3 f4 I

0 g/ h* D  \) o你有异装癖么
- E8 {/ w1 x) n4 F: ~% V. t7 C7 K; O
2 做hash运算, 就做sha256吧& m& R: ?: ]! d& S5 ]
' ^4 D# C, p( l) J2 J
require 'Digest'7 x4 n& F4 j% [2 d" Q- v
, w+ o% }$ t3 {" X! p" S: z
Digest::SHA256.hexdigest("你有异装癖么")# p, ~$ t, p$ q
5 j/ X+ ?! O' C0 b. k, Q
得到4f65c9ca420e5f191d9f2730c4f99c7fe8f2301a431bade918de9d38f7401a4e
7 ^. r' O6 v0 Z3 `) ^1 n
& I# h- Q9 d  p5 E. e* ?1 U$ h3  计算hash值, 这个难度太低了, 身边的一堆程序猿都会算.
1 k0 s2 {9 E/ }, @5 E  N6 m  G5 f! P6 H' Q3 X+ F  O* x
我希望 你的问题 加上一个自然数,合并成一个新的字符串,再做hash运算, 得到新的hash值, 使得新的hahs值前4个都是0, 并且这个自然数是最小的, 那好,我就回答你的问题.7 f' a+ O# F! d  ?7 D* U+ l: v
% E8 p1 ]2 p. j+ w$ j4 C
一言不合就撸码$ `1 _; }" H9 P4 U: a% z
9 v8 ~$ H3 N  c6 v0 d
require 'Digest'/ ?6 w0 v" [. q
& U9 |, \. M/ \) [  R% ^
10000.times do |n|
$ ^2 M1 R  L8 M1 N, ?1 P" h0 u1 G6 i4 c3 S8 W( O1 Q& r' u9 n
issue = "你有异装癖么"
0 y0 m& ]) Z& B1 @$ f; M8 ]2 x9 [' H* e7 s
val = issue + n.to_s5 ~) P" E# \. ], x# F* W) i% n

9 Z6 j/ M1 `$ g4 tret = Digest::SHA256.hexdigest(val). {7 x( z' u8 @! Q5 {# v

2 i3 k* ^' N2 j$ U6 c- |( Tif ret[0..3] == "0000" #判断hash值的前4位是0么2 y& W" g: n6 r1 x9 q$ |
, Z# g/ T8 G3 N
   puts val$ ~2 L3 q; Z# ]' C. w# P

0 ]& p; a& ?1 h+ O   puts n
7 g/ ]( |- `; Y) S( G. p2 M6 C! Q9 ^9 h  g8 r9 Y, i
   puts ret
% _! v5 D& G3 H+ [+ `$ {- a% n) \( j6 @9 s: D
   break: Z: u# Q& y7 a8 a) f" a

0 I: U6 G% T" }8 a6 d9 Cend6 l5 O0 T( C7 C8 T. e! a) @! e
. J' b. N0 [8 G2 n
end
5 y1 X3 @: d4 I+ o6 }9 n
) @! d2 j: v' X! t& \& j#你有异装癖么3699
) w' Q1 H5 }# g, Y0 A+ W5 A
' |0 S. g. A. @9 x#36998 m, H; Z* L+ R! n
2 j2 \8 c6 E/ v- b% g- i$ P4 K
#00007ed47ec0280ca933ed5dc9396892fee27c9dbec9c07f95f0247169df1bee( N4 m& H& e3 a/ j' \

! K4 K6 a* _! _" d得到 3699,% J8 T3 F$ |; {9 F

1 |9 b! J; d) c1 X1 zDigest::SHA256.hexdigest("你有异装癖么3699")的结果符合前4位是0.7 n2 _5 `* k, \" |
0 v8 n1 o9 I9 c
你把问题 你有异装癖么3699给我, 我通过验证, 就回答这个问题.7 e: U1 d0 t, c1 C4 H
) J# A6 {' l  ?0 m8 `1 {
你有疑惑了, 为啥要从 [1,10000] 这个区间顺序计算呢?
  d, ]7 l6 o  ^6 r. a
6 E" w, K7 K; ~5 V6 w. h0 b* v$ X3 Y不能随便从一个数字算么?
/ t# H2 {6 N' I0 F8 |( _+ Q+ |3 `: X
因为hash运算的结果是无序的, 而且不能进行逆运算, 顺序计算比较方便, 没有遗漏. 通过这个方式得到的自然数, 也是符合游戏规则的最小自然数, 因为是顺序计算的啊% n; E/ c( t8 l. i1 Y* e6 T0 l
" {) ~' p" \! J! L$ U5 I8 o
嗯的, 在回到这个游戏, 大家都遵守这个规则, 我也在回答这个问题,6 l+ ~% ]7 ?6 U. @7 ^* X0 @

- J. ~' [$ M' |% H- B; l9 X& d又过了一段儿时间, 需要回答的八卦问题还是太多了, 我吃不消了,囧.
* J* E, b5 p: s8 L' Y/ D& K9 i% |# b
我定个新规则, 其他的不变, hash值前5位是0的, 我才回答.
1 Z" }9 t" z  y& e' W/ X! ^9 [4 g* Q3 o6 z
然后继续运行, 到了我又吃不消的时候, 继续改, 前6位, 前7位, 前8位,  w, f6 A) L# |: ?

8 A: r! d- g0 f. E3 \& [& X. @( Y前n位是0.  R1 l" }8 ?" F, N3 d" L

+ c7 t# ?7 u7 K. M6 J1 V2 D$ F如果你继续算下去, 你会发现, 算的时间会越来越长,我们可以说难度增加了. 有这样直观的感觉, 前几位是0的个数越多, 这个难度越大, 计算时间越长.8 [$ g0 R- j, p! p

; B3 r/ c: A  \" c* @难度到底有多大, 也就是时间到底有多长呢?& L2 i! P8 z7 I$ l1 b9 ]/ T
( ~$ _5 S% o* N
我拿自己的 2014年款的 mac pro中款粗略算了下,语言是ruby,
" B& e1 o8 k* ^. L" I" @' k2 g; p6 \3 u4 b
时间就是金钱, 这个时间还是比较可观的.7 c3 F$ B& j% S1 i( E+ Y5 A7 K
% N) O* {  ?; C  y9 P. d1 m' b/ H
Digest::SHA256.hexdigest("shooter36")      #04b4ee0f1b56950f1f9880d076b7449c66705d5712a939a36a49d9973dd50ab3    2ms
# B/ L* W1 d  W' l$ W6 F, o& ^- e2 o9 {
Digest::SHA256.hexdigest("shooter578")     #002bae033279e48835e9a3c8b71a6835bf171a202b700a10ba4bd63710bfcb49    15ms
  `! o9 W' w8 y& [& p
+ Q/ c: e0 A" `# e7 t+ y+ QDigest::SHA256.hexdigest("shooter4434")    #00072b50cc7963a310962af33efcd5109cdfb6ac633ce6bb275ce243f3ec247b    406ms2 \% A4 d( a# ?9 }) _
% K8 y: H  {. G! N- k0 p' R
Digest::SHA256.hexdigest("shooter35786")   #00002d8c31f6eb29d848cdf520b499cd9f729b1d4d037275d82935b7766eaa3e    4309ms9 t3 {5 T3 b9 B- A2 v7 S: A
0 s% X& X( J! q  N7 b6 A0 _* C
Digest::SHA256.hexdigest("shooter717095")  #00000178662b978d8d7cf930a1caceae70f097354b4fe6423eef2a45ccfb9ce7    82468ms
8 B$ {/ v2 u" h! l$ n4 W& ~. h, R* \
Digest::SHA256.hexdigest("shooter2038373") #0000001ef511d494ecdddcd2abfded0a34df87a9c76410452e01e0a2958bf0a5    272266ms( j. f' C4 `& J! C
/ [* W8 D: t; A7 p6 N+ Z
说了这么多, 这个游戏规则其实就是POW.# S( w4 g$ l% O6 D; W9 D

2 B8 k, H' d( T8 w$ @- N用到bitcoin上,无非是要替换些东西, 八卦问题 => bitcoin需要的数据,7 h/ r& ~0 J9 C8 H; _# V. P) ~
4 t) u+ `; Z9 P
替换bitcoin需要的难度. 理解这个思想很重要, 别的细节慢慢聊.$ d) k% y/ K4 K' F/ O
+ s, `* _: @1 k! E$ |
bitcoin系统的难度有多大呢?
8 y8 d: e5 p6 |3 J! c
2 r' c  g3 |; N0 T块高度477,360 的hash 000000000000000000e8af89716e0ea8a2aa7c7b789935e98f0a32a4a319247f有18个0.% c" J5 r" z- t$ B* n. p3 |
6 }$ L! h; F3 c. d
Nonce 是十六进制的0x71eee8ca,即算了 1911482570次, 可以试试用一般的笔记本计算19亿次hash需要多长时间.
6 e' @! i: F& t" E! }1 T% K! Z* w# _. d# R# r
POW有什么特点呢?2 h5 h2 _7 l4 u7 @
1 e1 D0 q  M0 t( m5 l
1 运算不可逆, 就代表谁也不可能偷懒: Q( g3 N  Y* h. }
  G1 J8 U' t% M- W+ Y- P9 N% F
2 每个值的hash都不一样, 意味着不同的问题都要算,  换个新问题, 就要重新算.
0 V* n0 J6 q2 B3 N' P
) F. N% A( E+ u3 p" q5 q8 f3 你算起来很费劲, 花费时间长5 s" \4 c/ e4 t2 p+ t) {
3 w( A5 v  H$ y8 X" }- ]
4 我验证起来很简单, 把结果hash一下, 符合规则的我就回答, 不符合的抛弃$ w$ w& K, S' K) Y. i% i
+ V  n) `6 _6 m& y& J) j
5 这个规则实现还是比较简单的
& U. X6 ]" H, `, B, G; G( `  M5 r4 N+ i# K/ H4 y
结果就是 遵守游戏规则的人很艰难的算出一个结果,会很珍惜,因为你付出了很多的计算资源跟时间, 你希望我能认可你的努力.
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

卡扎菲偶遇拉登 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    38