Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

挖矿流程及代码实现笔记

伤心骑士口
67 0 0
transaction.go 文件引入了一个新的结构体 Transaction,一个交易包含很多输入输出。$ }; q4 {% e4 Y! M. W% u: I
发币交易coinbase:用于奖励挖矿成功的交易
7 V* X4 Q' b+ g/ Z# j, R# m0 O交易记录对象的属性:. d' P: X, l0 s  e3 ~# o9 m9 e
交易记录7 U2 j8 C! Z  O1 B# w! y8 s3 e
交易输入
( U5 b, \# E1 a+ k. U6 U交易输出
4 |+ O: `/ g& y  N把比特币从一个地址发转到另一个地址(转账交易/普通交易)是什么意思?
, [2 w2 N% G2 \$ G) h存在区块链查询是否有足够的余额# K! n4 t) B& A4 T. \1 X
输出
8 A& m! V- }. B8 G4 {* g$ L系统找零. a$ R8 g% u3 h" }3 M2 L# @- f1 y
比特币要么你不花,要么全花掉,然后系统找零。% d  w  ~0 }# |! E
交易记录这张图是理解的关键' h- l$ N1 t7 B7 O: B  S' h
% {7 T) j* F) q  w5 C
来源:5-1 交易记账原理及过程0 h) w: v$ I: }7 b& _# F
没花掉是什么意思?
" L$ M, g3 K3 A首先到区块链中遍历所有的区块,把余额/没有花出去的Output找出来,然后把余额累加出来,先看看够不够资格转账,如果够资格,则按照Output一笔笔往外转就可以了,如果需要找零则在新的交易里面做一个Output来找零
+ o+ f0 f/ h" W数字地址(必须唯一):叫做比特币的钱包6 t" ~8 D: c& j
为什么比特币的数量是有限?一直挖下去不是无限吗?0 _5 M2 i! }7 `. k
为什么交易的输入和输出不可能相同?
2 D$ I6 J; v9 ~- K" t* I3 V初始化 bitcoin_part4 839d69e
* f8 @" u; E' ~( t4 X添加命令行主命令 d40bf3e
9 l" r( i, i" n1 D7 |添加命令行主命令的选项参数 b4caf5$ L/ N9 ~' W7 r0 A3 y7 U' a
解析主命令并获得全部选项参数到命令对象中去 54637fd" `. U% s/ R6 T3 D
根据解析结果调用函数,调用了查询余额的函数,调用了创建区块链的函数(挖矿)
4 g6 @" d  e4 |3 Y/ e1 b; u3 s: H0 {) ~' D添加CLI对象的成员函数 createBlockchain 和 getBalance ,成员函数再调用核心库函数 744f01a6 }6 G3 ~& T: V8 S* m8 Z
创建发币交易函数 NewCoinbaseTX(to, data string) *Transaction 6c7bb05$ [+ w+ |6 ]% _0 T
交易对象的成员函数设置交易序号 (tx *Transaction) SetID() 4a5bab6
: X, D1 _% n! U' E- u& P交易序号使用哈希值可以验证输入输出有没有被改变过3 ^# p/ ~) @& I9 ?  G+ b
完成命令行函数 (cli *CLI) printUsage() b58dcbb  B  @) e8 n2 h; y( I+ F. A# w
NewUTXOTransaction(from, to string, amount int, bc *Blockchain) *Transaction 3f8be71! ]# j+ w4 j& q2 s# a: u
0 T8 n; f( u: V3 B
Go语法# s  V+ l" `5 ~; y$ w
log.Panic("…")
5 g1 S' g0 s7 S/ h结构体编码为字节数组的方法
! V. |( b% }; x4 ^( X! \var encoded bytes.Buffer //字符数组缓冲器对象,encoded.Bytes(). k0 K) O( d5 u0 Y7 f
enc : gob.NewEncoder(&encoded) //传递进指针
/ g) _" m$ C  W* S9 j% |/ kerr := gob.Encode(tx)
" M% s1 u* J0 wif err != nil {
4 |$ ]& V6 A# |; d. K; H* @    log.Panic(err)
/ N8 {" w9 r4 I}
2 ^9 k9 |0 R+ v# N# A! N& ~hash = sha256.Sum256(encoded.Bytes())
" u* H! r- @- d! ]" D! \# E$ Y6 ^9 Ptx.ID = hash[:]
+ t+ b6 M) S3 w# C4 `结构体的初始化 []TXInput{}0 o  t$ S' a2 u$ J, j- @
const subsidy = 10
0 w: s, ?# y1 t9 B( ]# O算法
% E$ c# M: p1 i疑问
% e, Q& q" f6 F6 o6 T/ u2 W挖矿成功奖励的10个比特币来自哪里?挖矿成功是什么意思?区块的Data部分存放的是真实的Transaction结构体?+ _( J+ m: }9 g: g; r% q
现在使用真实的交易记录结构体取代描述占位符
  d0 @7 {: ~3 J1 S  Z/ j) ^3 B/ W1 M
每次进行交易就要创建区块?创建区块链和发币是什么关系?每个区块和钱包地址是什么关系?交易不是应该记录在每个区块上,还是说区块链存在在每个区块上?怎么知道有交易的?有交易了就开始挖矿?原来的区块都不能在有任何改动了?奖励交易是最简单的交易,只要挖矿就会存储这么一个交易?多个人同时挖矿不是资源浪费吗?NewBlockchain 和 CreateBlockchain 有什么区别呢, 注释都是一样的?
+ ?4 w  q" \2 q5 p
CreateBlockchain 这个要先于 NewBlockchain 存在, CreateBlockchain 用于创建创世区块区块链, NewBlockchain 的作用应该就是获取区块链信息.3 @4 v* O1 _; d( m& @
为什么send里面调用的是NewBlockchain(from)?NewBlockchain 和 MineBlock 有什么区别?
- u: @" L$ w  B6 \* c
MineBlock 意思更明确
2 u0 C' B8 x$ B
为什么交易输入里面有交易序号Txid,交易输出TXOutput没有交易序号?做完了?haha
$ W2 b' E8 E, N" R/ F

) }) W  t. s7 S" i- Y小结
' [& l/ i6 [) G9 J# Q4 Y& D+ d3 i理解的话还是要看那个视频课程。有代码的情况下,一定要忍住不要找其他资料,没有任何资料会比写代码的人更懂过程原理。拿个笔和纸随便写写,有利于启发思路。记得太乱了
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

伤心骑士口 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    37