Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

工作量证明实现代码笔记

jayquan
170 0 0
发币是什么意思?! o, F6 Q% ]7 f6 T, {& B( p3 w0 x

* E2 I5 g! n& u; a& J4 h问题一:区块链是在内存上的,现在要搬到本地数据库/文件存储7 S; s1 K. y: w2 a4 T' c
! ?; v+ b3 z) y! L
改进方法:引入特殊的存储机制5 R$ L! r5 u4 l

. H* k- R  r) h+ a! R7 _( A报错了,搞不明白,明明一模一样的,错误截图如下:
# ^4 O2 P9 ?: _& D* @7 c% G4 [, |# u0 A
哈哈,通过在bolt库路径下搜Update找到用例了,发现是语法错了,这里是匿名函数啊!
( F  {" T3 ?- s( v5 G" t: H9 e2 z8 d0 R) m0 V( p" B& W% V( b+ p* Y
一个block区块里面可以有多笔交易是什么意思?% D  L0 F$ f  H

1 N8 M- m$ c! J) `; {. R合约和区块链什么关系?9 y! E! n' k; N# L& p) v, P

1 @4 F3 P" s  K" |: y* ~, a% g完成数据库替换内存数据 f383d000df2c68b875f5cdbc233fb2ee20facd78" X6 X$ |8 R" e- v5 G0 Y! o

8 I4 d2 O! ]5 d  y但是数据库内容还不知道对不对。
4 s$ U2 }1 y  s( ~
) @( x$ `- `" @- a/ s  X问题二:main函数太不优雅了,不灵活
- x4 o. U4 |: e8 `
1 V8 k3 P$ f1 L! \$ P把交易记录写入区块放到命令行做。
* {- B5 |, t! U  @( t# M. i: m1 M. @- P' D5 z& D$ y, W
交易记录和区块是什么关系?
  S$ v) ^6 R" o% x  _4 k7 O8 F4 W. C
难道没次发生交易就要创建区块,那不是太麻烦了?7 f2 G0 K& z0 v; c" B+ O& {
, a. w4 i! W; T2 q+ f, J2 i6 @
main函数操作部分交给CLI执行 3521b35776fcad749fa8830494e68b6a50d5be3b( _1 D( X1 J' b  x' ?# _

8 _7 B% C3 C/ O( @' vCLI可以理解为一个类,先是初始化/构造函数,然后就是和数据相关的操作了。% o+ E/ s) `& a( Q: M& h2 \" _
" g& r2 Z* T* u- n- A, Y  v1 I
定义CLI结构体 0c64883897b70aa42ffc6582e3350a4971ead5b83 L' T* C4 U/ x$ h0 i: O) s
% B5 l. C1 @) V' v! N, P  k
func (cli *CLI) printUsage() 1383575d21e1c8c9dcd57f753877829835e0e155) S2 ~2 \* N, ?/ ?9 {. B
, L3 [) B4 o% ?5 ~) G% U' k. r% @
验证参数 6611b9309378d50ee40ca0c684fe400b0605a4a7
# R( O" Q$ }7 ]- M4 {" [, Q! c$ e. j
添加新区块到区块链 c59a70a888b3d572245668f89beed2672f273d627 X+ c, M- C% ~2 K& E
+ N& r$ ~2 W. T, W+ C% u2 X7 I
这些方法又都是供Run()选择调用的. ^: z0 J4 [6 V3 ?- h0 Y3 A

5 v! n: }$ O2 h6 D2 t1 f+ d添加blockchain的迭代器,并配置Next方法 5c024d134cbbc60c4cc9ed87a9a980734d8dc54d
( c$ L, z  k* N4 \$ M
  P& n* [9 i& q1 y测试命令如下,此时的版本是 297618742b808e0b759a3481cf454dbfaa5f1f998 h. V0 B* T9 ?* @6 X9 d- K

  M* G' C! w. g5 s" Y./coin
. k8 T3 g. Q) C/ f
! f. _2 {5 P" n+ e./coin addblock -data “Pay 0.313 BTC for a coffee” 区块链被存储到本地数据库了
5 q8 j7 y8 W/ x  \& \; J
0 [9 h- a8 ~$ k# j. X/ S./coin printchain% t/ v6 P* [7 ^( g4 e! O

2 ~0 ]; k6 o1 g% @: S  F+ h8 f效果截图如下:
  L$ J! B% k( R' g; `: F4 Y  S9 W; L) G: P2 S
但是打印后发现只有创世区块,不知道是存储问题还是打印问题?
2 U; s5 q. B2 A8 p
( ?2 k, _' b) Z/ j) a: i, L% [于是我不断运行 ./coin addblock -data “Pay 0.313 BTC for a coffee” 发现文件大小是增加的,说明添加数据是没问题4 @! X- d8 v& P* y
& G8 u! H& g9 j0 v4 |: c
就是打印问题。
- S" v9 R$ T+ m6 G( x# x9 O( G; K' U" v3 M, f
问题还没解决,明天再说吧。
& X' C( p, F4 `( o+ M* [2 S+ P
. a2 n1 V) n  h语法
- r, |) l7 Q8 I4 |' b; S! W) @9 n! d$ Z; t
GO语言真的很强大,包管理直接依托github.com,一个包就是一个文件夹,文件夹里面直接就是代码。' E+ y* U8 H5 u- R9 O$ n; r
! C$ @. h( w6 ^# o9 u4 t- c7 a, y
bytes.Join()和genesis.Serialize()的区别?
; [3 y; Z" p( G
& P8 v$ P: `4 e[]byte转换为string:hex.EncodeToString(block.Hash[:]) -> %s
& @" ~1 H1 ]: V3 J& ]# X" `+ ]- N
* l! h- x( v6 R2 U! O  |, [& gblock.Hash -> %x
- C' z% K7 m. E- b' @
2 V: Y/ [1 B' ~9 b; i0 C第一次用:=,之后不需要冒号:了" D' Z) ~4 w- y' d6 u, r, f/ J( a

8 V& C6 m" ?1 R' t# a; O0 f/ _3 U  Zdefer bc.Db.Close()表示函数结束后再次执行这个语句。
. b' D% r4 q, r! V" k( ~
. Y9 ?3 `/ W" p$ @6 v" U+ H, c$ K成员函数都用小写开头。( a+ I: L) C& M+ ^- d& G" A- B' y

( ^" ]9 g* d! D& z- P成员数据都用大写开头。* a+ d& f4 W# {! W
( V8 I5 x7 i, N1 S0 M5 X
strconf.FormatBool(pow.Validate())& r4 T0 D  X# t) v, S' O8 t

9 n2 k8 g$ J: L' B2 i' k9 `9 Afor {}
/ l1 l1 c0 b& V2 ]$ F/ E) t% k* d7 n; g7 g9 g0 x% K  O
cli := core.CLI{注意结构体初始化是花括号} b2459e54cea7c4e8a6a8f7bc11eb81b65ed50fbb
2 L, _& T' }6 [, k  {) y9 }3 A" z1 ]7 b5 n
技巧
0 F) Q" @9 z& q6 P
& }* n. e% h+ Q: I; G2 }' [9 {复制仓库全路径https://github.com/boltdb/bolt,GoLand会自动询问是否安装。8 P) e, P$ F6 _( s. f" t2 l
  B4 L3 d6 O& `. E1 A3 f" ?4 x. f7 V
相当于执行 go get -t github.com/boltdb/bolt,安装的库在当前项目的src/github.com/boltdb/bolt下面,不会被git识别。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

jayquan 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1