Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

区块链POW证明代码实现demo

朋友一起走
78 0 0
这里介绍工作量证明POW, POW是属于共识机制的内容。
2 R9 P  T3 ^& k3 ]+ QPoW机制中根据矿工的工作量来执行货币的分配和记账权的确定。算力竞争的胜者将获得相应区块记账权和比特币奖励。因此,矿机芯片的算力越高,挖矿的时间更长,就可以获得更多的数字货币。
2 Q/ W4 F+ s1 K优点:- l! w/ a9 h* Z. J, D
算法简单,容易实现;节点间无需交换额外的信息即可达成共识;破坏系统需要投入极大的成本。9 N+ u5 j# E! e9 L. y
缺点:, k) p$ Z% t+ h- |, y& N7 l7 B
浪费能源;区块的确认时间难以缩短;新的区块链必须找到一种不同的散列算法,否则就会面临比特币的算力攻击;容易产生分叉,需要等待多个确认;永远没有最终性,需要检查点机制来弥补最终性。* m% k$ k+ W" R' m$ Y( f
目前基于PoW共识机制的数字货币有很多,比特币、莱特币、狗狗币、达士币、门罗币等初期的数字货币大多都是PoW共识机制。/ t% t3 g6 l% V, z
其他的共识机制还有
! z9 o* I; W; D3 FPoS(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共识机制) Z! x- x* G) U
3 f. ]- t! c, u+ H. @9 E
这些共识机制,后面有时间会补充上的,今天主要介绍POW" B9 i& \( N8 R. T" u5 Z; S
pow很简单,原理就是 利用计算力,在选择一个nonce的值结合区块的数据算出hash,使得hash的前面多少位都是0.
( D# N' e. A) v7 I* j& Xnonce是一个用来找到满足条件的hash值的数字,nonce值一直迭代,直到hash值有效为止。在我们案例中一个有效的hash值是最少有4个前导0。找到nonce值以满足合适条件的hash值的过程就叫做挖矿。1 T( Y! @- B; I' v+ ~
下面给出代码:
  k8 v  e- F. u0 R6 l$ H
  1. golang版9 b2 P* l$ Q5 t8 B% N# T' K
  2. package mainimport (    "bytes"3 |( @: M9 p& w( b+ C& ~
  3.     "crypto/sha256"' Z, h4 U' R. T* z: q0 C. g5 m7 y) {
  4.     "fmt". n6 t& c/ R( T0 ^/ x* Z1 g
  5.     "math"; ~4 z+ D, I: j0 o9 J& @
  6.     "math/big")// 前导0,难度const targetBits  = 8type ProofOfWork struct {1 o" ~2 d0 L( H% }( V1 q* ~. l; E
  7.     block *Block8 ?* f) }6 I7 o, T  m
  8.     targetBit *big.Int. V& q; K4 o$ V
  9. }func NewProofOfWork(block *Block) *ProofOfWork  {    // 设置64位全1$ p* i1 }* W4 D2 h, w3 d6 u
  10.     var IntTarget = big.NewInt(1)    //000000000000000000000000000014 @# D  |" G- y2 w1 `) c
  11.     //10000000000000000000000000000
    ) _2 q0 L7 T( ]( P/ s+ A' o
  12.     //00000000000100000000000000000
    1 k, y0 S0 X) Q+ \# m8 M3 S' F
  13.     //0000001
      ?) D5 f. t4 R" k5 x% |# v
  14.     // 右移 targetBits位0 h# |+ k* e! C, F
  15.     IntTarget.Lsh(IntTarget, uint(256 - targetBits))    return &ProofOfWork{block:block, targetBit:IntTarget}: b" i0 L+ l0 H" r+ \
  16. }func (pow *ProofOfWork)PrepareRawData(nonce int64)[]byte  {
    7 ^. Z) c8 \5 `- M4 o  H
  17.     block := pow.block
    $ K# @! e( H, w5 _
  18.     tmp := [][]byte{& v" k! y3 @7 ~% w
  19.         Int2Byte(block.Version),: ^+ r9 v; w' A5 N+ a4 S" M
  20.         block.PrevBlockHash,
    4 B- a8 K/ ?" d, ^3 X) H  K/ h) |
  21.         Int2Byte(block.TimeStamp),8 Z: Q8 S* }  J  t* I3 a% Q7 a
  22.         block.MerkeRoot,: S3 f* u/ s5 U  T1 {
  23.         Int2Byte(nonce),
    / y* z  r0 g  t0 E; x
  24.         Int2Byte(targetBits),
    . o! A/ K1 ]& ~- @+ V: |% h
  25.         block.Data}
    0 A- K5 w/ c6 `
  26.     data := bytes.Join(tmp, []byte{})    return data
    7 H& x+ R. Z6 b. Y6 k2 `
  27. }func (pow *ProofOfWork)Run() (int64, []byte) {    var nonce int64
    5 v/ S5 ~, ~- Z1 _! i
  28.     var hash [32]byte6 G/ @* k( ?6 v
  29.     var HashInt big.Int
    0 J5 j( r% Z( q- Y/ W' E
  30.     fmt.Printf("target hash:", pow.targetBit.Bytes())    for nonce
    9 E5 A, r, N* l& {# M; N( J' ?
  31. python版
    ( n3 ?  ^! ^! i! W
  32. function isValidHashDifficulty(hash, difficulty) {  for (var i = 0, b = hash.length; i = difficulty;$ B" P( ^4 |3 a6 i9 t, m
  33. }import hashlib"""
    2 e9 \$ _8 P- i0 |0 a3 w
  34. 工作量证明8 p0 h. |9 ^* e
  35. """class ProofofWork():: [6 u0 [5 P% i% b
  36.     """: M" _' T4 R. Z% _1 ]$ R* ]
  37.     pow
    , d2 K% T) B! u) `
  38.     """
    " x4 u" g+ H, d' \
  39.     def __init__(self, block):+ l( n! ?4 t  G( h* J, R
  40.         self.block = block    def mine(self):
    : |! h* U- V. G8 C6 D$ P2 @
  41.         """
    ! U1 L3 _6 r3 T! ?% [! q0 X
  42.         挖矿函数$ G! ]8 G5 j( L+ g$ F
  43.         :return:
    : m' c: D) m" \" l
  44.         """
    ) ^% C6 G) O2 C8 _: ~6 y
  45.         i = 0$ J- `  X+ b" i, m' D2 ^( O. U
  46.         prefix = '0000'
    7 z& Y2 s% ], I0 K& p! ^; k
  47.         while True:. ?( F+ m" l" J% r; P# e1 V+ ?
  48.             nonce = str(i)0 v$ M8 i% }% b9 R+ c7 Z7 Z/ e' x
  49.             message = hashlib.sha256()
    ( I5 E/ p* u1 `6 ~3 n4 c
  50.             message.update(str(self.block.data).encode('utf-8'))" ~, T  f* q  z- w# p0 [/ H4 b; R+ |
  51.             message.update(nonce.encode("utf-8"))' v* R( \/ m. w$ M& |9 @5 y$ I% X2 ]
  52.             digest = message.hexdigest()            if digest.startswith(prefix):                return nonce, digest0 I/ M9 @( Y( z7 z4 F4 s' n
  53.             i += 17 h, B/ E% J/ F. p. U; w) h* Z
复制代码
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

朋友一起走 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16