Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

工作量证明实现代码笔记

jayquan
163 0 0
发币是什么意思?
  Y+ I0 M; t0 O# q% j. [+ [' \4 l3 w9 B  }; ]" J( z, X
问题一:区块链是在内存上的,现在要搬到本地数据库/文件存储3 v! b! ?8 K  `$ ]" @2 ~

$ s1 K$ T+ Y$ r; D5 @5 l4 ?: |/ ~3 n9 [改进方法:引入特殊的存储机制
( s0 ]6 }7 }9 H0 S! _6 S6 W: ]
: _4 B7 M( c( C/ r6 }报错了,搞不明白,明明一模一样的,错误截图如下:! d6 J& q# d% ]8 O8 z0 F
1 w4 p, p- i  Z" n
哈哈,通过在bolt库路径下搜Update找到用例了,发现是语法错了,这里是匿名函数啊!  Z4 u1 H- R+ h1 V, q
; w& e3 q+ d8 w: w  l  t
一个block区块里面可以有多笔交易是什么意思?
* e3 q6 D: Z9 {- e. m4 z( p4 \4 l" E0 p0 e) c" N, D( z
合约和区块链什么关系?
- P! V4 Q" V! _0 o. |! S9 I% y/ @, |, f4 J2 ?
完成数据库替换内存数据 f383d000df2c68b875f5cdbc233fb2ee20facd78
, ]) h' ^- ~+ h1 x. L4 V, K$ q" z  F/ f" F# B
但是数据库内容还不知道对不对。
' @, x  m3 }) b3 o, N. q) n7 \
; a7 J# h: K. g  X问题二:main函数太不优雅了,不灵活
( Z0 w3 l% w/ J  E5 X+ D
0 p+ E; Z' R1 x! b& @! M把交易记录写入区块放到命令行做。0 w/ _4 \4 v( r
3 G% O0 H) p+ X% r6 H$ P% y
交易记录和区块是什么关系?
3 ~. D9 q# t3 z. l8 ]4 A+ q2 u, ^, _% q  ]
难道没次发生交易就要创建区块,那不是太麻烦了?9 }9 F8 a& g3 d. V& o

6 S+ u8 A8 W) }  [% g6 b+ jmain函数操作部分交给CLI执行 3521b35776fcad749fa8830494e68b6a50d5be3b5 ]: I( I. i6 E# X2 ~4 W+ _) Y

  v' e! m! `) f; a! ]CLI可以理解为一个类,先是初始化/构造函数,然后就是和数据相关的操作了。
  \* G# s. c* F2 _) T; h0 m/ D5 s4 O7 |# H1 V. H# D* b
定义CLI结构体 0c64883897b70aa42ffc6582e3350a4971ead5b8
! H, A8 H4 j  C- }9 \! @4 e( r9 H& @) h+ V! h
func (cli *CLI) printUsage() 1383575d21e1c8c9dcd57f753877829835e0e155
% u+ _6 G& b) l  @0 M& ], j7 G7 N; ], {- j
验证参数 6611b9309378d50ee40ca0c684fe400b0605a4a7
' K9 ]! z) M; M- p# F8 X6 r
, ?/ v& m( J* k$ u2 @; T; t0 L添加新区块到区块链 c59a70a888b3d572245668f89beed2672f273d62! K, x& i/ S' b" |( L; F

% B1 p1 t- t. O* ]: U- K! U这些方法又都是供Run()选择调用的% p; y  n2 N+ \3 v

( t7 v8 z/ q* K& i# R. v$ \6 D添加blockchain的迭代器,并配置Next方法 5c024d134cbbc60c4cc9ed87a9a980734d8dc54d# ~2 n0 \  z3 e3 \. ?8 K. q
- d& B& p) D4 G4 i# f% x
测试命令如下,此时的版本是 297618742b808e0b759a3481cf454dbfaa5f1f99
& H) p& M4 f  V8 A6 o3 k# f" p- w* f' Q# }( R6 r) v$ T9 h% X
./coin8 p; I+ ?0 D1 |, M
9 f5 b$ b- T- n: t2 A* z
./coin addblock -data “Pay 0.313 BTC for a coffee” 区块链被存储到本地数据库了
2 p7 _. j  a3 S! \3 S# ^8 Y4 n. s+ P. g. M. O# w
./coin printchain
9 x, _$ G, x" J0 e0 l- ?
" ], @) [7 v8 W( x: E; g# q$ W( ~2 {效果截图如下:
- o$ `3 M( b0 a: K4 V& u' m, d
+ U! }2 Z* F! e1 c& u但是打印后发现只有创世区块,不知道是存储问题还是打印问题?# d; h6 ]' \7 j8 J6 F% a
; {3 s- i  l4 f8 n
于是我不断运行 ./coin addblock -data “Pay 0.313 BTC for a coffee” 发现文件大小是增加的,说明添加数据是没问题, M0 h, r5 R' H* X  n, }) E/ f0 l

. b* p' J& F9 d8 r$ N; J就是打印问题。
! P; G: x) V" ^, o  ~8 a0 n4 i# p0 ^
' t) I! v. w1 q1 z! c7 T问题还没解决,明天再说吧。. j% w) h1 J, W: g1 @* Q! n
9 \: S( {; Q. `" E1 I( M7 }9 _  h! a; R* p
语法* J8 q9 F3 H( h- @, S6 S, Q# M
' f! O' X# X3 I" Y
GO语言真的很强大,包管理直接依托github.com,一个包就是一个文件夹,文件夹里面直接就是代码。
: l, V  ]  h/ Y2 b% r: _) K
  k! y- V' t6 h+ g1 f* bbytes.Join()和genesis.Serialize()的区别?
- j# V5 q6 H2 O# K( f4 w# x0 A+ O7 F! W
[]byte转换为string:hex.EncodeToString(block.Hash[:]) -> %s
) Z, |5 y/ A+ E
0 Z1 T+ g/ H  l! u, ]4 l2 Lblock.Hash -> %x- i( t& I* H7 h) P! A8 L: t
. A7 o- B* m4 [- L5 p
第一次用:=,之后不需要冒号:了. i7 H1 @$ c4 Y( E  Y, n- U5 R
% f0 p4 ]* }4 u6 h$ H  A& I: v
defer bc.Db.Close()表示函数结束后再次执行这个语句。
1 _: k5 X. I1 ~$ s8 E! P8 K( c# t+ Y% U
成员函数都用小写开头。
; g/ y+ v  k. M- c3 y+ e' _. R, Z1 F. `1 Y
成员数据都用大写开头。$ T: q& x4 C. ^7 g

) J8 [$ U& v2 t& n, a7 U; Qstrconf.FormatBool(pow.Validate())( V9 d% y* u2 |
7 ?# F3 |7 \9 Y, T8 J8 a+ y% m, }8 l
for {}, ^* E3 i; h8 |! f
9 A. l6 j, K1 G# J/ B
cli := core.CLI{注意结构体初始化是花括号} b2459e54cea7c4e8a6a8f7bc11eb81b65ed50fbb& v1 A# f3 X9 B

" N$ D+ O' {$ q: h5 O. H* X) g技巧
1 k4 d) Z) }% V  z- c, P7 L6 o) y
$ g+ W: p  m$ [! U. z复制仓库全路径https://github.com/boltdb/bolt,GoLand会自动询问是否安装。
0 X: u$ N8 g: {& E# g" O% C
9 m& c( ]* j$ P2 [% ~7 q相当于执行 go get -t github.com/boltdb/bolt,安装的库在当前项目的src/github.com/boltdb/bolt下面,不会被git识别。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

jayquan 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1