Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

挖矿流程及代码实现笔记

伤心骑士口
69 0 0
transaction.go 文件引入了一个新的结构体 Transaction,一个交易包含很多输入输出。& g/ `- z) m0 L8 z& `. t/ h
发币交易coinbase:用于奖励挖矿成功的交易+ a$ ]2 A, f- [6 j. |: R
交易记录对象的属性:
( p* l1 I$ {' x  m3 l交易记录
* J, x# e. h/ |交易输入6 B* S5 c, S8 e+ O- H( H  B7 `  O" B7 z1 N
交易输出
1 x+ L* y$ V8 ^9 `% p把比特币从一个地址发转到另一个地址(转账交易/普通交易)是什么意思?
4 R6 m9 F2 U5 W1 x+ B1 P存在区块链查询是否有足够的余额
  y' m' r/ o+ F  X, O: v: i8 C输出; s; K1 @* o7 k# F
系统找零1 m' h, }6 P: B+ p* F
比特币要么你不花,要么全花掉,然后系统找零。
7 k8 @, m$ b% t+ B: r7 |1 C: u交易记录这张图是理解的关键
/ G0 [! g) Q2 x8 ]1 [  g0 [+ A! |; I$ ]- S; P% X' A) t7 k  Y5 O( B- }
来源:5-1 交易记账原理及过程, s5 ^9 B  ^/ R/ w5 K8 H7 X% \
没花掉是什么意思?
8 s+ G( Z2 x. w" O首先到区块链中遍历所有的区块,把余额/没有花出去的Output找出来,然后把余额累加出来,先看看够不够资格转账,如果够资格,则按照Output一笔笔往外转就可以了,如果需要找零则在新的交易里面做一个Output来找零
# H' ]0 \% D+ O7 u1 B数字地址(必须唯一):叫做比特币的钱包
. C1 g& h9 Z6 a1 t为什么比特币的数量是有限?一直挖下去不是无限吗?- \/ h( e' }/ g; D' T
为什么交易的输入和输出不可能相同?0 M% a* A3 B) P% f
初始化 bitcoin_part4 839d69e
6 g/ P. }9 q. p0 E8 ^添加命令行主命令 d40bf3e
* Q: z- f  P" Q5 j7 K% c添加命令行主命令的选项参数 b4caf5
) M6 d" K. r2 K$ f. l- e解析主命令并获得全部选项参数到命令对象中去 54637fd, W) u4 }3 y0 G6 a$ H% s6 C
根据解析结果调用函数,调用了查询余额的函数,调用了创建区块链的函数(挖矿)# A, i: l  W8 R* S2 u' R% g/ Q
添加CLI对象的成员函数 createBlockchain 和 getBalance ,成员函数再调用核心库函数 744f01a
  H# a# Z3 t) B1 }) [6 W1 [创建发币交易函数 NewCoinbaseTX(to, data string) *Transaction 6c7bb05* F  o: c( a, _
交易对象的成员函数设置交易序号 (tx *Transaction) SetID() 4a5bab6
: Y1 Z! o. n- a- `$ v& {交易序号使用哈希值可以验证输入输出有没有被改变过
* \! u# |) _8 X完成命令行函数 (cli *CLI) printUsage() b58dcbb2 c9 C1 v3 {  J, S9 N% e. `7 x  ^. z
NewUTXOTransaction(from, to string, amount int, bc *Blockchain) *Transaction 3f8be712 h+ F. z5 m0 I

/ O, ]6 U: M3 r5 wGo语法
) @0 f) z* u& y$ ilog.Panic("…")
. a( E# o( |1 v8 ]) O结构体编码为字节数组的方法* K! j( O) ~1 e" Q# J( u
var encoded bytes.Buffer //字符数组缓冲器对象,encoded.Bytes()- W3 X2 m; A& x- f9 Q- Q4 i6 A( l
enc : gob.NewEncoder(&encoded) //传递进指针
( A  n1 {& W" Z! }2 Cerr := gob.Encode(tx)2 _" e3 _7 D) k% }; S7 p
if err != nil {# j1 c: _) ]7 m. M
    log.Panic(err)
5 V# M$ ~# Q" Y/ i, ~}3 L. a; n8 z2 W% U3 G4 u
hash = sha256.Sum256(encoded.Bytes())/ l7 _: @- E- N8 J/ x8 g+ O
tx.ID = hash[:]
+ ~& ~+ b- B' n, i2 Q$ v6 N结构体的初始化 []TXInput{}$ x0 d' h( V8 {4 |% t' ?& {
const subsidy = 10
8 X5 ?6 ?, }9 p% V算法/ x; E9 ]& E) |8 I1 U, @
疑问
2 S2 f) t$ h5 O* y挖矿成功奖励的10个比特币来自哪里?挖矿成功是什么意思?区块的Data部分存放的是真实的Transaction结构体?
' n( Y% G. x. W! U% c; h( _
现在使用真实的交易记录结构体取代描述占位符* e# Q) T: G8 Q* M6 Z7 S  N
每次进行交易就要创建区块?创建区块链和发币是什么关系?每个区块和钱包地址是什么关系?交易不是应该记录在每个区块上,还是说区块链存在在每个区块上?怎么知道有交易的?有交易了就开始挖矿?原来的区块都不能在有任何改动了?奖励交易是最简单的交易,只要挖矿就会存储这么一个交易?多个人同时挖矿不是资源浪费吗?NewBlockchain 和 CreateBlockchain 有什么区别呢, 注释都是一样的?
$ d. U2 p' i4 g0 y& {; F/ R; K# m/ g
CreateBlockchain 这个要先于 NewBlockchain 存在, CreateBlockchain 用于创建创世区块区块链, NewBlockchain 的作用应该就是获取区块链信息.
+ h( _$ @0 k; {9 p$ D& {
为什么send里面调用的是NewBlockchain(from)?NewBlockchain 和 MineBlock 有什么区别?  W( r: C; Z& B3 c& A! H! t) e2 _
MineBlock 意思更明确
- f" n: H/ T: l+ n
为什么交易输入里面有交易序号Txid,交易输出TXOutput没有交易序号?做完了?haha/ \9 ~) v9 U1 P/ D( a2 f" {& w& @

& F9 D7 \  w9 H7 J' X6 H小结5 o& v1 Z' r0 _. e
理解的话还是要看那个视频课程。有代码的情况下,一定要忍住不要找其他资料,没有任何资料会比写代码的人更懂过程原理。拿个笔和纸随便写写,有利于启发思路。记得太乱了
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

伤心骑士口 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    37