Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

挖矿流程及代码实现笔记

伤心骑士口
70 0 0
transaction.go 文件引入了一个新的结构体 Transaction,一个交易包含很多输入输出。5 M9 J1 W. _& k# ]' f. R
发币交易coinbase:用于奖励挖矿成功的交易8 e9 \1 G1 {1 ~- q9 \
交易记录对象的属性:0 j6 x6 H  A) }5 V/ k" \# ^
交易记录
8 c& ^, v' w7 h2 ?2 m+ D交易输入1 `6 @$ h3 _, W. ]- y/ v
交易输出
) m/ A; l( t$ b. ?$ a7 T把比特币从一个地址发转到另一个地址(转账交易/普通交易)是什么意思?+ x2 P/ r- f( d: d6 {$ j2 c
存在区块链查询是否有足够的余额
) k+ J6 q8 K0 G- G/ I输出* C; a+ ?- j' r- ]$ A
系统找零0 M( K: Z( I' k& Y
比特币要么你不花,要么全花掉,然后系统找零。  e! Z  ]" T; f* M" ]. F
交易记录这张图是理解的关键; h( B9 F, T. y) A7 k5 l

4 @! X$ L; S! `# G/ f  Z来源:5-1 交易记账原理及过程. H, Z) p0 j8 Z8 K( J+ _  u, x) Q4 f
没花掉是什么意思?# N% B- X: P) y* q+ U
首先到区块链中遍历所有的区块,把余额/没有花出去的Output找出来,然后把余额累加出来,先看看够不够资格转账,如果够资格,则按照Output一笔笔往外转就可以了,如果需要找零则在新的交易里面做一个Output来找零3 h& ?/ b3 E% c. U
数字地址(必须唯一):叫做比特币的钱包1 `+ \3 f; S5 G( ~2 ]: T) D# a+ D5 V) ?
为什么比特币的数量是有限?一直挖下去不是无限吗?
0 h+ Q+ c/ W/ g为什么交易的输入和输出不可能相同?- {5 d" T  V. x& ^/ s
初始化 bitcoin_part4 839d69e5 w& y7 L7 E2 k5 ^$ z
添加命令行主命令 d40bf3e
# V) X; e% q3 j; f. ~添加命令行主命令的选项参数 b4caf5
4 f; s4 A5 z0 `- k# V9 S  Z解析主命令并获得全部选项参数到命令对象中去 54637fd
; r& L! u9 E0 S2 `) m, h' [根据解析结果调用函数,调用了查询余额的函数,调用了创建区块链的函数(挖矿)6 q& R0 t$ ^! Q* P( X  C
添加CLI对象的成员函数 createBlockchain 和 getBalance ,成员函数再调用核心库函数 744f01a
0 B! s) F: U) h# H0 ]6 N4 l创建发币交易函数 NewCoinbaseTX(to, data string) *Transaction 6c7bb05, a$ D1 y2 b6 I
交易对象的成员函数设置交易序号 (tx *Transaction) SetID() 4a5bab6
' {' u) t$ M* ]9 ~, r' O交易序号使用哈希值可以验证输入输出有没有被改变过
6 V9 \7 O& `+ G完成命令行函数 (cli *CLI) printUsage() b58dcbb9 e1 U" [+ U$ D  ^+ z1 r3 {
NewUTXOTransaction(from, to string, amount int, bc *Blockchain) *Transaction 3f8be71' }- O/ }9 L6 x

* k( `% j2 F) g! H+ o. P* UGo语法
6 V: T( h. v* n& U6 K3 mlog.Panic("…")
( [6 X( M0 X/ X& T结构体编码为字节数组的方法4 ~2 }: U- n9 W" w
var encoded bytes.Buffer //字符数组缓冲器对象,encoded.Bytes()
( {* r  f* Q; x9 |( ]6 ?! ?, O) jenc : gob.NewEncoder(&encoded) //传递进指针
2 N' U6 S) G+ v( P9 serr := gob.Encode(tx)! k0 `/ f$ M+ a
if err != nil {
: B+ m/ S( |' C& J0 m/ o    log.Panic(err)9 R6 O/ E( v5 o" [' N, n
}
$ \/ ?1 o3 G! o- N' g: Q3 Y8 Lhash = sha256.Sum256(encoded.Bytes())- K" C/ w. m/ L
tx.ID = hash[:]8 {4 o5 b5 E& ^! _$ U) `$ `* G/ g/ N8 E
结构体的初始化 []TXInput{}+ f6 [0 @6 y" A! }, }
const subsidy = 10
& r& F* C. G6 G; `3 `6 b3 d算法) M" r5 Q% U; u8 z0 u& `8 {6 Z
疑问) D" i3 z7 U% S. D$ q* K
挖矿成功奖励的10个比特币来自哪里?挖矿成功是什么意思?区块的Data部分存放的是真实的Transaction结构体?
$ M% \0 t) Z/ j0 v. _
现在使用真实的交易记录结构体取代描述占位符
  Y3 C( K7 }5 C
每次进行交易就要创建区块?创建区块链和发币是什么关系?每个区块和钱包地址是什么关系?交易不是应该记录在每个区块上,还是说区块链存在在每个区块上?怎么知道有交易的?有交易了就开始挖矿?原来的区块都不能在有任何改动了?奖励交易是最简单的交易,只要挖矿就会存储这么一个交易?多个人同时挖矿不是资源浪费吗?NewBlockchain 和 CreateBlockchain 有什么区别呢, 注释都是一样的?
! j* c) u* ]+ f6 {
CreateBlockchain 这个要先于 NewBlockchain 存在, CreateBlockchain 用于创建创世区块区块链, NewBlockchain 的作用应该就是获取区块链信息.
2 W7 t6 G3 @7 C) V% C$ |+ k9 b
为什么send里面调用的是NewBlockchain(from)?NewBlockchain 和 MineBlock 有什么区别?" E$ S9 s* W9 E
MineBlock 意思更明确0 }: q* [) r3 K$ S$ ]
为什么交易输入里面有交易序号Txid,交易输出TXOutput没有交易序号?做完了?haha
" O# l3 |! [+ L1 A6 J, m

; M8 y: }2 R+ `( h) c: e小结
- T* }) f0 j9 H! d- }理解的话还是要看那个视频课程。有代码的情况下,一定要忍住不要找其他资料,没有任何资料会比写代码的人更懂过程原理。拿个笔和纸随便写写,有利于启发思路。记得太乱了
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

伤心骑士口 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    37