Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Bitcoin Core同步全节点时,会把比特币诞生至今的完整区块链账本全部下载回来,然后独立、完整地校验一遍账本的内容。- A5 g  |5 Z; z4 ?) j! U$ E# b
从创世区块至今的区块链账本,很显然是很庞大的,我刚刚看了一眼,现在已经攒到342GiB了,其中纯区块文件(blkXXXXX.dat)占300GiB。0 X" e. f' m: ]+ H& F, I; B" q

# [" ?& K' e( F但是,“区块链账本体积庞大”并不是全节点同步慢的唯一原因。! V! W- r& J, _% z' h+ [/ c
9 R- S  A4 y+ T0 i0 k7 c) O

$ H! ~  g0 C+ h0 b9 ~! s8 f比特币的区块链账本,实际上只登记了“交易记录”,并没有登记“账户余额状态”。UTXO集合实质上就是“账户余额状态”,它是每一个全节点在从头验证账本时自己独立捋出来的。
+ ?6 G! J, h9 u+ J) Q: _(虽然比特币开发者很多年前就提出过UTXO commitment,但是时至今日也并没有付诸实践)
! y0 _0 ~) C& M2 i4 U同步过程,其实就是在根据区块链账本的内容,对UTXO集合数据库进行查询和增删。UTXO数据库保存在chainstate目录里,它会承受大量的随机读写,对机械硬盘HDD)来说压力山大。这就是为什么用机械硬盘同步全节点速度非常慢,完全同步一次可能需要好几天甚至一个星期。' u" L2 G/ K+ B+ \; Z
; h; o. f* C$ k1 ^% w7 x
我的电脑既有固态硬盘(SSD),又有机械硬盘(HDD)。% A/ c4 s- D& F, L

