目录
前言
一、比特币挖矿
1.挖矿设备的演化
2.矿池
二、比特币脚本
1.交易结构
2.交易的输入
3.交易的输出
4.P2PK
输入输出脚本的形式
实际执行情况
5.P2PKH
输入输出脚本的形式
实际执行情况
6.P2SH
输入输出脚本的形式
7.进一步说明
8.多重签名
9.脚本执行
10.Proof of Burn
输入输出脚本的形式
11.销毁原因/应用场景
三、比特币分叉
1.分叉(fork)
2.硬分叉
3.软分叉
四、比特币的匿名性
1.比特币中什么情况下,会破坏匿名性?
2.比特币的匿名性有多好?
3.假设你是一个比特币用户,怎么最大程度提高匿名性?
4.零知识证明
5.同态隐藏例子
五、比特币引发的思考
1.哈希指针
2.区块恋
3.分布式共识
4.量子计算
六、问题-解答
1.转账交易时接受者不在线怎么办?
2.假设某个全节点,收到转账交易。有没有可能转账交易中,接受者的收款地址是这个节点之前没听说过的?
3.账户私钥丢失怎么办?
4.私钥泄露怎么办?
5.转账写错地址,怎么办?
6.如何找到最先找到nonce的矿工?(因为可能会有矿工偷nonce)
7.如何知道交易费该给哪个矿工?
前言
本文为整理记录学习比特币挖矿,比特币脚本,比特币分叉,比特币的匿名性和比特币引发的思考的笔记。图片清晰度可能不够高,希望这不影响您的观看体验。如果有任何错误,请随时指出,感谢您的阅读
一、比特币挖矿
1.挖矿设备的演化
CPU(通用计算):它的缺点大部分是资源被闲置
GPU(通用并行计算):效率比CPU高,为了通用并行计算设计。但用来挖矿的话,用于浮点数运算的部件会闲置
ASIC芯片(挖矿专用)(Application Specific Integrated Circuit):专门用于比特币挖矿,计算哈希值的操作而设计。性价比高,但研发周期长
总结:挖矿设备总的演变趋势,从通用变得专用
2.矿池
矿池:组织矿工,做为一个整体
矿池的架构:一个全节点驱动很多矿机(图片所示)
图中下面的矿工只负责计算哈希值,全节点的其余职能都给pool manager来做(监听交易,打包区块等)
矿池出现目的:解决收入不稳定的问题
总结:大型矿池的出现,让矿工减轻了负担。矿工只需要负责挖矿和计算哈希,别的都是矿主来做,并且收入分配更加稳定
二、比特币脚本
1.交易结构
locktime:设定交易的生效时间(0表示立即生效)
vin,vout:输入和输出部分
time:交易产生时间
blocktime:区块产生时间
2.交易的输入
每个输入要说明,输入花的币是来自哪个交易的输出(txid和vout)
scriptSig:输入脚本
(一个交易可以有多个输入,图中只有一个输入)
3.交易的输出
图中例子有两个输出
value:输出金额,单位比特币
n:序号,表示是第几个输出
scriptPubKey:输出脚本
asm:输出脚本内容
reqSips:需要多少个签名才能兑现
addresses:输出的地址
4.P2PK
输入输出脚本的形式
①最简单的形式
输出脚本直接给出收款人的公钥
checksig:检查签名的操作,在输入脚本里直接给出签名(这个签名是用私钥对这个输入脚本所在的交易的签名)
实际执行情况
图片中是把输入脚本和输出脚本拼接起来后的结果
实际上,为了安全考虑,两种脚本是分开来执行
第一条语句:把输入脚本里提供的签名压入栈
第二条语句:把输出里提供的公钥压入栈
第三条语句:弹出栈内元素,用公钥检查签名正确性(正确输出true 错误输出false)
5.P2PKH
输入输出脚本的形式
②它和第一种的区别,输出脚本里没有给出收款人的公钥,给出的是公钥哈希
它是最常用的形式
实际执行情况
第一条语句:签名压入栈
第二条语句:公钥压入栈
第三条语句:复制栈顶元素(栈顶就会多出一个公钥)
第四条语句:栈的元素弹出来,取哈希,然后把该哈希值压入栈
第五条语句:把输出脚本里提供的公钥哈希值压入栈(此时栈顶有两个哈希值)
第六条语句:弹出栈里的两个元素,比较是否相等(目的:防止冒名顶替)
第七条语句:弹出栈内元素,用公钥检查签名正确性(正确输出true 错误输出false)
6.P2SH
输入输出脚本的形式
③最复杂的脚本形式
输出脚本给出收款人提供的一个脚本的哈希 (这个脚本叫做redeemScript)
7.进一步说明
8.多重签名
比特币系统中一个输出可能要求多个签名才能取出钱
为私钥的泄露提供安全的保障,为私钥的丢失提供冗余
通过checkmultisig实现
9.脚本执行
checkmultisig的执行过程,图中假设3个签名给出2个即可
本质是把复杂度从输出脚本转移到输入脚本,现在这个输入变得很简单,原来的复杂度被转移到RedeemScript
10.Proof of Burn
输入输出脚本的形式
④它是比较特殊的格式
这种格式输出脚本的开头是return的操作
后面可以返回任何内容
作用:是证明销毁比特币的一种方法
11.销毁原因/应用场景
①小币种要求销毁一定数量的比特币,才能够得到这种币种。这种小币种叫做AlternativeCoin
②销毁比特币可以换取往区块链里写入内容的机会
它的好处:矿工知道这种脚本的输出不可能兑现,就没有必要保存在utxo里面,对全节点比较友好
三、比特币分叉
1.分叉(fork)
由一条链变成两条链
造成原因: ①挖矿时两个节点差不多同时挖到矿,这时两个节点都可以发布区块,就会出现临时性分叉(state fork)。(由于对比特币这个区块链当前的状态有意见分歧而导致的分叉)
分叉攻击的例子:forking attack(属于state fork)(它是故意/人为造成,有时也称为deliberate fork)
②比特币的协议发生改变,要修改比特币协议需要软件升级。在一个去中心化的系统里,升级软件时没有办法保证所有节点都在软件升级。假设大部分都升级了,小部分因为各种原因没升级,此时也会出现分叉,这种分叉叫做protocd fork。
根据协议修改内容的不同,又可以分成硬分叉(hard fork)和软分叉(soft fork)
2.硬分叉
出现原因:对比特币协议增加一些新的特性,有一些new feature扩展一些新的功能,此时没有升级软件的旧的节点,它是不认可新节点,认为这些特性是非法的。这时是对,比特币协议内容的分歧
硬分叉的例子:比特币中的区块(block size limit)
3.软分叉
出现原因:如果我们对比特币协议加限制,原来合法的交易/区块,在新的协议中,可能变得不合法
它是临时性的
可能出现软分叉的情况:给某些目前协议中没有规定的域增加新的含义,赋予新的规则
四、比特币的匿名性
1.比特币中什么情况下,会破坏匿名性?
比特币中不要求用真名,可以用公钥的地址,所以说有一定的匿名性,但不是绝对的
①别人能猜测到你的多个地址,地址可能会被关联
(关联原因:输入里面出现两个地址,别人可能会觉得这两个地址是同一个人的(输入输出的地址也可能可以被猜到是同一个人))
②你在比特币中的地址和现实生活中的地址,也可能产生关联
(原因:①资金的转入和转出②用比特币做支付时)
2.比特币的匿名性有多好?
匿名和隐私保护相关联,我做的事情不想暴露真实身份(hide your identify from whom?)这个问题在于,不想向谁暴露身份
3.假设你是一个比特币用户,怎么最大程度提高匿名性?
从两个方面(application layer和network layer)入手提高匿名性 应用层:把各个不同的人的币,混到一起,叫做coin mixing(它实施起来有一定复杂性) 网络层:多路径转发的方法,之前提到的TOR
4.零知识证明
定义:
假设证明者是我,验证者是你。它要证明这个账户是什么,但我不会把私钥透露给你
同态隐藏(零知识证明的数值基础)
图片中是三个性质。第二个性质说明加密函数是不可逆的,第三个叫做同态运算
5.同态隐藏例子
方法(简单的版本)
盲签方法
零币和零钞
五、比特币引发的思考
1.哈希指针
指针中的地址只在本地有意义,发送到别的计算机是没有意义的
实际系统中,只有哈希没有指针
如何找到前一个区块的内容?
全节点一般是把区块,存储到一个(key,value)数据库里。key是区块的哈希,value是区块的内容。常用的数据库是level DB。所谓的区块链这种链表结构,实际上是在level DB里面用哈希指针串起来。只要你掌握了最后一个哈希值,那么在level DB查找这个key对应的value,就可以知道取出最后一个区块的内容。然后块头会指向前一个区块,这样推就能找到整个区块链的
2.区块恋
含义:两个人一起买比特币,然后把私钥分成两部分,每人保留一段。如果两个人掰了,ta们的比特币就会烂在区块链里。用区块链的不可篡改性作为两个人的爱情见证
这样存在一个问题:两个人各知道一半的私钥,在掰以后,可能可以暴力算出另外128位。128位的是难度远小于256位的
通过这个例子,我们可以知道说明对于共享账户,可以用多重签名(multisig)保证比特币的安全性
3.分布式共识
理论上证明分布式系统中取得共识是不可能的,既然理论上已经证明不可能,实际上如何变得可能呢?
严格来说比特币并没有取得共识,因为取得的共识随时有可能被推翻。比如出现分叉攻击,在严重时,可能退到创世纪块
4.量子计算
比特币这种加密货币,建立在密码学的基础上
比特币中并没有账户的公钥直接暴露出来,而是通过公钥获得地址,公钥不能推出私钥
将来量子计算机发展起来,会不会威胁到比特币?
是不会的,因为量子计算机离使用还有很长一段时间。即使有一天真的很厉害,首先冲击的会是传统金融业,并不是加密货币
假设以后量子计算机可以推出私钥怎么办?
比特币在设计时就加了一层保护。有人要偷你账户上的钱的话,首先要用地址推导出公钥,但量子计算机无论如何都做不到的
六、问题-解答
1.转账交易时接受者不在线怎么办?
不需要接受者在线,转账交易是在区块链里记录一下,把我这里的比特币转到他的账户。无论对方在不在比特币网络里,是没有关系的
2.假设某个全节点,收到转账交易。有没有可能转账交易中,接受者的收款地址是这个节点之前没听说过的?
可能的,比特币在创建账户不需要通知别人,在本地产生公私钥对即可
3.账户私钥丢失怎么办?
没有办法了,账户里的钱变成死钱,永远取不出来
4.私钥泄露怎么办?
尽快把该账户的钱,转到自己的另一个较安全账户里
5.转账写错地址,怎么办?
没办法。交易一旦发布到区块链里,不能取消
6.如何找到最先找到nonce的矿工?(因为可能会有矿工偷nonce)
发布的区块里有coinbase tx,里面有个收款人地址,是这个挖到矿的人的地址
7.如何知道交易费该给哪个矿工?
事先不需要知道是哪个矿工。交易费算法:total inputs>total outputs。这个差额就是交易费。哪个矿工挖到矿,就可以把这个差额,收集起来作为自己的交易费