Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

工作量证明实现代码笔记

jayquan
104 0 0
发币是什么意思?
* B8 I* S4 y& j+ ^4 l% e1 O4 h" \) q- R1 g
问题一:区块链是在内存上的,现在要搬到本地数据库/文件存储
- d2 z+ N6 e( \' G7 X
" w" o4 x4 H* `0 e改进方法:引入特殊的存储机制
. O/ j& u- N: c. k* Z, r" V1 N
1 B' _: o! [0 [9 g1 \( A* H6 c7 Q* Q# |报错了,搞不明白,明明一模一样的,错误截图如下:2 h6 s- [5 |: |8 _0 m2 k
# \! X) q8 X1 H/ p4 j
哈哈,通过在bolt库路径下搜Update找到用例了,发现是语法错了,这里是匿名函数啊!+ D0 {% o- q/ s- [

/ ~5 ]' V5 O/ I+ B, I* l) g$ {一个block区块里面可以有多笔交易是什么意思?) t# C. p5 j0 ^0 O
- p) j0 g5 I  u' h" O# k( ?
合约和区块链什么关系?* s$ J3 @) Q3 l  f* X0 K0 [9 C
* g6 i: k' p/ b+ s& a
完成数据库替换内存数据 f383d000df2c68b875f5cdbc233fb2ee20facd78, ~, L: o, q% z

& |8 n& L3 Q+ p% ~' ~" G但是数据库内容还不知道对不对。9 L" I3 M! R" T1 h7 E9 k. ]8 P# k4 z, t
+ M3 c0 d; C% ~, D4 S- ?' b. f& z
问题二:main函数太不优雅了,不灵活! X( o# [7 W0 V
  ?: ~9 _  E+ a: T) x
把交易记录写入区块放到命令行做。' ]: E' E+ r% @% N
& S( p6 y- k" y
交易记录和区块是什么关系?
- `  {2 X5 Q  S- E7 _% F- K9 p8 a/ h  t" s. B. L- r
难道没次发生交易就要创建区块,那不是太麻烦了?
" D' _8 p6 z) @. I# \7 Y& H
/ o5 m- @. l# {3 Rmain函数操作部分交给CLI执行 3521b35776fcad749fa8830494e68b6a50d5be3b0 g5 j' q! S( Y4 p0 P

6 H# L7 a" W  [. Q5 B3 H, G$ f) cCLI可以理解为一个类,先是初始化/构造函数,然后就是和数据相关的操作了。
, q# A  F& n* E( |- I6 A9 Z1 p) ^# e- |2 M
定义CLI结构体 0c64883897b70aa42ffc6582e3350a4971ead5b8
9 z% V% K- J3 J& o
% h! P, G9 ?2 b8 F0 Ffunc (cli *CLI) printUsage() 1383575d21e1c8c9dcd57f753877829835e0e1556 _1 O5 X1 \" z2 _; }
2 C6 i/ |8 C, y9 q3 Z
验证参数 6611b9309378d50ee40ca0c684fe400b0605a4a7! T5 t, h- v) N; j, }$ Y
$ @+ G, `5 ]* j1 W
添加新区块到区块链 c59a70a888b3d572245668f89beed2672f273d62
: ^4 C* C! c; P% y0 z% b" F) s( `: s& y2 q$ \5 Y0 r
这些方法又都是供Run()选择调用的
" v8 L$ `' J8 c/ ?6 O7 o) T1 F! }  i$ _& F+ D% @7 P5 ^9 p9 l/ [+ B
添加blockchain的迭代器,并配置Next方法 5c024d134cbbc60c4cc9ed87a9a980734d8dc54d
& q& g7 A! P, V9 f. J7 u" m8 N- _1 J1 R+ p' n
测试命令如下,此时的版本是 297618742b808e0b759a3481cf454dbfaa5f1f99
# K: f7 g3 u. g7 ^: n
( _9 Q, y5 ?3 S: C( }2 X./coin, t. p$ D5 ?. J" c1 ^6 a# b2 }! _" }

! z8 F( m: L# h; E% h8 x./coin addblock -data “Pay 0.313 BTC for a coffee” 区块链被存储到本地数据库了
5 U3 F/ v* C1 J6 l- M" Z; A7 M3 B' |1 _; Z
./coin printchain
; }1 o- `& l# e3 q
( }7 A$ c4 t- n' @效果截图如下:
; `! ~4 r  e) Y3 S0 Q& E- A1 Z# s8 g6 r
但是打印后发现只有创世区块,不知道是存储问题还是打印问题?" Q, F8 k$ I7 w$ W0 A3 P& c
: H& m) T! r% X  @& d- N# w
于是我不断运行 ./coin addblock -data “Pay 0.313 BTC for a coffee” 发现文件大小是增加的,说明添加数据是没问题
3 m6 U$ l' y( C9 f' [) u, t! y2 d
7 m4 H; P9 T5 l+ j+ k" b6 F% I就是打印问题。0 m3 W9 l4 A$ r! o( J

& ]/ _$ _2 n- {3 e* K5 n问题还没解决,明天再说吧。
* o0 c; C5 B# {, p4 X3 j& c" T* d# K4 s3 ?8 v! V
语法
3 z" [6 h% B4 l. h8 a0 B1 v( `0 d7 E9 {/ B, d; l' i+ ]/ [8 H0 q
GO语言真的很强大,包管理直接依托github.com,一个包就是一个文件夹,文件夹里面直接就是代码。2 p/ w) E5 a* e$ P7 z; g

0 f! }6 |+ J  B1 ebytes.Join()和genesis.Serialize()的区别?
- S! D* @' N. \3 x! Y8 s8 y# ?; Z
" g1 R" F# r0 l/ W% a# \5 V[]byte转换为string:hex.EncodeToString(block.Hash[:]) -> %s; p0 D7 t) I% Q. _6 R* O

  Y. `3 h5 c* o- m) M7 K6 Qblock.Hash -> %x5 n+ C! s0 d* K8 r% B4 `
; Y0 w9 h2 H, O/ k  ^$ X
第一次用:=,之后不需要冒号:了( B, M# e0 h+ Y4 i: e

% s) D* V. h0 c/ u. `% V7 g8 Xdefer bc.Db.Close()表示函数结束后再次执行这个语句。4 Y" ^2 M3 c! T( l" J: ?* X! b. _0 {  [
* E/ q, a& z9 u& z0 E5 S
成员函数都用小写开头。0 c% U9 O  Z4 X3 ~  |
8 y: z4 k% I7 W- `- E$ e
成员数据都用大写开头。
: l5 {' k  g/ b
7 k! o* i( W  a0 ?( Z6 S# S6 x: \strconf.FormatBool(pow.Validate())
, d8 X+ ?% v  ]( h+ E/ m
& y6 t0 ?4 C6 b# }$ lfor {}' A  C7 }) ^( x2 n

- j8 I" n7 Z+ U+ w( ncli := core.CLI{注意结构体初始化是花括号} b2459e54cea7c4e8a6a8f7bc11eb81b65ed50fbb, P: p0 R* c& F3 g3 k! E* _8 o; y4 c
9 g- f) V4 ]* p8 R+ t" o
技巧# N' V# @7 L0 E3 O/ }- [' A8 ~

4 ]" u; S, W( e# W+ D复制仓库全路径https://github.com/boltdb/bolt,GoLand会自动询问是否安装。
+ Z1 e9 ?/ T. c: I/ p
0 B' M/ M' d: o相当于执行 go get -t github.com/boltdb/bolt,安装的库在当前项目的src/github.com/boltdb/bolt下面,不会被git识别。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

jayquan 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1