Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

挖矿流程及代码实现笔记

伤心骑士口
126 0 0
transaction.go 文件引入了一个新的结构体 Transaction,一个交易包含很多输入输出。
3 p% U9 I/ a- s3 H发币交易coinbase:用于奖励挖矿成功的交易
, a! O' O# U+ G+ ^5 F  z1 |交易记录对象的属性:, }! [$ L! ~- o+ Q
交易记录
% H, K! g( o) ?: Z9 x" I交易输入
; Z5 d6 l1 T; k* e" h交易输出" t: p4 R5 _% P
把比特币从一个地址发转到另一个地址(转账交易/普通交易)是什么意思?
% y% d; g+ [$ Q" G6 \6 Z2 a存在区块链查询是否有足够的余额
/ L. x$ C4 b% a- d# b' V3 B输出
, L4 P  {3 G! ]. o系统找零# @" O4 c" w* `2 m" K$ ^
比特币要么你不花,要么全花掉,然后系统找零。. ^+ _# ^& P2 f  w+ p3 ~
交易记录这张图是理解的关键
+ C2 A$ k/ Q8 J  ?% g1 A, H  M$ i) ]8 \$ f& Q' J
来源:5-1 交易记账原理及过程2 N( q$ |' q' w" L/ _& k
没花掉是什么意思?8 Z  z" ~1 b! ?% c
首先到区块链中遍历所有的区块,把余额/没有花出去的Output找出来,然后把余额累加出来,先看看够不够资格转账,如果够资格,则按照Output一笔笔往外转就可以了,如果需要找零则在新的交易里面做一个Output来找零$ o9 t" f/ ?# A- b% h4 A
数字地址(必须唯一):叫做比特币的钱包
$ Q% M* q/ r* z) _# k1 j3 Z5 D为什么比特币的数量是有限?一直挖下去不是无限吗?
4 M2 E! {# A; Q7 A为什么交易的输入和输出不可能相同?9 L% R0 E! \3 p* M5 r, X
初始化 bitcoin_part4 839d69e: R" \) Q. w. L* u
添加命令行主命令 d40bf3e
+ Y/ o5 W3 Z/ s0 W添加命令行主命令的选项参数 b4caf52 |- A0 v  o8 l; G( c
解析主命令并获得全部选项参数到命令对象中去 54637fd
' U" x& t: {4 z) O* i0 J4 V: W根据解析结果调用函数,调用了查询余额的函数,调用了创建区块链的函数(挖矿)) n1 S+ o- {+ \. {
添加CLI对象的成员函数 createBlockchain 和 getBalance ,成员函数再调用核心库函数 744f01a7 r7 t4 N6 j1 a
创建发币交易函数 NewCoinbaseTX(to, data string) *Transaction 6c7bb05/ \9 I9 r, t% ^9 O
交易对象的成员函数设置交易序号 (tx *Transaction) SetID() 4a5bab6
6 C$ m: K# y+ X2 L交易序号使用哈希值可以验证输入输出有没有被改变过; b6 j, [8 w, u+ C! ]& ~
完成命令行函数 (cli *CLI) printUsage() b58dcbb& w9 l% N6 L+ y9 f; z! S
NewUTXOTransaction(from, to string, amount int, bc *Blockchain) *Transaction 3f8be71, H/ b9 `( e3 z

) x! U( H7 j1 G2 k% L# HGo语法% j: i! C# o' M2 F% F+ |
log.Panic("…")
* x- l9 ?6 {1 a" k结构体编码为字节数组的方法
7 D0 |+ B+ C% `2 w' ?$ S7 m0 E' `var encoded bytes.Buffer //字符数组缓冲器对象,encoded.Bytes()
3 m6 b! e. W; b: Uenc : gob.NewEncoder(&encoded) //传递进指针; z8 V9 Y, w8 `0 C" A1 b4 M- e
err := gob.Encode(tx)
5 G9 V8 E( ~% r! C) W! aif err != nil {
8 z' Z, w0 B- t: h5 L# B9 F; R+ R    log.Panic(err)% J/ w/ S' Z7 [5 w1 ^& r
}
  y2 Y3 f7 u- }2 E1 a6 Ohash = sha256.Sum256(encoded.Bytes())! A1 K* f" T% |1 p  k
tx.ID = hash[:]0 H: q! k# Q1 y) V* c# V  I4 J
结构体的初始化 []TXInput{}
+ X: f  \' ~9 A; Fconst subsidy = 10# t% a8 p/ g% H% R& n
算法2 T% [9 I" p0 s2 o
疑问; s+ u  o% U4 {
挖矿成功奖励的10个比特币来自哪里?挖矿成功是什么意思?区块的Data部分存放的是真实的Transaction结构体?2 \- S6 z# {  C, B! X
现在使用真实的交易记录结构体取代描述占位符
( ?: T" A+ I' ?) `
每次进行交易就要创建区块?创建区块链和发币是什么关系?每个区块和钱包地址是什么关系?交易不是应该记录在每个区块上,还是说区块链存在在每个区块上?怎么知道有交易的?有交易了就开始挖矿?原来的区块都不能在有任何改动了?奖励交易是最简单的交易,只要挖矿就会存储这么一个交易?多个人同时挖矿不是资源浪费吗?NewBlockchain 和 CreateBlockchain 有什么区别呢, 注释都是一样的?
; F4 S0 _; S2 z3 t2 e9 `
CreateBlockchain 这个要先于 NewBlockchain 存在, CreateBlockchain 用于创建创世区块区块链, NewBlockchain 的作用应该就是获取区块链信息.* e2 l. Y" C# _  P4 U6 _8 o) i
为什么send里面调用的是NewBlockchain(from)?NewBlockchain 和 MineBlock 有什么区别?$ }% {# g: W1 ~4 d. N' k- C
MineBlock 意思更明确
- m- W1 f" `; O. O2 R8 Z) [
为什么交易输入里面有交易序号Txid,交易输出TXOutput没有交易序号?做完了?haha
' j- P. J& }$ ~- H9 ?$ }

" K3 p) [$ H7 E9 @: y5 P% @; l! D小结, q: y: i9 `4 o5 {1 @! E
理解的话还是要看那个视频课程。有代码的情况下,一定要忍住不要找其他资料,没有任何资料会比写代码的人更懂过程原理。拿个笔和纸随便写写,有利于启发思路。记得太乱了
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

伤心骑士口 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    37