Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

挖矿流程及代码实现笔记

伤心骑士口
91 0 0
transaction.go 文件引入了一个新的结构体 Transaction,一个交易包含很多输入输出。& A8 M! T& ^7 t5 \
发币交易coinbase:用于奖励挖矿成功的交易# P2 x8 r6 L0 [, m) v' O7 Y
交易记录对象的属性:- M) g& i" S* i0 L) r  M+ Y
交易记录. ~, t2 {$ C$ l  Y( E9 D" o
交易输入
. r5 y6 o/ ^& }/ q5 f/ o8 ^; B交易输出& M7 P9 p) m% Z! s- P& u7 I! f" L: u
把比特币从一个地址发转到另一个地址(转账交易/普通交易)是什么意思?. l  j; l( y2 h# {& c- m7 q
存在区块链查询是否有足够的余额* E% E+ ]* D" s% Z
输出, ?! ]3 ^( k- Q: D& P! |
系统找零, M  S7 a: j. v3 |3 W& X! F
比特币要么你不花,要么全花掉,然后系统找零。, D$ |& ~; b4 r  ^' E3 {, z
交易记录这张图是理解的关键
# O2 ~, W2 B6 W2 F( p
: E- Q2 U2 u& u3 l9 p$ Z) `来源:5-1 交易记账原理及过程
9 }7 h# P! K* ]没花掉是什么意思?
8 H; i2 X3 F& v8 V首先到区块链中遍历所有的区块,把余额/没有花出去的Output找出来,然后把余额累加出来,先看看够不够资格转账,如果够资格,则按照Output一笔笔往外转就可以了,如果需要找零则在新的交易里面做一个Output来找零
7 [( F# c. S  l' m' }& q# S数字地址(必须唯一):叫做比特币的钱包
6 @5 |9 J( M8 l0 R- U3 L) T为什么比特币的数量是有限?一直挖下去不是无限吗?* `2 H5 o; A0 q1 x" `- w
为什么交易的输入和输出不可能相同?
( p* U! W( t( |1 M  U初始化 bitcoin_part4 839d69e
* v+ ], O( E! p添加命令行主命令 d40bf3e7 e+ N9 f; [) I5 L
添加命令行主命令的选项参数 b4caf5. i/ f5 G$ K# X5 m# ]
解析主命令并获得全部选项参数到命令对象中去 54637fd# u2 G- k# o& j6 r8 }
根据解析结果调用函数,调用了查询余额的函数,调用了创建区块链的函数(挖矿)$ A6 h5 T4 u1 C3 E& j
添加CLI对象的成员函数 createBlockchain 和 getBalance ,成员函数再调用核心库函数 744f01a* C% |  S+ t  Z) c; _1 J
创建发币交易函数 NewCoinbaseTX(to, data string) *Transaction 6c7bb054 V9 _; _" d! r) r# r
交易对象的成员函数设置交易序号 (tx *Transaction) SetID() 4a5bab6
4 o8 _% f$ j# v9 U- ~" n交易序号使用哈希值可以验证输入输出有没有被改变过; C: ~- T$ G# s
完成命令行函数 (cli *CLI) printUsage() b58dcbb
" R/ j' f! R) Q: H( [6 E( eNewUTXOTransaction(from, to string, amount int, bc *Blockchain) *Transaction 3f8be71
- D1 K! f# v' ]8 X# c8 U) _  C/ @
% F( E) T' {3 H9 `: L) M7 F0 A0 OGo语法
: V* \1 B0 I" p" o) N4 Q8 Dlog.Panic("…")3 |; x$ i  S0 \! q
结构体编码为字节数组的方法- F3 X* Q2 e; R: J; H5 H4 c
var encoded bytes.Buffer //字符数组缓冲器对象,encoded.Bytes()
. U! x  ~0 s# @7 eenc : gob.NewEncoder(&encoded) //传递进指针4 t$ U* U9 c% [' j$ R1 ^/ `& Q; u8 i2 Q( }
err := gob.Encode(tx)6 A& C+ `& p$ {
if err != nil {- }3 W% x) C; \( {
    log.Panic(err)
) h' D7 G; z  I0 D# K0 ]9 K% g}* V- P1 S' q6 |8 @+ b
hash = sha256.Sum256(encoded.Bytes())
& b: c" j1 v. l. g) n" @7 X6 b8 ttx.ID = hash[:]
5 {8 [- N( ~! U; S- z& f. X结构体的初始化 []TXInput{}
+ K1 Z* N3 O4 T* t2 O5 Z2 cconst subsidy = 10
' `" a  z# x/ l' p算法
) E7 W4 G% i2 d! f, P疑问
9 n& b: `( G2 W% b挖矿成功奖励的10个比特币来自哪里?挖矿成功是什么意思?区块的Data部分存放的是真实的Transaction结构体?! C: _" s! x- Z4 f1 q8 Z/ Y2 K( |
现在使用真实的交易记录结构体取代描述占位符5 U: x& d# m1 U0 V. n9 m- v* t
每次进行交易就要创建区块?创建区块链和发币是什么关系?每个区块和钱包地址是什么关系?交易不是应该记录在每个区块上,还是说区块链存在在每个区块上?怎么知道有交易的?有交易了就开始挖矿?原来的区块都不能在有任何改动了?奖励交易是最简单的交易,只要挖矿就会存储这么一个交易?多个人同时挖矿不是资源浪费吗?NewBlockchain 和 CreateBlockchain 有什么区别呢, 注释都是一样的?
" f: n9 a0 Z1 O6 u2 K% n# y* U
CreateBlockchain 这个要先于 NewBlockchain 存在, CreateBlockchain 用于创建创世区块区块链, NewBlockchain 的作用应该就是获取区块链信息.
" B1 [0 y3 i8 x% Y6 u4 x
为什么send里面调用的是NewBlockchain(from)?NewBlockchain 和 MineBlock 有什么区别?
2 v% T- v8 Y2 v  K$ |
MineBlock 意思更明确
$ ^! `6 I9 j1 @: R1 h  v" k
为什么交易输入里面有交易序号Txid,交易输出TXOutput没有交易序号?做完了?haha
2 Y/ B7 Z/ Z" [* F

. z# n/ A8 ~. a4 |9 N4 |小结. @# R) X  e- w* i, Q1 O" P
理解的话还是要看那个视频课程。有代码的情况下,一定要忍住不要找其他资料,没有任何资料会比写代码的人更懂过程原理。拿个笔和纸随便写写,有利于启发思路。记得太乱了
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

伤心骑士口 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    37