Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

区块链POW证明代码实现demo

朋友一起走
82 0 0
这里介绍工作量证明POW, POW是属于共识机制的内容。
/ m; v, y3 O& `# @8 x0 MPoW机制中根据矿工的工作量来执行货币的分配和记账权的确定。算力竞争的胜者将获得相应区块记账权和比特币奖励。因此,矿机芯片的算力越高,挖矿的时间更长,就可以获得更多的数字货币。
2 Y$ t. c1 x: W; x2 C优点:" d! v. Q. q0 F2 d& l
算法简单,容易实现;节点间无需交换额外的信息即可达成共识;破坏系统需要投入极大的成本。. q. E5 U% m9 o9 `( F6 D
缺点:, [& j- v0 `: l$ f# `
浪费能源;区块的确认时间难以缩短;新的区块链必须找到一种不同的散列算法,否则就会面临比特币的算力攻击;容易产生分叉,需要等待多个确认;永远没有最终性,需要检查点机制来弥补最终性。
6 h. s) F) P) b目前基于PoW共识机制的数字货币有很多,比特币、莱特币、狗狗币、达士币、门罗币等初期的数字货币大多都是PoW共识机制。
# `2 c# N' ]0 l8 C8 t其他的共识机制还有
9 g% {: M# N/ g5 W, ^$ ?PoS(Proof of Stake)DPOS(Delegated Proof-of-Stake)DAG(Directed acyclic graph)PBFT(Practical Byzantine Fault Tolerance)Pool验证池dBFT(delegated BFT)PoA(Proof-of-Authority)RPCA(Ripple Protocol consensus algorithm)Hcash——PoW+PoS共识机制
  w8 o1 e  A* o& e6 L

4 s4 e' \2 k7 F! ~这些共识机制,后面有时间会补充上的,今天主要介绍POW1 u; N: D" j0 j* e4 r9 I
pow很简单,原理就是 利用计算力,在选择一个nonce的值结合区块的数据算出hash,使得hash的前面多少位都是0.4 P. I) j$ M5 q$ _
nonce是一个用来找到满足条件的hash值的数字,nonce值一直迭代,直到hash值有效为止。在我们案例中一个有效的hash值是最少有4个前导0。找到nonce值以满足合适条件的hash值的过程就叫做挖矿。# M! \+ B5 Y& }/ Y
下面给出代码:2 Y# Z4 P0 }: s3 J
  1. golang版7 [$ D5 V& g+ U
  2. package mainimport (    "bytes"- Y* p1 z7 U' v: d/ |
  3.     "crypto/sha256"% E- n8 H' }& `
  4.     "fmt"$ \8 a' J* e* [* @& l- j, Y9 C
  5.     "math"7 c/ N' k1 K  L* m4 K
  6.     "math/big")// 前导0,难度const targetBits  = 8type ProofOfWork struct {
    ( W5 k! J, \2 q' _8 @
  7.     block *Block
    ) s$ Z+ H! k2 J
  8.     targetBit *big.Int0 n% g) b4 _! C2 I$ p
  9. }func NewProofOfWork(block *Block) *ProofOfWork  {    // 设置64位全1& Z. ~' u" c5 T0 x  G  t
  10.     var IntTarget = big.NewInt(1)    //00000000000000000000000000001
    ! G( p  p' J5 s9 G
  11.     //10000000000000000000000000000
    6 z) ]! F* ]9 Z8 n
  12.     //00000000000100000000000000000$ F1 ~; e% g7 p+ j
  13.     //0000001
    & |4 x; Y+ }* R
  14.     // 右移 targetBits位/ T+ r! C5 l! R5 p5 u' ]- q
  15.     IntTarget.Lsh(IntTarget, uint(256 - targetBits))    return &ProofOfWork{block:block, targetBit:IntTarget}, @+ `7 }( w3 W( N" P6 y' c: x
  16. }func (pow *ProofOfWork)PrepareRawData(nonce int64)[]byte  {* ^& t' W* x) N6 S: i
  17.     block := pow.block
    # f$ r2 N7 i; D) f1 s
  18.     tmp := [][]byte{4 U& F2 J( |( J, |+ {& Z
  19.         Int2Byte(block.Version)," Z1 J8 H. h2 F( Z0 o" d5 [
  20.         block.PrevBlockHash,
    . I; s: _' O  n6 ]1 D7 C: ^
  21.         Int2Byte(block.TimeStamp),4 z# L4 Z- a( q/ w% L- T# n
  22.         block.MerkeRoot,
    4 e) S, b0 K! H7 R" r/ g
  23.         Int2Byte(nonce),! {% N+ |# j+ C5 Q2 X
  24.         Int2Byte(targetBits),. t& ^* Z* `: }+ m
  25.         block.Data}
    $ w$ Q. M& H4 q! v# P
  26.     data := bytes.Join(tmp, []byte{})    return data
    8 P+ S  s$ s4 e, J' L
  27. }func (pow *ProofOfWork)Run() (int64, []byte) {    var nonce int642 v5 X# Z7 y, i9 y/ g; J* G8 H
  28.     var hash [32]byte
    9 {4 n# O% {" Q" q9 S) K
  29.     var HashInt big.Int
    4 p- i/ b* O. o1 w
  30.     fmt.Printf("target hash:", pow.targetBit.Bytes())    for nonce
    & I- B- W7 R9 B0 K$ l* l
  31. python版
    / J' a) `0 t4 e& Y
  32. function isValidHashDifficulty(hash, difficulty) {  for (var i = 0, b = hash.length; i = difficulty;
    : A* @, G( v: |! T) Z3 [
  33. }import hashlib"""
    ' ?& U7 i: F8 w& t$ h8 _1 ^. e
  34. 工作量证明
    + S( X; B$ J+ I) u8 [. W5 Q/ z
  35. """class ProofofWork():( ?: [! a! ]% ~
  36.     """
    1 O  G0 g) g5 u5 u: e* j+ Y
  37.     pow6 c- }( V0 N( k
  38.     """
    4 Z% M  F  z! U1 }! B
  39.     def __init__(self, block):
    . c) i, K' M1 j4 s+ U- f( H
  40.         self.block = block    def mine(self):- Q# N9 {: b( ^/ _
  41.         """& C) I# O3 z4 M" s# A: G9 L
  42.         挖矿函数; c9 Q9 A; n! c8 L+ ~- F" x# [
  43.         :return:5 N2 R/ \% \. y3 G# ^/ l+ J
  44.         """8 {+ B2 Q7 C6 D
  45.         i = 0
    5 v" t, d* E1 U9 \1 O
  46.         prefix = '0000'9 r$ z3 S  p6 ^3 {
  47.         while True:- q- n; x2 a' x( \$ V9 W+ @
  48.             nonce = str(i)- K$ E9 i) C6 d$ x, W6 x% Z. |# |# q
  49.             message = hashlib.sha256()
    + Y- U! s' U; i2 E; s3 L
  50.             message.update(str(self.block.data).encode('utf-8'))  \+ I. R& h# ]6 C- i7 k$ K
  51.             message.update(nonce.encode("utf-8"))& G% M% u# q& D* p' O7 V
  52.             digest = message.hexdigest()            if digest.startswith(prefix):                return nonce, digest) S6 d+ N, K' c3 g7 \% Q
  53.             i += 1
      M$ d  m$ C- d. [( K; n& X
复制代码
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

朋友一起走 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16