Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

挖矿流程及代码实现笔记

伤心骑士口
71 0 0
transaction.go 文件引入了一个新的结构体 Transaction,一个交易包含很多输入输出。
) T! ~2 l7 j( h) K) Q+ `9 [/ p发币交易coinbase:用于奖励挖矿成功的交易# [) x0 c' T# Z
交易记录对象的属性:
& d$ s  X( y' n/ K交易记录! j5 o* M/ t2 ~. w1 L
交易输入' ~% x& A9 t, U& K6 O
交易输出
* B) z0 q% D. [. W3 ^4 J, ]- H把比特币从一个地址发转到另一个地址(转账交易/普通交易)是什么意思?8 b3 R) @( L: t( n. n
存在区块链查询是否有足够的余额
, F9 r. P+ S1 y; w输出
4 {6 \! Z4 c( w* e/ S& U系统找零2 y% T# L/ V% B, @
比特币要么你不花,要么全花掉,然后系统找零。
, ^/ ?% j' V, O7 Z; V交易记录这张图是理解的关键
- p+ H9 m3 i; Q1 ]" [' ~) ]/ J: |; l$ l5 y, B' o7 ]) w$ o
来源:5-1 交易记账原理及过程
8 c9 S! d8 W6 y- n" z% V没花掉是什么意思?+ g/ x! J6 R5 H6 o' O+ ^
首先到区块链中遍历所有的区块,把余额/没有花出去的Output找出来,然后把余额累加出来,先看看够不够资格转账,如果够资格,则按照Output一笔笔往外转就可以了,如果需要找零则在新的交易里面做一个Output来找零/ G$ `0 Z  e' A  F$ v3 g& j
数字地址(必须唯一):叫做比特币的钱包
; s! S0 O: |. y1 p8 }' ]# u为什么比特币的数量是有限?一直挖下去不是无限吗?6 V, b* b* K6 e* @" i& B; U
为什么交易的输入和输出不可能相同?
2 o2 i/ w0 U& I初始化 bitcoin_part4 839d69e8 |6 U' F5 l2 Y) }+ U! ^
添加命令行主命令 d40bf3e" B( J/ Q' e) s; c9 J
添加命令行主命令的选项参数 b4caf5
3 Y4 s' o! X3 G. T7 I# [解析主命令并获得全部选项参数到命令对象中去 54637fd
/ x  |5 j9 x- X% j* a根据解析结果调用函数,调用了查询余额的函数,调用了创建区块链的函数(挖矿)) v. e  x' U4 J! Q8 J
添加CLI对象的成员函数 createBlockchain 和 getBalance ,成员函数再调用核心库函数 744f01a
) V: F+ g# w2 E" h1 u; B# l创建发币交易函数 NewCoinbaseTX(to, data string) *Transaction 6c7bb05
) h& w/ u5 J8 a1 ]! e( p' ?" r交易对象的成员函数设置交易序号 (tx *Transaction) SetID() 4a5bab6& M/ }3 i& Z" c# M0 }/ ]& c
交易序号使用哈希值可以验证输入输出有没有被改变过
4 O( @; g- f# X3 u: f! k完成命令行函数 (cli *CLI) printUsage() b58dcbb
5 N( |+ t) e) I+ Q: gNewUTXOTransaction(from, to string, amount int, bc *Blockchain) *Transaction 3f8be710 c1 X  b  w6 h1 K( U; ~9 G8 P) I6 T
" z, z; \6 U+ B3 H, e* f  e: Q2 Z
Go语法1 g3 T5 @1 M3 ~$ g
log.Panic("…"). d' F+ W7 d  X4 |' C" t4 k; J
结构体编码为字节数组的方法
# q9 G; G, c) Y1 `1 k7 Y7 Uvar encoded bytes.Buffer //字符数组缓冲器对象,encoded.Bytes()
0 q6 U% c: D; F, P& e' o' T0 Kenc : gob.NewEncoder(&encoded) //传递进指针
3 u9 {/ N8 z- \# aerr := gob.Encode(tx)5 s- u9 T) |8 O- B2 C; s+ R4 t
if err != nil {5 @  N4 h9 D0 f' z* i1 c
    log.Panic(err)
$ s1 N) l) K. n) h}
$ i& q$ {$ e9 O9 t8 D! Nhash = sha256.Sum256(encoded.Bytes())
0 Z' S. ^8 j& z5 ^( o$ Ptx.ID = hash[:]
. t) @8 _7 F2 [; q8 L结构体的初始化 []TXInput{}+ G7 V! ^0 D- x. k! z7 L3 v5 R" f
const subsidy = 10
) ^" x) T4 W/ e( b" k8 ^6 ]算法
1 u, p- O; V. I  c  O% p疑问
' `) s2 U- b9 z1 @  [- w* T挖矿成功奖励的10个比特币来自哪里?挖矿成功是什么意思?区块的Data部分存放的是真实的Transaction结构体?  @8 a& d  h% r5 q1 g6 y
现在使用真实的交易记录结构体取代描述占位符
6 v' Z9 x; S7 C: R% q9 F
每次进行交易就要创建区块?创建区块链和发币是什么关系?每个区块和钱包地址是什么关系?交易不是应该记录在每个区块上,还是说区块链存在在每个区块上?怎么知道有交易的?有交易了就开始挖矿?原来的区块都不能在有任何改动了?奖励交易是最简单的交易,只要挖矿就会存储这么一个交易?多个人同时挖矿不是资源浪费吗?NewBlockchain 和 CreateBlockchain 有什么区别呢, 注释都是一样的?
" o# R; {, _7 w% O
CreateBlockchain 这个要先于 NewBlockchain 存在, CreateBlockchain 用于创建创世区块区块链, NewBlockchain 的作用应该就是获取区块链信息.9 s5 d( O! y- P: X+ H) g* V
为什么send里面调用的是NewBlockchain(from)?NewBlockchain 和 MineBlock 有什么区别?4 E% K% H% R( u' Y' \8 n
MineBlock 意思更明确, J/ @& d2 q! j- V8 B" o0 _
为什么交易输入里面有交易序号Txid,交易输出TXOutput没有交易序号?做完了?haha
% R& k* C: E0 `

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

本版积分规则

成为第一个吐槽的人

伤心骑士口 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    37