Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

挖矿流程及代码实现笔记

伤心骑士口
65 0 0
transaction.go 文件引入了一个新的结构体 Transaction,一个交易包含很多输入输出。
6 S$ h. L8 {7 M3 D) P( t发币交易coinbase:用于奖励挖矿成功的交易
" @8 I8 G+ r. H( X; l交易记录对象的属性:
% I9 H: @3 j1 f8 V交易记录
& [9 g. K$ I9 s# n交易输入
6 P. H/ U) A* _/ t; [* U* u) K交易输出7 ^$ J& z; f2 x. j2 X8 C
把比特币从一个地址发转到另一个地址(转账交易/普通交易)是什么意思?; F  M8 R. |0 K+ M( x2 C
存在区块链查询是否有足够的余额
6 o+ [9 H/ O( c8 ~$ z1 ^7 g输出" o# m, U- B& Z! {+ V/ s4 o
系统找零
2 C, ?9 g9 M" }$ u比特币要么你不花,要么全花掉,然后系统找零。
3 k$ E* t5 f- G& @7 x交易记录这张图是理解的关键! u, t( T; U; i/ I3 K4 J1 d

3 q( ?: Y0 i" ^' E( O来源:5-1 交易记账原理及过程
0 N* T9 G5 q+ e, M4 O$ V# {没花掉是什么意思?
0 h! ^# T$ @3 s$ |. k首先到区块链中遍历所有的区块,把余额/没有花出去的Output找出来,然后把余额累加出来,先看看够不够资格转账,如果够资格,则按照Output一笔笔往外转就可以了,如果需要找零则在新的交易里面做一个Output来找零
9 ]4 b9 ^2 B7 ?: x. O8 P) I0 d" N数字地址(必须唯一):叫做比特币的钱包% u: E  _' _4 g$ d9 X
为什么比特币的数量是有限?一直挖下去不是无限吗?
4 W, k! d; a! J! q& q为什么交易的输入和输出不可能相同?
7 m) y" |' N5 U% I9 P; ^8 d: ?+ b初始化 bitcoin_part4 839d69e+ _( B- t2 D* d- N3 w- d6 v2 K
添加命令行主命令 d40bf3e
  l" s% `: j& E9 T# }# ~8 d* b添加命令行主命令的选项参数 b4caf53 d- `3 E( t& |! l9 ?# f
解析主命令并获得全部选项参数到命令对象中去 54637fd
) |8 I+ B3 u* \# T根据解析结果调用函数,调用了查询余额的函数,调用了创建区块链的函数(挖矿)! J/ |9 T% S  `( E5 T8 q6 ~7 |( @  R
添加CLI对象的成员函数 createBlockchain 和 getBalance ,成员函数再调用核心库函数 744f01a1 f$ D7 r) t: j( c8 W. I
创建发币交易函数 NewCoinbaseTX(to, data string) *Transaction 6c7bb05
5 N# E. w( W  j. S6 k+ J交易对象的成员函数设置交易序号 (tx *Transaction) SetID() 4a5bab6
8 H) a  v, {) m) a; z3 f4 n7 z交易序号使用哈希值可以验证输入输出有没有被改变过
8 s" E; ?& v$ _4 G- L" I完成命令行函数 (cli *CLI) printUsage() b58dcbb
. p1 `( {4 S: \) R: ]* lNewUTXOTransaction(from, to string, amount int, bc *Blockchain) *Transaction 3f8be71
* B% A: w; U5 k8 s4 {( u& H+ U9 D
) D- f8 o0 k" d1 @/ W1 T  S( Z& DGo语法
4 U% K! p6 q8 \: Y* X7 Olog.Panic("…")
( s: X. K; U; E/ J6 r) c  H  n结构体编码为字节数组的方法
/ u! K2 F  s# h6 kvar encoded bytes.Buffer //字符数组缓冲器对象,encoded.Bytes()- ]2 t! `7 ]) X" y+ w. a
enc : gob.NewEncoder(&encoded) //传递进指针9 g; ~( K( l' p: j: ~! @
err := gob.Encode(tx)
5 D/ \9 O) v, W) Lif err != nil {0 g$ G$ o6 A. o$ o$ v7 G' [
    log.Panic(err)! I8 w7 z. h! u  f. H
}# l' d( G$ i6 G- {! E8 a
hash = sha256.Sum256(encoded.Bytes())
3 R4 q# c" h1 B) M% V' _tx.ID = hash[:]+ J; S( }6 t5 o8 e# F- O- L1 _4 |# G
结构体的初始化 []TXInput{}
8 j; K; }$ k4 I* Bconst subsidy = 10: v+ I& _  Y/ V
算法$ S. T9 l5 C- {* \) H! l
疑问% ~) k$ C, t0 [; g$ `9 i( t
挖矿成功奖励的10个比特币来自哪里?挖矿成功是什么意思?区块的Data部分存放的是真实的Transaction结构体?/ ]8 _' i. f9 y) M3 X
现在使用真实的交易记录结构体取代描述占位符
: b/ M5 Y) G5 |+ U: V7 I
每次进行交易就要创建区块?创建区块链和发币是什么关系?每个区块和钱包地址是什么关系?交易不是应该记录在每个区块上,还是说区块链存在在每个区块上?怎么知道有交易的?有交易了就开始挖矿?原来的区块都不能在有任何改动了?奖励交易是最简单的交易,只要挖矿就会存储这么一个交易?多个人同时挖矿不是资源浪费吗?NewBlockchain 和 CreateBlockchain 有什么区别呢, 注释都是一样的?
# f0 v$ Y  F! n$ `! l
CreateBlockchain 这个要先于 NewBlockchain 存在, CreateBlockchain 用于创建创世区块区块链, NewBlockchain 的作用应该就是获取区块链信息.& ?( h1 l5 E, m  C6 q. \- h3 D9 K
为什么send里面调用的是NewBlockchain(from)?NewBlockchain 和 MineBlock 有什么区别?7 r7 A0 F6 T. V% g6 \
MineBlock 意思更明确
. M; F0 I1 P0 E- ~9 c# H& f$ R
为什么交易输入里面有交易序号Txid,交易输出TXOutput没有交易序号?做完了?haha
8 s# {- Q2 U& S( G8 C2 Z% }

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

本版积分规则

成为第一个吐槽的人

伤心骑士口 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    37