比特币精通比特币整理.docx
- 文档编号:11224199
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:20
- 大小:2.22MB
比特币精通比特币整理.docx
《比特币精通比特币整理.docx》由会员分享,可在线阅读,更多相关《比特币精通比特币整理.docx(20页珍藏版)》请在冰豆网上搜索。
比特币精通比特币整理
第四章密钥、地址、钱包
公钥加密算法:
椭圆曲线乘法
1.密钥对
包括一个私钥,和由其衍生出的唯一的公钥。
公钥用于接收比特币,私钥用于比特币支付时的交易签名。
私钥可用于生成数字签名,此签名可以在不泄露私钥的同时对公钥进行验证。
交易时提交公钥和签名(每次交易的签名都不同),比特币网络通过提交的公钥和签名进行验证。
2.私钥
256位二进制数字,64位十六进制
从编程的角度,可在一个密码学安全的随机源中取出一长串随机字节,对其使用SHA256哈希算法。
bitcoindgetnewaddress——生成一个新的私钥(以公钥显示)
dumpprivkey
格式:
不同的格式彼此之间很容易地相互转换。
压缩格式私钥:
WIF压缩格式导出,私钥加后缀01,表明只能被用来生成压缩的公钥。
Base58Check编码格式的私钥下,WIF压缩格式以K或L为前缀,WIF格式以5为前缀。
3.公钥
K=k*G,k和K之间的关系固定,只能单向运算。
将G相加k次,在椭圆曲线中,点的相加等同于从该点画切线找到与曲线相交的另一点,然后映射到x轴。
K=(x,y)
格式:
非压缩格式:
04xy,8+256+256=520bit
压缩格式:
02x或03x,264bit
4.比特币地址:
公钥生成1开头,160bit,20字节
A=RIPEMD160(SHA256(K))
Base58Check编码:
增加了错误校验码,添加版本前缀后哈希取前四个字节
5.比特币钱包
确定性(种子)钱包:
包含通过使用单项离散方程而可从公共的种子生成的私钥。
种子是随机生成的数字,这个数字也含有索引号码或者可生成私钥的“链码”。
使用私钥抻拉函数PBKDF2来导出更长的(512位)的种子。
分层确定性钱包:
母公共钥匙—链码—以及索引号合并在一起,用HMAC-SHA512方程散列之后可以产生512位的散列。
所得的散列被拆分为两部分,右半部分256位给子链当链码,左半部分256位散列以及索引码被加载在母私钥上来衍生子私钥。
输入量:
密钥、链码以及想要的子密钥的索引。
扩展密钥:
密钥和链码的结合,256位密钥和256位链码所并联的512位序列。
两种扩展密钥,私钥和链码的结合,可被用来衍生子私钥;公共钥匙和链码的结合,可用来扩展子公共钥匙。
512或者513位,前缀“xprv”和“xpub”。
两种去衍生子公共钥匙的方法:
或者通过子私钥,或者直接通过母公共钥匙。
硬化子密钥的衍生:
硬化衍生方程使用母私钥去推子链码,而不是母公共钥匙。
HD钱包中的密钥是用“路径”命名的:
HD钱包树状结构的导航:
6.高级密钥和地址
加密密钥:
WIF和base58chek编码过的比特币私钥,字符串的前缀为“5”,BIP0038提出使用一个口令加密私钥并使用Base58Check对加密的私钥进行编码,加密方案的结果是一个由base58check编码过的加密私钥,前缀为6P。
P2PKH:
传统的比特币地址,以数字1开头,来源于公钥。
任何人都可以将比特币发送到该地址,但只能通过相应的私钥签名和公钥哈希值后,比特币才能消费。
P2SH:
以数字3开头的比特币地址是P2SH地址,该地址与一个脚本相对应而非一个公钥相对应,多重签名地址脚本。
编码一个P2SH地址涉及使用一个在创建比特币地址用到过的双重哈希函数,并且只能应用在脚本而不是公钥:
比特币靓号地址:
尝试一个随机密钥,检查结果地址是否和所需的图案相匹配,重复这个过程直到成功找到为止。
安全性。
纸钱包:
bitaddress.org。
密钥只存在纸张上而从未存储在在线系统上的纸钱包。
第五章交易
创建+签名:
比特币交易指定以往的一笔交易作为其资金来源,创建就会被资金所有者(们)签名。
该笔交易经过签名且不含任何机密信息、私钥或密码。
广播至比特币网络:
比特币将金钱变成了一种数据结构。
发送者能使用多于一个比特币节点来确保这笔交易被传播,因此不需要信任用来传播该笔交易的单一节点。
传播:
节点验证。
比特币网络——点对点网络。
每一个节点在传播每一笔交易之前均进行独立验证。
交易结构:
一个含有输入值和输出值的数据结构。
该数据结构植入了将一笔资金从初始点(输入值)转移至目标地址(输出值)的代码信息。
交易:
UTXO——未经使用的一个交易输出。
不存在储存比特币地址或账户余额的地点,只有被所有者锁住的、分散的UTXO,分散在数百个交易和数百个区块中。
用户的余额是比特币钱包通过扫描区块链得到的所有属于该用户的UTXO的聚合。
一笔比特币交易通过使用所有者的签名来解锁UTXO,并通过使用新的所有者的比特币地址来锁定并创建UTXO。
特殊的交易类型,Coinbase。
UTXO被每一个全节点比特币客户端在一个储存于内存中的数据库所追踪,该数据库也被称为“UTXO集”或者“UTXO池”。
交易输出:
每一笔比特币交易创造输出。
交易输出包括1.一定量的比特币;2.锁定脚本(锁定脚本会把输出锁在一个特定的比特币地址上,包含相应私钥的解锁脚可以用来解锁输出)。
交易输入:
交易输入是指向UTXO的指针。
一旦UTXO被选中(例如贪心算法),钱包会为每个UTXO生成包含签名的解锁脚本,钱包把这些UTXO作为参考,并且连同解锁脚本一起作为输入加到交易中。
交易费:
基于交易的尺寸,千字节来计算,尽力而为的原则,与参加交易的比特币值无关。
交易费被作为输入减输出的余量。
如果构造自己的交易,必须创造找零,非则包含在交易中作为交易费。
孤立交易池:
没有父交易的交易池。
交易脚本和脚本语言:
锁定脚本被写入UTXO,同时它包含一个用同种脚本语言编写的签名。
交易验证引擎依赖于两类脚本,一个锁定脚本(脚本公钥代码)和一个解锁脚本(ScriptSig),两个脚本随着堆栈的传递被分别执行。
脚本创建:
任何解锁和锁定脚本的组合如果结果为真,即为任何非零值或脚本执行后堆栈为空情形,则为有效。
五种标准交易脚本,Standard()函数查看限制
P2PKH(PaytoPublicKeyHash):
向公钥哈希(比特币地址)进行一笔支付。
由P2PKH脚本锁定的输出可以通过键入公钥和由相应私钥的数字签名得以解锁。
组合脚本:
CHECKSIG操作符核查签名sig是否与公钥PubK匹配。
P2PK(PaytoPublicKey):
P2PK目前在Coinbase交易中最为常见,公钥本身存储在锁定脚本中,代码长度更短。
该脚本只是CHECKSIG操作符的简单调用,验证签名是否正确。
MS(多重签名):
锁定脚本可由含有签名和公钥的脚本或者3个存档公钥中的任意2个相一致的私钥签名组合予以解锁。
OP_Return操作符(数据输出):
OP_Return允许开发者在交易输出上增加40字节的非交易数据,一种明确的可复查的非交易型输出,无需存储于UTXO集,输出被记录在区块链上,会消耗磁盘空间,也会导致区块链规模的增加,但不存储在UTXO集中,不会使UTXO内存膨胀。
data部分被限制为40字节,且多以哈希方式呈现,如32字节的SHA256算法输出。
P2SH(PaytoScriptHash):
多重签名的锁定脚本非常长,旨在使复杂脚本的运用能与直接向比特币地址支付一样简单,复杂的锁定脚本被电子指纹(哈希)所取代。
P2SH的含义是,向含该哈希的脚本支付,当输出被支付时,该脚本将在后续呈现。
Redeem赎回脚本(花费该笔支出条件的复杂脚本),在锁定脚本中不出现。
在锁定脚本中,只出现了哈希,而赎回脚本则在稍后输出被支付时才作为解锁脚本的一部分而出现。
锁定脚本将输出与哈希关联,而不与特别长的脚本关联。
想要花费这笔UTXO时,附上赎回脚本(与UTXO锁定的哈希)和必要的解锁签名即可。
两个脚本经由两步实现组合。
首先,将赎回脚本与锁定脚本比对以确认其与哈希是否匹配:
假如赎回脚本与哈希匹配,解锁脚本会被执行以释放赎回脚本:
P2SH地址:
Base58编码地址以3开头,该地址与一个脚本相对应而非与一个公钥相对应。
第六章比特币网络
除了比特币P2P协议之外,比特币网络中也包含其他协议:
矿池挖矿协议、Stratum
协议以及其他连接比特币系统组件的相关协议(特殊矿池挖矿协议、轻量级客户端访问协议)。
节点:
每个比特币节点都是路由、区块链数据库、挖矿、钱包服务的功能集合。
功能:
全网络的路由功能(每个节点都参与)、全节点区块链数据库功能、挖矿功能、钱包功能。
完整区块节点通过比特币网络获取包含交易信息的新区块更新,在验证无误后将此更新合并至本地的区块链拷贝之中。
同步\重建区块链:
从静态植入在客户端软件中的创世区块开始,发送version消息(含有的BestHeight字段标示了节点的当前区块链高度),对等节点交换getblocks消息(包含本地区块链顶端区块的哈希值),拥有更长区块链的对等节点可以识别哪些节点需要“补充”,通过inventory消息把可供分享的500个区块的哈希值传播出去,缺少这些区块的节点通过各自发送的getdata消息,结合inventory消息中的哈希值,来确认是否为正确的被请求区块,从而读取这些区块。
比特币主网络(运行P2P协议)大约由7000-10000个运行着不同版本比特币核心客户端的监听节点、以及几百个运行着各类比特币P2P协议的应用的节点组成。
既包括了运行比特币P2P协议的网络,又包含运行特殊协议的网络节点。
挖矿节点:
竞争挖矿、验证交易、并创建新的区块。
核心客户端:
具有区块链的完整拷贝及网络节点,不具备挖矿及钱包功能。
这些节点是网络中的边缘路由器,通过它们可以搭建其他服务,例如交易所、钱包、区块浏览器、商家支付处理等。
矿池协议服务器&轻量SPVStratum钱包:
比特币P2P主网络上连接着许多矿池服务器以及协议网关,它们把运行其他协议的节点连接起来。
这些节点通常都是矿池挖矿节点以及轻量级钱包客户端,它们通常不具备区块链的完整备份。
网络发现:
节点通常采用TCP协议、使用8333端口与已知的对等节点建立连接。
该节点会发送一条包含基本认证内容的version消息开始“握手”通信。
节点启动时只需要一个连接。
getpeerinfo命令列出对等节点连接信息。
version:
种子节点:
长期稳定运行的节点,-dnsseed
简易支付验证(SPV)节点:
SPV节点只需下载区块头,产生不含交易信息的区块链。
不知道网络上所有交易的完整信息,不能构建所有可用于消费的UTXO的全貌。
完整的区块链节点是通过检查整个链中在它之下的数千个区块来保证这个UTXO没有被支付,从而验证交易。
而SPV节点是通过检查在其上面的区块将它压在下面的深度来验证交易。
SPV节点使用getheaders消息来获得区块头,对等节点使用headers消息发送多达2000个区块头,同时在与对等节点的连接上设置过滤器,用以过滤发来的未来区块和交易数据流,使用getdata请求来读取目标交易,对等节点生成一条包含交易信息的tx消息作为响应。
Bloom过滤器:
解决SPV节点的隐私风险问题(向对等节点发送交易信息查询请求)。
用来过滤SPV节点从对等节点收到的交易信息,只与SPV节点钱包里的地址匹配。
Bloom过滤器可以让SPV节点指定交易的搜索模式。
filterload:
建立滤波器,getdata:
SPV节点得到(对等节点发出)与滤波器匹配的区块的区块头信息,以及相匹配的merkle树,filteradd:
增加关键词,filterclear:
清除整个过滤器。
正匹配代表“可能是”,负匹配代表“一定不是”。
过程:
SPV节点会初始化一个不会匹配任何关键词的“空白”Bloom过滤器。
接下来,SPV节点会创建一个包含钱包中所有地址信息的列表,并创建一个与每个地址相对应的交易输出相匹配的搜索模式。
通常,这种搜索模式是一个向公钥付款的哈希脚本,该脚本是一个会出现在每一个向公钥哈希地址(比特币地址)付款的交易中的锁定脚本。
然后,SPV节点会把每一个搜索模式添加至Bloom过滤器里,这样只要关键词出现在交易中就能够被过滤器识别出来。
最后,对等节点会用收到的Bloom过滤器来匹配传送至SPV节点的交易。
Bloom过滤器的实现:
由一个可变长度(N)的二进制数组和数量可变(M)的一组哈希函数组成(哈希函数输出值在1~N之间)。
准确性和私密性通过改变N和M来调节。
关键词增加时,会指向重复的位,小的数组和有限的哈希函数只能记录有限的关键词从而降低准确性。
交易池:
未确认交易的临时列表,被网络所知晓,但还未被区快链所包含的交易。
孤立交易池。
存储在本地内存中。
UTXO池:
区块链中所有未支付交易输出的集合
警告消息:
警告通过公钥加密签名,对应私钥由核心开发团队所有。
alertnotify命令。
第七章区块链
识别区块:
对每个区块头进行SHA256加密哈希,可生成一个哈希值;每一个区块都可以通过其区块头的“父区块哈希值”字段引用前一区块(父区块)。
父区块哈希值与子区块身份标识之间的对应,这种瀑布效应保证区块不会改变,除非强制重新计算该区块所有后续区块,重新计算需要耗费巨大的计算量,所以一个长区块链的存在可以让区块链的历史不可改变。
区块结构:
区块头+区块主体(一长串交易)
区块头:
三组区块元数据:
1.父区块哈希值
2.难度、时间戳、nonce
3.merkle树根
区块标识符:
区块头哈希值和区块高度。
存储在一个索引数据库表中以便快速检索。
创世区块:
每一个节点都“知道”创世区块的哈希值、结构、被创建的时间和里面的一个交易。
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
Merkle树:
被用来归纳一个区块中的所有交易,同时生成整个交易集合的数字指纹,且提供了一种校验区块是否存在某交易的高效途径。
double-SHA256。
HA=SHA256(SHA256(交易TxA))
Merkle根,产生的32字节哈希值存储在区块头,同时归纳了所有交易的所有数据。
成百上千的交易被归纳为一个仅仅32字节的数据作为Merkle根。
证明区块中存在某个特定的交易,一个节点只需要计算
个32字节的哈希值,高效地产生一条10或者12个哈希值(320-384字节)的路径,来证明在一个巨量字节大小的区块中上千交易中的某笔交易的存在。
形成一条从特定交易到树根的认证路径或者Merkle路径,在计算相对应的哈希值和Merkle根即可。
Merkle路径
。
一个节点能够仅下载区块头(80字节/区块),然后通过从一个满节点回溯一条小的Merkle路径就能认证一笔交易的存在(bloom过滤器,Merkleblock消息(包含区块头和Merkle路径),交易于区块的关联,区块与区块链的关联),而不需要存储或者传输大量区块链中大多数内容,证明交易存在于区块链。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 比特 精通 整理