Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

工作量证明实现代码笔记

jayquan
101 0 0
发币是什么意思?# @5 |$ ?$ f+ a
( C) q. b& S% a9 w
问题一:区块链是在内存上的,现在要搬到本地数据库/文件存储5 z: a; m& o$ D1 ^
% w- K$ p( L7 _: D
改进方法:引入特殊的存储机制( W. l. f$ e% U( n+ v' f
* T2 k3 v+ O& y# |1 h9 B7 i1 J
报错了,搞不明白,明明一模一样的,错误截图如下:
+ ~0 f1 c0 Q, V& g2 j6 u8 L& ^' D% j
8 S$ i- g6 R( L  s+ R$ C7 N哈哈,通过在bolt库路径下搜Update找到用例了,发现是语法错了,这里是匿名函数啊!4 f1 ~3 l: h' R% b" A/ y( P- E. i

( f* O/ j% e8 ?5 ~. N* Z) _一个block区块里面可以有多笔交易是什么意思?% i8 O  i7 i( O( k. n6 [

! {' [0 I' k  a8 k, `合约和区块链什么关系?
* j3 @8 s4 i( w- A6 i2 h& @3 h
% m7 T; B# s- x4 t, @完成数据库替换内存数据 f383d000df2c68b875f5cdbc233fb2ee20facd78
9 U8 z: i5 F0 K9 N, x& t: j
9 d# _! R3 C+ D/ g但是数据库内容还不知道对不对。
3 {1 g; C9 V# ]0 c0 q' k9 y9 x4 a1 s" ?) i$ j8 g
问题二:main函数太不优雅了,不灵活
+ o6 _3 U2 Y8 s$ b0 Y3 E
8 j2 d) N0 t0 ]( A8 E8 c把交易记录写入区块放到命令行做。- Z" n" L% }. c& ]* N' ?  ~( I
" a4 z3 y- a: Q$ E. D
交易记录和区块是什么关系?
" k8 U" ~! Q% p+ Y) n
7 A4 a2 d( z- z- L; K! H; \难道没次发生交易就要创建区块,那不是太麻烦了?7 {4 X' U. J% Y7 V1 ~) f
* M- Z. O- O8 i
main函数操作部分交给CLI执行 3521b35776fcad749fa8830494e68b6a50d5be3b$ o! D0 z" e( k# E; ^0 @) z

; l( ?: X8 @2 i& \CLI可以理解为一个类,先是初始化/构造函数,然后就是和数据相关的操作了。# ^4 E5 X  \2 z6 n( M

6 r* s  a" y$ b* e定义CLI结构体 0c64883897b70aa42ffc6582e3350a4971ead5b83 D" Q# B  ?2 m& g0 ?  K  A
! n; l6 v; v. y; B# N; r4 u
func (cli *CLI) printUsage() 1383575d21e1c8c9dcd57f753877829835e0e155
1 ?6 C1 [/ e" c' r# D4 k3 m' K7 a# n# k; c2 ?( P. D
验证参数 6611b9309378d50ee40ca0c684fe400b0605a4a7
  e6 n8 I( l: V! y; N5 v# d
8 U7 ]9 x" s1 `8 q0 U4 C3 n" t添加新区块到区块链 c59a70a888b3d572245668f89beed2672f273d62. P! b( K- V* e. {& k

  {" U) r$ {6 q4 S3 z1 j这些方法又都是供Run()选择调用的
$ Y1 ~2 R2 w- s; U% q  ]5 n, f9 T; `# F& K1 W' o: [
添加blockchain的迭代器,并配置Next方法 5c024d134cbbc60c4cc9ed87a9a980734d8dc54d
' ]) B3 t( `2 \, r) p. `
) z$ a; S2 i. m% T$ H测试命令如下,此时的版本是 297618742b808e0b759a3481cf454dbfaa5f1f99
7 R0 ?3 O9 o$ h9 a4 O8 Y5 c9 h/ {  [1 i; ]/ a& w
./coin' c6 Q* P- S9 b  b' ^

5 ~' W- Q+ R4 M! u2 Z7 X" |./coin addblock -data “Pay 0.313 BTC for a coffee” 区块链被存储到本地数据库了
( A8 @3 o* X! a5 ^8 I( Z( `* r. G
( i" A  ~1 ^, h6 }$ G, _2 N./coin printchain/ B" I) b1 K1 H/ k

: U/ R% X0 O; u3 ^1 Z! {效果截图如下:
7 `3 R+ Y. A" {5 Z( s0 q7 j5 [& w# m0 R! ^) b0 k* x; _. t
但是打印后发现只有创世区块,不知道是存储问题还是打印问题?# @, p7 H: x5 l: E- A% O$ M  g

6 Y4 a% X9 j0 r9 s4 ^, y0 ?/ j于是我不断运行 ./coin addblock -data “Pay 0.313 BTC for a coffee” 发现文件大小是增加的,说明添加数据是没问题) z. v" c3 e9 N6 T5 k9 T1 ^
5 Q  K3 @: v1 B( q" d
就是打印问题。1 H, d/ c7 f! H: r

6 y0 _' \4 K8 Z! g( g问题还没解决,明天再说吧。7 c5 S5 m% I! q2 }2 @8 @

4 t! R4 f) H- ?/ x* k8 p1 d; ]语法, _3 ]" v1 T' Q
$ t" C7 b& ^- P3 ^( M
GO语言真的很强大,包管理直接依托github.com,一个包就是一个文件夹,文件夹里面直接就是代码。5 a/ X* _. `( _
4 i5 ~9 [% z0 Q7 D! T% {6 L1 M
bytes.Join()和genesis.Serialize()的区别?& D. f* `  T! g* }
2 m, [0 D  t9 X
[]byte转换为string:hex.EncodeToString(block.Hash[:]) -> %s% e# ?& t8 J& a5 R& j8 `

0 v& {+ E6 N  f; G! h" m; ^$ sblock.Hash -> %x0 q! ?' E1 K& I" T/ R

5 x8 S: A, w) R, N' E第一次用:=,之后不需要冒号:了
0 l* @$ G, d2 F3 F$ N5 ~* C# q8 b" G7 l" l" O$ f
defer bc.Db.Close()表示函数结束后再次执行这个语句。
+ v5 u% r* [. _1 M% s. ]5 u2 D& W( }# U' R! V+ U% I5 m* r5 f
成员函数都用小写开头。% c/ J; y% k4 M" {' k4 e4 G

( c6 ?' C  F' e; m  r9 b/ Q成员数据都用大写开头。
: J/ K4 C5 ^( K' d- S; G4 X0 R, P9 l
, p+ M7 k: K6 [  v+ @( bstrconf.FormatBool(pow.Validate())
$ |0 g  V4 f( H( ^7 q/ w) ^
8 y. @' L' A* ?* a  afor {}% S) ^, Q4 V+ k5 z/ n

6 `9 {8 F9 ~% `cli := core.CLI{注意结构体初始化是花括号} b2459e54cea7c4e8a6a8f7bc11eb81b65ed50fbb
9 c. R" U/ x; i3 \. y. H
/ q- A4 r5 Z$ }% c技巧
: _; n) F% F& X6 R; q& O7 n; [: v. F8 \9 p3 f9 V- |4 [
复制仓库全路径https://github.com/boltdb/bolt,GoLand会自动询问是否安装。
+ }% s0 v2 `1 f* O% L# W
1 \( u) T! j+ j2 K4 ~( p/ p0 s相当于执行 go get -t github.com/boltdb/bolt,安装的库在当前项目的src/github.com/boltdb/bolt下面,不会被git识别。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

jayquan 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1