Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

区块链POW证明代码实现demo

朋友一起走
138 0 0
这里介绍工作量证明POW, POW是属于共识机制的内容。
' V# U2 {: A8 Y) |7 ?' E+ gPoW机制中根据矿工的工作量来执行货币的分配和记账权的确定。算力竞争的胜者将获得相应区块记账权和比特币奖励。因此,矿机芯片的算力越高,挖矿的时间更长,就可以获得更多的数字货币。2 k2 O7 g# n! F, h
优点:
& a: S6 w1 j& P4 _3 Z4 o算法简单,容易实现;节点间无需交换额外的信息即可达成共识;破坏系统需要投入极大的成本。# N- b, h0 A' L& Z3 D1 O5 d# p3 C
缺点:. a. B  ]# B3 _4 @( h* u
浪费能源;区块的确认时间难以缩短;新的区块链必须找到一种不同的散列算法,否则就会面临比特币的算力攻击;容易产生分叉,需要等待多个确认;永远没有最终性,需要检查点机制来弥补最终性。
- N8 y& Y4 V+ l) Q目前基于PoW共识机制的数字货币有很多,比特币、莱特币、狗狗币、达士币、门罗币等初期的数字货币大多都是PoW共识机制。
3 A/ N' d- Y$ j( i0 h4 q' d- Y( r其他的共识机制还有* |0 _, s4 `4 _  X1 R6 g% a& Y' U
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共识机制# n) e' b4 f" {) U. Z: ?
4 l' W' `2 ?1 U2 v( k
这些共识机制,后面有时间会补充上的,今天主要介绍POW* N& D1 s6 B  n: b5 b) T! R  x9 ^
pow很简单,原理就是 利用计算力,在选择一个nonce的值结合区块的数据算出hash,使得hash的前面多少位都是0.3 h% y) {& p; A5 [. h1 ~5 l3 c
nonce是一个用来找到满足条件的hash值的数字,nonce值一直迭代,直到hash值有效为止。在我们案例中一个有效的hash值是最少有4个前导0。找到nonce值以满足合适条件的hash值的过程就叫做挖矿。; o# G, p% ^% ^5 i' I: G1 ^
下面给出代码:; w$ k6 `0 w4 k6 i
  1. golang版
    ) D" Z/ w# v. p4 h* _4 W4 x  @
  2. package mainimport (    "bytes"1 C4 D* E0 d% D' P
  3.     "crypto/sha256"& F. ^; i3 m8 x: n
  4.     "fmt"
    ! H! }* s0 J" \' X/ j
  5.     "math"
    0 R& m; X1 ^9 v: d8 I1 c+ K
  6.     "math/big")// 前导0,难度const targetBits  = 8type ProofOfWork struct {  x$ t, ^- X) a/ L* C; I: r1 I
  7.     block *Block
    5 ]+ ^: Z5 W; a8 i. ?
  8.     targetBit *big.Int
    ; ^* O: \/ |1 C. k# `
  9. }func NewProofOfWork(block *Block) *ProofOfWork  {    // 设置64位全10 f) e' B7 \/ e
  10.     var IntTarget = big.NewInt(1)    //00000000000000000000000000001. O4 _" c2 \1 B- q) m0 I, F4 A
  11.     //100000000000000000000000000001 g; v7 B/ C  B# n
  12.     //00000000000100000000000000000
    / x4 y, Y# Q: I8 E7 P3 o
  13.     //0000001
    1 D8 X* F" _/ f+ _5 N2 y, i, G3 }
  14.     // 右移 targetBits位1 R1 a) h* Z, g& `; O
  15.     IntTarget.Lsh(IntTarget, uint(256 - targetBits))    return &ProofOfWork{block:block, targetBit:IntTarget}
    4 _4 q; h, C- T
  16. }func (pow *ProofOfWork)PrepareRawData(nonce int64)[]byte  {' L) W0 s" ^9 m3 @! F( _4 l# w( ~
  17.     block := pow.block
    % C" W/ z1 w4 a  ^  c1 E' |
  18.     tmp := [][]byte{/ s! I, ^* i# C9 j+ @+ g: I
  19.         Int2Byte(block.Version),. i: H- m! `( Y4 [$ g  [/ G
  20.         block.PrevBlockHash,
    * e9 R8 G( f6 D& _9 C, N  h* o
  21.         Int2Byte(block.TimeStamp),
    % n. H- o. g% o5 o
  22.         block.MerkeRoot,* h$ S( g! C$ A
  23.         Int2Byte(nonce),4 M  I; ~4 n( U$ t. s$ M- b
  24.         Int2Byte(targetBits),) x& K9 d( U. T" p+ x& K
  25.         block.Data}; I& y( m, j( [! Q1 g
  26.     data := bytes.Join(tmp, []byte{})    return data
    0 x9 [1 ?/ P" x% b7 k
  27. }func (pow *ProofOfWork)Run() (int64, []byte) {    var nonce int64  v, v+ n- D* X! _+ ]: i6 Z; ^
  28.     var hash [32]byte
    : G; d9 L3 y2 d; G/ O* M+ R* a' X
  29.     var HashInt big.Int
    , L9 h) M8 O$ N5 ^) G
  30.     fmt.Printf("target hash:", pow.targetBit.Bytes())    for nonce
    % Z- Q0 ^8 \  N1 `3 E: @1 O) G( s
  31. python版
    ( `' O$ {" J0 B, T* ]; b
  32. function isValidHashDifficulty(hash, difficulty) {  for (var i = 0, b = hash.length; i = difficulty;
    & O7 g3 _4 o/ [  R7 f( s1 z5 M
  33. }import hashlib"""' V9 c  C5 ?' p6 P  O1 L& k
  34. 工作量证明
    ; a7 L; n2 F9 Z+ A; Z7 A( Y
  35. """class ProofofWork():+ ^0 H/ k- d: C; B$ w) ^
  36.     """
    & A5 E# q2 r* r6 D. B
  37.     pow
    6 _' H7 |3 f8 a1 \9 w' M0 ?/ F
  38.     """' K' H( S, u. e7 W! I0 i( V1 P
  39.     def __init__(self, block):6 \- i  m7 M  @2 }) b$ p0 d" _7 g: R
  40.         self.block = block    def mine(self):
    6 f7 \# R  F7 f  p
  41.         """
    % O  o8 X3 A' H4 @! `
  42.         挖矿函数
    6 a8 T) f. e6 g: {
  43.         :return:
    : c+ a3 s8 ?# R  I% k: I4 {9 g1 m" z' F
  44.         """
    ( V) q1 Y/ y; j0 x
  45.         i = 0
    4 T+ v+ E% O( ]% w
  46.         prefix = '0000'
    $ b4 Q! M" Z& k5 W6 ]
  47.         while True:0 u# }; x1 |/ ^" ?+ c& ~$ Q2 ~) Z" R
  48.             nonce = str(i)
    ! l5 L9 W1 D. d* O( y
  49.             message = hashlib.sha256(). _4 G2 E- C! E; J% t! z
  50.             message.update(str(self.block.data).encode('utf-8'))5 O! a- Y0 z  e' V( j
  51.             message.update(nonce.encode("utf-8"))
    * @: V* s+ D; h  a, j6 d- \
  52.             digest = message.hexdigest()            if digest.startswith(prefix):                return nonce, digest
    / D: f8 G: A3 M4 T( {1 B7 `0 A* B
  53.             i += 1
    8 }' D  @& Y4 `; r, a6 s
复制代码
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

朋友一起走 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16