Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

挖矿流程及代码实现笔记

伤心骑士口
125 0 0
transaction.go 文件引入了一个新的结构体 Transaction,一个交易包含很多输入输出。7 {: \5 H) ]$ J2 J
发币交易coinbase:用于奖励挖矿成功的交易
3 j  o6 Y6 x  N9 f交易记录对象的属性:' b& j  |  O) {3 l2 @5 D* Z* l
交易记录
5 s7 [+ S7 I+ h! e交易输入3 q' U0 j- r5 W$ R# v+ O
交易输出. M: r5 V1 R  n7 B
把比特币从一个地址发转到另一个地址(转账交易/普通交易)是什么意思?
; [* Z: J; ~# f  _/ r存在区块链查询是否有足够的余额
6 a* s2 g  ]! h2 S, B9 K! C* Y输出8 e. a3 L6 ]! p6 o0 s9 N. h
系统找零
4 R- k4 z3 o3 ?) O2 U比特币要么你不花,要么全花掉,然后系统找零。
0 p& d! O4 H- S9 l* k6 d交易记录这张图是理解的关键
; y$ b5 q4 U1 ~$ N( R, x
( E% r' R4 X* Q/ l1 F来源:5-1 交易记账原理及过程% k. w! F' B$ L" s) h2 d
没花掉是什么意思?
5 W! u, X( F- [: s, L/ {首先到区块链中遍历所有的区块,把余额/没有花出去的Output找出来,然后把余额累加出来,先看看够不够资格转账,如果够资格,则按照Output一笔笔往外转就可以了,如果需要找零则在新的交易里面做一个Output来找零
$ u( I. T/ N# L- L' P7 X数字地址(必须唯一):叫做比特币的钱包
9 [* e" a5 Z) M! Q7 S7 N' C为什么比特币的数量是有限?一直挖下去不是无限吗?
! N' q3 t# ^9 r* }% b/ L5 D为什么交易的输入和输出不可能相同?' l- j5 y& d( u$ [4 }0 J! T; s
初始化 bitcoin_part4 839d69e
8 A+ k  `1 G/ V* r添加命令行主命令 d40bf3e0 ~$ Q! [0 c  h7 H+ m
添加命令行主命令的选项参数 b4caf5
- `: G8 D( Y8 N- A解析主命令并获得全部选项参数到命令对象中去 54637fd
1 E# q- D2 @' L* L- H" w! g根据解析结果调用函数,调用了查询余额的函数,调用了创建区块链的函数(挖矿)5 w3 p* a$ Z7 H
添加CLI对象的成员函数 createBlockchain 和 getBalance ,成员函数再调用核心库函数 744f01a
) w" g/ g% w( V7 g  c创建发币交易函数 NewCoinbaseTX(to, data string) *Transaction 6c7bb05
& }$ g* o" ?7 {0 v交易对象的成员函数设置交易序号 (tx *Transaction) SetID() 4a5bab6* _$ y" c" H7 [8 c7 F
交易序号使用哈希值可以验证输入输出有没有被改变过
% f+ {' R* p) m0 F* l5 }* c完成命令行函数 (cli *CLI) printUsage() b58dcbb
1 S- q: X. I7 |+ M' k6 W" JNewUTXOTransaction(from, to string, amount int, bc *Blockchain) *Transaction 3f8be71
' G9 k: w9 P, Q, z) G3 o
/ y7 b5 f5 o. X. e4 R5 iGo语法
5 w5 w* x2 S3 l  ~, t+ o; j; Qlog.Panic("…")
1 j2 C4 s! N* _! F; o' k- \" n结构体编码为字节数组的方法# x! |8 k0 ?. {. J2 ]
var encoded bytes.Buffer //字符数组缓冲器对象,encoded.Bytes()
; c. M5 B, V% zenc : gob.NewEncoder(&encoded) //传递进指针
: ~2 u, x' A* k! [+ q- a/ J6 perr := gob.Encode(tx)
" N, Q/ F1 ?" iif err != nil {8 f' `9 E6 e+ H1 Y1 ^' T
    log.Panic(err)
. D9 q& N8 i. |8 P& s' f" K; I& c0 l}3 t4 m6 U/ X9 b6 w/ J" l5 P
hash = sha256.Sum256(encoded.Bytes())
( C. ^6 ]% |- ptx.ID = hash[:]7 _& t* v8 x. t' p' O3 P
结构体的初始化 []TXInput{}
9 P& x9 P  ]1 w8 f1 ?5 Sconst subsidy = 10/ r- t5 ~8 z# g- ~
算法5 Z) J" W! T9 G- T* B3 F0 v+ _
疑问
2 b) x4 y; Z' F0 d挖矿成功奖励的10个比特币来自哪里?挖矿成功是什么意思?区块的Data部分存放的是真实的Transaction结构体?
" ?4 ?) u: j* i3 |
现在使用真实的交易记录结构体取代描述占位符1 a3 h5 d- L0 b. R, _
每次进行交易就要创建区块?创建区块链和发币是什么关系?每个区块和钱包地址是什么关系?交易不是应该记录在每个区块上,还是说区块链存在在每个区块上?怎么知道有交易的?有交易了就开始挖矿?原来的区块都不能在有任何改动了?奖励交易是最简单的交易,只要挖矿就会存储这么一个交易?多个人同时挖矿不是资源浪费吗?NewBlockchain 和 CreateBlockchain 有什么区别呢, 注释都是一样的?& S+ N/ n2 B! F& W! k
CreateBlockchain 这个要先于 NewBlockchain 存在, CreateBlockchain 用于创建创世区块区块链, NewBlockchain 的作用应该就是获取区块链信息.
) v, \5 o: P1 k0 q( ~
为什么send里面调用的是NewBlockchain(from)?NewBlockchain 和 MineBlock 有什么区别?
! ^+ o/ t) v& V
MineBlock 意思更明确4 M# H7 ?3 q" J' A  H( C  `
为什么交易输入里面有交易序号Txid,交易输出TXOutput没有交易序号?做完了?haha
/ [4 R* w# F8 F* y! K
+ e" r8 J' j0 a- s2 [* T" b
小结5 w, R: e" U, m/ Z
理解的话还是要看那个视频课程。有代码的情况下,一定要忍住不要找其他资料,没有任何资料会比写代码的人更懂过程原理。拿个笔和纸随便写写,有利于启发思路。记得太乱了
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

伤心骑士口 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    37