Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

挖矿流程及代码实现笔记

伤心骑士口
123 0 0
transaction.go 文件引入了一个新的结构体 Transaction,一个交易包含很多输入输出。
/ ?, g* k9 ^: G2 o1 Q& u0 C& B& c发币交易coinbase:用于奖励挖矿成功的交易2 Y+ x: Q' r5 p" I  @4 [: {
交易记录对象的属性:/ {+ {8 ]' t, M* L$ S
交易记录: T, d0 B# s/ r: ^/ X
交易输入
* R9 i! ]% ?6 J8 `" C6 w5 @交易输出! d% W2 u2 s2 A7 U  S
把比特币从一个地址发转到另一个地址(转账交易/普通交易)是什么意思?
+ N9 N+ S' Q: [( e3 F存在区块链查询是否有足够的余额
' n$ `& B9 j7 n输出
, M4 ^$ U8 L4 Y. A, q系统找零
% V6 `& M# i& }5 d3 i# E) A比特币要么你不花,要么全花掉,然后系统找零。2 j7 {2 X; ?3 `2 c
交易记录这张图是理解的关键- c9 g1 f9 C/ u4 J. ?

8 _" a( [- J) G/ F8 ?来源:5-1 交易记账原理及过程* Z& Z+ k) i5 u8 f
没花掉是什么意思?
1 r0 R  z( s& C首先到区块链中遍历所有的区块,把余额/没有花出去的Output找出来,然后把余额累加出来,先看看够不够资格转账,如果够资格,则按照Output一笔笔往外转就可以了,如果需要找零则在新的交易里面做一个Output来找零
2 j# d9 t0 X% _* p数字地址(必须唯一):叫做比特币的钱包. X4 Y3 O+ }6 l+ q
为什么比特币的数量是有限?一直挖下去不是无限吗?
/ Z0 @. [/ p' f; p5 T  B为什么交易的输入和输出不可能相同?8 k& a4 ?. s5 U( X) M2 |
初始化 bitcoin_part4 839d69e
% k6 U- S. m% \/ J( L9 O5 T! E3 g, H添加命令行主命令 d40bf3e
' b. h$ I% C+ o* z% [添加命令行主命令的选项参数 b4caf5
! Z6 A/ d: d6 w# A! m; Y解析主命令并获得全部选项参数到命令对象中去 54637fd
) J' j& P; g2 d" H6 J% H+ q1 o根据解析结果调用函数,调用了查询余额的函数,调用了创建区块链的函数(挖矿)
; _; D- Q& S6 r( p添加CLI对象的成员函数 createBlockchain 和 getBalance ,成员函数再调用核心库函数 744f01a
  V# Q- t$ C1 s/ u创建发币交易函数 NewCoinbaseTX(to, data string) *Transaction 6c7bb05
- U! F, `8 V/ G+ K, K交易对象的成员函数设置交易序号 (tx *Transaction) SetID() 4a5bab63 O8 w& |8 x6 l, c& J
交易序号使用哈希值可以验证输入输出有没有被改变过
) s% I& H; x2 X. q完成命令行函数 (cli *CLI) printUsage() b58dcbb
4 [* w9 U( W! g9 ~2 `/ e4 K) f" r! zNewUTXOTransaction(from, to string, amount int, bc *Blockchain) *Transaction 3f8be71
" Y  v2 d8 V0 |) K, Z
; S+ O: g& q  O0 H) q( _  aGo语法; Y) `! B5 h% y2 N3 J& o4 \
log.Panic("…")
, W4 K- W* |) }. D结构体编码为字节数组的方法
8 }3 c. V6 V5 `0 {* ^var encoded bytes.Buffer //字符数组缓冲器对象,encoded.Bytes()
6 ]3 b3 o8 i: ]- lenc : gob.NewEncoder(&encoded) //传递进指针
( M6 o1 n. z5 M$ cerr := gob.Encode(tx)8 ^; }9 K5 X$ }, b) ?9 X
if err != nil {
4 _3 r6 g: s: R+ k% b. [    log.Panic(err)
! V; Y( J7 E: v. r% g# L}( ]  o4 m# h8 c7 @% d
hash = sha256.Sum256(encoded.Bytes())
6 N0 c7 b- X; X5 Ntx.ID = hash[:]
# ?% ?- c9 E7 j) H2 W5 s+ F: [结构体的初始化 []TXInput{}
; |$ Q2 ~. r  Z) {- C0 s$ yconst subsidy = 10  u' S) W1 k, S7 t+ R4 ?( ?
算法
7 o8 M- T/ d7 ^8 W疑问
: _# _- A$ F6 v0 ]$ Z, A挖矿成功奖励的10个比特币来自哪里?挖矿成功是什么意思?区块的Data部分存放的是真实的Transaction结构体?/ @5 B0 `- Z  A; [# u! y
现在使用真实的交易记录结构体取代描述占位符
( F/ ?0 B' F& C
每次进行交易就要创建区块?创建区块链和发币是什么关系?每个区块和钱包地址是什么关系?交易不是应该记录在每个区块上,还是说区块链存在在每个区块上?怎么知道有交易的?有交易了就开始挖矿?原来的区块都不能在有任何改动了?奖励交易是最简单的交易,只要挖矿就会存储这么一个交易?多个人同时挖矿不是资源浪费吗?NewBlockchain 和 CreateBlockchain 有什么区别呢, 注释都是一样的?, r; j. ]( i. c
CreateBlockchain 这个要先于 NewBlockchain 存在, CreateBlockchain 用于创建创世区块区块链, NewBlockchain 的作用应该就是获取区块链信息.' w4 A. S4 G' ]' j: l$ Z
为什么send里面调用的是NewBlockchain(from)?NewBlockchain 和 MineBlock 有什么区别?
1 \6 o: v/ Q" c: \2 u
MineBlock 意思更明确7 t# e7 K6 K) a3 l8 C8 f
为什么交易输入里面有交易序号Txid,交易输出TXOutput没有交易序号?做完了?haha! e+ C, h: p2 @5 m2 Y- h+ F- ~( _7 Q
& E: i9 W& u. u# G) E) N+ a- a4 n
小结
' e7 ~, z- X! g) d理解的话还是要看那个视频课程。有代码的情况下,一定要忍住不要找其他资料,没有任何资料会比写代码的人更懂过程原理。拿个笔和纸随便写写,有利于启发思路。记得太乱了
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

伤心骑士口 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    37