( _' }1 L1 n6 ?9 j: U5 X
; M: ?" u/ \1 a0 s6 C( @HDD容量大,随机读写慢到令人发指;但是它便宜大碗,容量大,顺序读写性能也不太差。
/ B( p# s3 M3 s  Y2 W1 I( X) Y
6 p% J5 E* |. B3 C
' `5 `+ e8 f* b5 iSSD随机读写性能完全秒杀机械硬盘,差了几个数量级;但是固态硬盘相对容量小、价格贵。
3 _4 ^! U9 J# B9 T5 [; S% X6 m! m
! u/ z0 ^) A3 T8 i6 n如果你也是既有HDD,又有SSD,就可以让HDD和SSD互相取长补短了:
1 o6 B! Z2 H' m9 }  }被高频随机读写、但占用空间不大的chainstate(UTXO集合数据库),放在SSD;占用空间极大,绝大多数时候顺序读写,而且下载完、验证过一次后就极少再次被读取的blocks(区块文件)等,就放在HDD' }7 [( p! K6 {, X; Q& z3 W* e
2 j/ J' C3 N( E1 b+ l9 c* B  v# J

, I4 a7 f: p- X3 w. s6 ^这里也要提一下,为什么不推荐启用区块修剪prune)呢?
' o: {2 J/ Z* O, ]) y

3 r5 N; d" h6 e( c0 D1 i; i" K% t% b8 R8 z
因为,启用修剪后,钱包的功能将大大受限,导入私钥/地址/钱包时,无法扫描历史区块,也就无法找回交易记录和历史。必须有完整的历史区块,才能完成扫描。4 j5 `5 M1 z4 E
区块修剪,实际上和白皮书上的描述无关,就是直接删掉老区块文件。在验证区块链账本的过程中,只需要查询UTXO集合,并不需要回溯读取老区块文件,所以一个区块捋过一遍后就用不着了,删掉也不会影响验证工作继续进行。) d1 \. L* d7 y% F
6 u8 C$ t' B6 f% F
对于新创建的钱包,或者同步开始之前就已经加载的钱包来说,验证区块同时也在扫描区块内容、找出和钱包有关的交易,从而找回交易记录和最终余额;
. K8 G/ O4 z) ^9 v! o# A但是如果是后来导入的钱包,就需要回过头去扫描历史区块了,这个时候很显然不能无米之炊。" ]3 ~% L  T1 x% a, E' A

. }$ D+ q6 |# B% A  a很显然扫描历史区块是个很笨,也慢到令人发指的办法。但是如果要达到秒速查询出结果,就需要占用更多硬盘空间来建立索引——Bitcoin Core自身是不包含这么多功能的,只有ElectrumX、Esplora等轻钱包服务器软件、区块浏览器软件才含有这些建立完善索引的功能。& n' v, d: b* S! H& S7 h
" ~7 k- {$ [. `+ G2 r# P! }! |- J
未来Bitcoin Core也应该会利用Neutrino轻钱包协议(BIP157/158)来达到一个折衷的效果:用多占几GB硬盘空间的代价,换来几分钟就可以扫完整条区块链账本的快速扫描。虽然还是远远达不到查询秒速返回结果,但是也不需要大量占用硬盘空间,可以说是一个很好的平衡。现在Bitcoin Core已经支持生成Neutrino的“区块过滤器索引”(block filter index)并支持作为服务端给Neutrino轻钱包提供服务,未来应该可以让全节点自带的钱包自己也享受到这个好处。4 [" t* l% ?7 m# b
4 T% Z3 w8 [; t0 V% \* Y2 k8 ~
之前楼主就折腾过用NTFS Junction,来把chainstate目录转移到SSD。楼主比较火星,其实很早以前(应该是从0.17开始)Bitcoin Core自身就有了blocksdir这个配置参数,这样就不用折腾NTFS Junction了。/ H% Z$ W6 }/ E4 F

' n! b& {% P$ |9 Y( B; Q! A啰嗦那么多,下面就说怎么迁移过去。8 K; f9 n8 B5 d8 t3 n6 _
( e! W6 F) ~$ n, h' ]& D5 H) C
首先,如果你还不知道全节点的数据目录在哪,那就先打开调试窗口或节点窗口,调到“信息”这一页,记下数据目录路径。然后,把Bitcoin Core正常关闭,当然,一定要等他完全收拾好。$ Y& B' [; C- O  N" k% Z6 C9 q& k
) l! I; c( b3 J/ p: N& m6 O
如果Bitcoin Core比0.17版还旧,先升级,至少升级到0.17.0.1。升级完后先启动Bitcoin Core,可能会有一个转换过程,转完了再正常关闭。
" {% p. Y' W: D# {0 ~7 l6 f5 B: C) h3 _, f, ~4 v
打开钱包数据目录,把blocks目录移动出去。) I/ R6 U" x# j
比如钱包数据目录是D:\Bitcoin,原先blocks目录的位置是D:\Bitcoin\blocks,现在把blocks目录移动到D:\BitcoinBlocks\blocks。
) C% t% |0 q( _* v7 W) B$ J因为这是在同一个盘内移动,不需要复制文件内容数据,所以应该是瞬间完成的。
$ V5 x: f  y3 m8 |0 L  ^" k. Y7 [: q4 Z' Y
移动完后,把原先在HDD(D盘)上的数据目录移动到SSD(S盘)上,比如从D:\Bitcoin移动到S:\Bitcoin。因为最大的区块数据已经不在里面了,所以要复制的数据量只有几GB,移动应该很快,最多几十秒就能完成。& e' ]8 b8 r2 n1 z

# u; t* K& g  V3 y8 y注意blocks目录里应该会有一个index目录,先在位于SSD的新的钱包数据目录里新建一个文件夹blocks,然后把index也移动到新的blocks目录里。
1 z5 {& E# T. B6 `% m, N比如,如果之前已经把区块数据移动到D:\BitcoinBlocks\blocks,那打开D:\BitcoinBlocks\blocks后就会发现里面还有一个index目录(D:\BitcoinBlocks\blocks\index),把它也移动到SSD即可(移动到S:\Bitcoin\blocks\index)5 \3 k/ }& E/ q1 I
3 ?0 p& j1 _+ m9 L
修改开始菜单里Bitcoin Core快捷方式的属性,加入启动参数,改成类似这样:% V+ x* ^- _% G! P+ }: y" \
"C:\Program Files\Bitcoin\bitcoin-qt.exe" -blocksdir="D:\BitcoinBlocks" -datadir="S:\Bitcoin"1 [% e% V% O) }+ e' O
其中,-blocksdir指定了区块存储是在HDD上,-datadir指定了数据目录(包含chainstate目录)在SSD上。
1 W& U& Z! t" S' O" V5 r9 H4 V不过,(这也是之前的帖子我没考虑到的)我不太推荐修改快捷方式这个办法,因为未来升级Bitcoin Core的时候,安装向导可能会重建快捷方式,然后这里的启动参数就都没了,会回到默认状态。
: v0 J9 {& T3 F( J6 e) Q  S, O& V- H/ h) x8 W4 M7 G; J2 I! ^* }. @, a
或者,除了修改快捷方式,还可以修改bitcoin.conf配置文件(直接用记事本,别启动Bitcoin Core!),加入这一条:/ a0 C; K; o! @) r
blocksdir=D:\BitcoinBlocks
) T8 d- x- X4 h, p) D(如果配置文件同时包括测试网和主网的配置信息,注意[main]下面是主网的配置;[test]下面是测试网的配置;[regtest]则不是测试网,而是跑在本地的“回归测试模式”的配置)- g: c7 B. d5 Z- Z- f* v! V8 c
这样就把区块存储目录指向了HDD。
% o- v  d  u6 B9 d+ Q) z4 U$ z5 T9 Q# S# @+ o! Z5 c- B: V
然后WIN+R输入regedit,确定,打开注册表编辑器,定位到HKEY_CURRENT_USER\SOFTWARE\Bitcoin\Bitcoin-Qt,把字符串值strDataDir的数值修改为:
: }, d9 C( w: eS:\Bitcoin
) x! P3 o" w1 f" u这样就把数据目录指向了SSD。: `. _" _0 ]  l+ Z# J. W- W- o
哎……之前真是糗大了,我居然在帖子里忘记写数据目录的事情,其实我自己操作时很显然是绕不过这一步的,我当时也这么用了好久了。如果忘记修改数据目录的位置,很容易就会导致之前下载好的blk00000.dat等区块文件被覆盖破坏掉,然后就是悲催地需要从头重新同步。对此我也脑补过一个补救办法,但是后来尝试发现这个补救办法其实并不怎么靠谱。* t+ d4 d$ W3 H3 r" M  `* i
8 n, {; P0 L- o! m8 Y' M6 e! P
搞定了,现在可以启动Bitcoin Core全节点了。( v8 z  L% [$ Q, t! c
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

温室小书生室d 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13