Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

工作量证明实现代码笔记

jayquan
148 0 0
发币是什么意思?
0 W3 s* Q/ N* ?3 Y8 r. g' n! M3 E9 Q) M
问题一:区块链是在内存上的,现在要搬到本地数据库/文件存储
3 ~6 o2 W, k% m! ~6 v- r0 c+ K% G0 j# h
改进方法:引入特殊的存储机制
8 s  D1 u1 t5 u8 F4 J
) S  Q( z) w/ a* c& ~- c5 ^8 c报错了,搞不明白,明明一模一样的,错误截图如下:9 v5 [3 {: E: @/ P5 j. r3 A9 s  K( k

& y* D- u- P  |7 K, h- @哈哈,通过在bolt库路径下搜Update找到用例了,发现是语法错了,这里是匿名函数啊!
4 o! L( W. ^8 S( ^/ i, ^; H' s
" Y& C5 \9 p; `% }一个block区块里面可以有多笔交易是什么意思?
  J+ Y. _2 |# @" j- s, e( B& @/ N5 I) g- \
合约和区块链什么关系?, _0 \7 f) l: B# v$ {
& M( v" t( T% D: }* d
完成数据库替换内存数据 f383d000df2c68b875f5cdbc233fb2ee20facd78. T" z' h/ ?' P& q, [: b# y

+ z# G" W9 G- L但是数据库内容还不知道对不对。8 O4 n2 w/ F* z0 E
8 [3 h1 l( F! W0 `7 e# D
问题二:main函数太不优雅了,不灵活
! n* J, c1 O# w: M) Q" H3 J9 y$ j) F; O4 P8 ^+ z5 j4 S' A
把交易记录写入区块放到命令行做。/ j( k0 E" u* {; n% K/ q

- f+ f6 s: C* M' x5 Z+ U) t7 t交易记录和区块是什么关系?
- G1 w. q: R% R4 S1 d: y7 O
1 }9 N6 i! S% f; U$ D3 s6 z难道没次发生交易就要创建区块,那不是太麻烦了?6 [: U; y4 h6 S7 z
# K- b( g" y& n
main函数操作部分交给CLI执行 3521b35776fcad749fa8830494e68b6a50d5be3b5 K7 l' c" \1 B) U" u5 x

$ U2 k6 Z4 t, V  z, d9 CCLI可以理解为一个类,先是初始化/构造函数,然后就是和数据相关的操作了。
9 s3 P5 i# h( m' ]/ G1 W, J7 p% F5 k: N! m* M8 B( k( Z
定义CLI结构体 0c64883897b70aa42ffc6582e3350a4971ead5b8
" J4 T  o2 L0 a6 x$ T0 E+ M/ l% p2 x! }$ ~' i! o- J; C
func (cli *CLI) printUsage() 1383575d21e1c8c9dcd57f753877829835e0e1552 p9 P' B# T% ]( h6 S0 v

0 U5 X6 v. r: S! v$ W  Z验证参数 6611b9309378d50ee40ca0c684fe400b0605a4a7
5 \! L. q% F5 N% p+ M% C5 t6 h) H4 F- M: k
添加新区块到区块链 c59a70a888b3d572245668f89beed2672f273d62+ `/ L  q$ D, Z. y/ D

3 t$ c% i1 Y! U& U- A0 O! ~" B这些方法又都是供Run()选择调用的) K2 N/ ~+ C, v

2 A; \6 P2 X" p/ J添加blockchain的迭代器,并配置Next方法 5c024d134cbbc60c4cc9ed87a9a980734d8dc54d$ o9 y/ u) l" }) b$ [' o( R& q: E

7 `1 w5 c" k3 B  D+ s测试命令如下,此时的版本是 297618742b808e0b759a3481cf454dbfaa5f1f99
; L" q! ^) t) t: {9 r  k4 n8 p, }5 c1 G
./coin
* \- V. o! N% r3 ]
* O4 B* q& r( M3 _5 ~$ D+ A./coin addblock -data “Pay 0.313 BTC for a coffee” 区块链被存储到本地数据库了& c4 P  H: [2 t; u1 R1 k

8 r) A* b9 `* D& \4 [( H./coin printchain9 X4 F- A5 M. v; }) o
* u2 P6 \* |/ w. o- j
效果截图如下:& L$ g% j. @* Y# {

, D8 v9 K4 H4 ~6 v4 N5 W但是打印后发现只有创世区块,不知道是存储问题还是打印问题?2 ]" u( [  _. ]/ h! [
4 c3 k5 d/ E) j4 h$ n' c2 g# V/ C
于是我不断运行 ./coin addblock -data “Pay 0.313 BTC for a coffee” 发现文件大小是增加的,说明添加数据是没问题
& _! i( ]' D7 V# B0 o
( L4 [  V+ O# m就是打印问题。
8 V* p0 I+ b. V4 F# |4 O/ |
! G# p& q) b0 B3 Q# g问题还没解决,明天再说吧。. ^6 N7 R. b, k5 ^1 x% g

% _5 T! q$ r( ^% |5 h7 V" U语法% C, \5 h/ F1 D: m

6 z5 T5 }' \3 W/ v& RGO语言真的很强大,包管理直接依托github.com,一个包就是一个文件夹,文件夹里面直接就是代码。
% [- }: g& D& M2 M
/ }2 M! Y1 M. N5 ?bytes.Join()和genesis.Serialize()的区别?1 [. v) N9 L0 ]- W( T
4 i8 }1 F* [" n' [# m& W; T+ `/ F
[]byte转换为string:hex.EncodeToString(block.Hash[:]) -> %s
% I8 u# R, N# B: q# l% _$ S7 ^. b: l- ]8 n( x
block.Hash -> %x
$ [) M; n, d: O/ @# X2 E- s0 G) ~* x
第一次用:=,之后不需要冒号:了1 f  m5 w, Z! I

5 W0 N0 Q2 @  m" T# ]+ |defer bc.Db.Close()表示函数结束后再次执行这个语句。
. w1 z' ]  c# a! M6 @/ K: R& d) Z* r3 T8 h- z3 U7 Y' V+ {  A
成员函数都用小写开头。7 h: U) l( j& c9 B8 `/ Q

: U5 N: O' \; z  _0 w# j* R成员数据都用大写开头。
+ h% N% Y* C' |3 e! D1 h- L; s6 i- e4 c
strconf.FormatBool(pow.Validate())0 }2 Z. T* j% q! V, a

, P/ T# f* X( [. O# J4 T4 ffor {}
5 b7 l) @- P" \( q  L5 P
8 o; J, }& y. v" M: C+ I, Jcli := core.CLI{注意结构体初始化是花括号} b2459e54cea7c4e8a6a8f7bc11eb81b65ed50fbb" G- Q+ j4 H! r5 B1 ^; q

  E6 s! X- h1 g6 s技巧
0 D! B4 e: ?# S+ D
  M) Q( E% a( ~$ o: R复制仓库全路径https://github.com/boltdb/bolt,GoLand会自动询问是否安装。7 p2 a5 s2 ^* [4 Z/ Z

. I& k: C# e; e1 x相当于执行 go get -t github.com/boltdb/bolt,安装的库在当前项目的src/github.com/boltdb/bolt下面,不会被git识别。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

jayquan 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1