Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

挖矿流程及代码实现笔记

伤心骑士口
122 0 0
transaction.go 文件引入了一个新的结构体 Transaction,一个交易包含很多输入输出。
0 w6 j" K8 @$ G- R+ r2 M& }发币交易coinbase:用于奖励挖矿成功的交易
( y2 E! _8 u7 C6 s1 ~- Q$ E交易记录对象的属性:
( M% @- @( k% K交易记录
) [) e! y: a( u5 s+ S# {交易输入( f# u4 ^* B4 o- q/ P
交易输出
8 Y5 g4 `% \1 @/ V! a8 ?( j# q把比特币从一个地址发转到另一个地址(转账交易/普通交易)是什么意思?
; N$ H4 G. H2 y! L+ b# T9 H) f# P存在区块链查询是否有足够的余额0 y! v% y- x; H  p  e0 |( v
输出8 O" ]1 H* ~) ~8 h$ g
系统找零) E1 R2 r( Z' o$ M, z6 n
比特币要么你不花,要么全花掉,然后系统找零。
! t1 {  m+ i7 P7 j3 V交易记录这张图是理解的关键
: A% d, s. `0 S% W- [8 w2 `" M+ [; X3 v7 x' `9 @  _+ C
来源:5-1 交易记账原理及过程0 E; i4 ^. u* p' _8 n( @
没花掉是什么意思?. q2 q0 R8 u4 W# y! `
首先到区块链中遍历所有的区块,把余额/没有花出去的Output找出来,然后把余额累加出来,先看看够不够资格转账,如果够资格,则按照Output一笔笔往外转就可以了,如果需要找零则在新的交易里面做一个Output来找零
! @& c; M4 f' c, y% a  |0 d  E, H! i数字地址(必须唯一):叫做比特币的钱包) z' p1 S* b" d' [( U$ O8 |
为什么比特币的数量是有限?一直挖下去不是无限吗?
$ d5 [; q; \1 x: z为什么交易的输入和输出不可能相同?( R; I, O- h( X
初始化 bitcoin_part4 839d69e+ E3 k+ d  H2 E. T2 c, _
添加命令行主命令 d40bf3e8 m6 z, V+ l4 k7 v2 T6 c& a
添加命令行主命令的选项参数 b4caf5
$ P+ K1 ]! e* Y- a. I2 ]解析主命令并获得全部选项参数到命令对象中去 54637fd
! e8 l- I8 Q- c7 v根据解析结果调用函数,调用了查询余额的函数,调用了创建区块链的函数(挖矿)" Z% b% r5 [; V, j' ]' U) V
添加CLI对象的成员函数 createBlockchain 和 getBalance ,成员函数再调用核心库函数 744f01a
0 K! k6 n$ e* b1 r3 N4 V创建发币交易函数 NewCoinbaseTX(to, data string) *Transaction 6c7bb05
' [( C) M, W! ~) b' E1 Q9 G1 v交易对象的成员函数设置交易序号 (tx *Transaction) SetID() 4a5bab6* G, f' r+ E5 w! m0 }
交易序号使用哈希值可以验证输入输出有没有被改变过9 n% T) t4 a& t/ a; W
完成命令行函数 (cli *CLI) printUsage() b58dcbb, o3 `' a1 C4 m+ G
NewUTXOTransaction(from, to string, amount int, bc *Blockchain) *Transaction 3f8be71
. v% Y0 X8 X5 z  _. Z3 q/ P* h' r, Y0 T; S
Go语法
* X( u7 G. n' h1 k/ clog.Panic("…")
* m6 p& ^  N* z' f1 e  z. E' H& D结构体编码为字节数组的方法
) _. ~( B. P9 u2 D% Fvar encoded bytes.Buffer //字符数组缓冲器对象,encoded.Bytes()) j$ |5 T" i1 k$ I4 G
enc : gob.NewEncoder(&encoded) //传递进指针
5 y' u3 D+ f1 zerr := gob.Encode(tx)
, V, d$ |  B; U" W$ uif err != nil {
+ a' B. K( x4 l/ R    log.Panic(err)
, @- \2 o# W% N9 I$ D# G}
6 V$ A; S0 L! \% y9 _$ Uhash = sha256.Sum256(encoded.Bytes())2 B2 |2 r3 k" @0 r/ t
tx.ID = hash[:]# ]) r9 \. N" v# q* R7 N& H
结构体的初始化 []TXInput{}+ W0 Y/ k  m8 c% f+ p+ f6 [6 F
const subsidy = 10' t' {. n- y) X$ P
算法
# P% H# t+ H5 i6 |+ v& l疑问3 j# ]' j3 G! B. l) {
挖矿成功奖励的10个比特币来自哪里?挖矿成功是什么意思?区块的Data部分存放的是真实的Transaction结构体?9 b* m- d  ?$ [2 S4 A
现在使用真实的交易记录结构体取代描述占位符
, c) T- f7 Z) s" S% ]: [' q
每次进行交易就要创建区块?创建区块链和发币是什么关系?每个区块和钱包地址是什么关系?交易不是应该记录在每个区块上,还是说区块链存在在每个区块上?怎么知道有交易的?有交易了就开始挖矿?原来的区块都不能在有任何改动了?奖励交易是最简单的交易,只要挖矿就会存储这么一个交易?多个人同时挖矿不是资源浪费吗?NewBlockchain 和 CreateBlockchain 有什么区别呢, 注释都是一样的?2 W' s5 w7 E6 C. i$ W
CreateBlockchain 这个要先于 NewBlockchain 存在, CreateBlockchain 用于创建创世区块区块链, NewBlockchain 的作用应该就是获取区块链信息.$ j6 {7 Z: H, t; E: c( e
为什么send里面调用的是NewBlockchain(from)?NewBlockchain 和 MineBlock 有什么区别?' r, C1 }; ?! j: ^/ R' ?
MineBlock 意思更明确) ?0 W5 Q4 ]& t$ G+ `% @
为什么交易输入里面有交易序号Txid,交易输出TXOutput没有交易序号?做完了?haha3 U! H/ x+ q, T
$ R7 R: ^% o, {9 O. U
小结
) e9 Z+ {# w/ K; H+ ]+ `理解的话还是要看那个视频课程。有代码的情况下,一定要忍住不要找其他资料,没有任何资料会比写代码的人更懂过程原理。拿个笔和纸随便写写,有利于启发思路。记得太乱了
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

伤心骑士口 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    37