之前学习了隔离见证,这篇主要介绍下生成区块的流程,中间会有部分前面提到的函数。 generatetoaddress(mining.cpp) 是 cli 用来给特定地址生成区块的命令,从这个函数开始。 其中的 DecodeDestination(key_io.cpp) 之前在看隔离见证的时候,讲过后面部分,下面看下前面部分: 得到地址之后,函数里生成了 scriptPubkey,...
比特币源码学习-区块验证
之前学习了区块头验证 和 默克尔树,在区块的验证里都会用到,现在就来看看区块的验证。 从 CheckBlock 函数(validation.cpp)开始: 除了之前看过的区块头和默克尔根的验证,这里还涉及到两个函数,分别看下: CheckTransaction(tx_verify.cpp): GetLegacySigOpCount(tx_verify.cpp): 这...
比特币源码学习-默克尔树
之前学习了区块头验证,今天开始看区块验证,在看到默克尔根验证的地方,代码注释的地方记录了之前的一个缺陷,挺有意思,就先学习下默克尔树,随便说下这个缺陷。 默克尔树相关代码都在 merkle.cpp 中,BlockMerkleRoot 和 BlockWitnessMerkleRoot 是两个入口函数。 在看 ComputeMerkleRoot 之前,先看下这个函数前的大篇幅注释: ...
比特币源码学习-区块头验证
最近开始看比特币的源码(版本 0.17),会逐渐更新一些文章。 这篇学习下“验证区块头”的流程。 从 ProcessNewBlockHeaders(validation.cpp)开始: 下面是 AcceptBlockHeader (validation.cpp)函数: 这里面主要有两个函数: CheckBlockHeader ,根据当前区块头提供的信息,检查这个区...
跨链交易-BTC_relay
最近在公司做钱包的项目,产品已接近落地,基于 TEE 和 SE 的,主打安全性。 前几天去和一家做 REE 钱包的公司谈合作,这家公司主打的是跨链交易,很感兴趣。 之前也听说过跨链交易,但是了解不多,这几天就多学习了下。 BTC_relay 是其中一种,在看到 BTC_relay 之前,我也在想如何实现跨链交易,我觉得有几点是必须的: 为了解决互相不信任的问题,要有公正的第三方...
比特币命令行
bitcoin-cli 或者 bitcoin core wallet 的 console,支持很多命令,可以获得区块链相关的很多信息,一步步实验和解析下命令的输出。 完整的命令列表 getwalletinfo 获取钱包相关的一些信息。 { "walletname": "wallet.dat", "walletversion": 159900, "balance": 0.0...
RLP和VarInt
在区块链的世界里,一方面由于是分布式存储,一样的数据存储在所有的节点里,如果数据中包含无用的字节,那么在所有节点中浪费的总量就很客观,另一方面虽然数字货币的交易速率都不高,但是至少也有每秒几笔(比特币)到几十笔(以太坊),如果每笔交易中都包含一定的无用字节,那么时间长了,就会浪费掉非常大的空间。 所以在比特币和以太坊中都有一些为了减少浪费而做的设计。 比特币 VarInt VarInt...
比特币-交易体
这次学习下比特币交易体,主要包括交易体的数据结构、签名的几种类型和分别是如何产生的。 本人知识有限,如有错误和疏漏,请务必指正,多谢。 前言 交易体位于区块体内,一个区块体内包含很多笔交易,每笔交易都是一个交易体。 为什么想要介绍下交易体的结构呢,有两个方面的原因: 交易体内包含签名,而签名的流程是 TEE 钱包需要保护的内容,有的客户需要我们将整个交易体的打包都放到 TA ...
比特币以太坊白皮书
之前对比特币和以太坊已经有一些了解,这次重新再看一遍白皮书,主要记录一些以前忽略或者理解不是很深的知识。 本人知识有限,如有错误和疏漏,请务必指正,多谢。 比特币白皮书 1. 默克尔树 默克尔树除了比特币、以太坊上的应用,在其他大多数的 P2P 分布式应用中都可见身影,其核心就是将大量数据进行 hash 后增加其分布式索引性能,通过维持一个较小的高效索引进而管理复杂的大量数据(引用自...
比特币-钱包备份和恢复
这篇学习下钱包备份和恢复相关的知识。 本人知识有限,如有错误和疏漏,请务必指正,多谢。 前言 之前 HD 钱包的文章介绍过钱包密钥的派生过程,主密钥(包括链码)是由熵、助记词、种子一步步推导出来的,而子密钥都是根据主密钥确定性派生出来的,所谓确定性就是说只要提供子密钥的路径,无论派生多少次,派生出来的密钥都是一样的。 那么其实对于用户来说,只要保留好熵、助记词、种子、主密钥(包括链码...