96SEO 2026-02-23 11:14 3
3.目前学习是否晚目前还是一个较为萌芽的阶段不要以为自己错过了比特币大涨的时刻。

学习区块链已经超越很多人
resistance2、隐秘性Hiding3、谜题友好puzzle
即为输入两个输入值XY经过哈希函数之后得到H(X)H(Y)即为哈希碰撞。
利用哈希碰撞可以检测对信息的篡改。
假设输入x1哈希值为H(x1)此时很难找到一个x2使得H(x1)H(x2)。
意思是哈希函数的计算过程是单向的不可逆的。
但前提要满足输入控件足够大且分布均匀。
通常我们在实际操作中会使用添加随机数的方法。
假设给定一个输入值X可以算出哈希值H(x)但是不能从H(x)推出X。
特指哈希值的计算过程无法被预测或优化必须通过大量计算才能找到符合条件的输入
header是区块链的链头这个确定链头范围的过程即为挖矿。
.关于目前的target难度可以通过http://blockexplorer.com/q/getdifficulty来得到下一个难度可以通过http://blockexplorer.com/q/estimate来获得。
难度的变化情况可以查看Bitcoin
签名就相当于每个人的开户行账号。
公钥签名即开户账号验证签名用私钥即为账号密码。
以此来确保比特币的安全传输。
tree用于每个区块内部交易之间的连接作用。
哈希指针与merkle
普通指针存储的是某个结构体在内存中的地址。
假如P是指向一结构体的指针那么P里面存放的就是该结构体在内存中的起始位置。
。
这样的好处是:从这个哈希指针不仅可以找到该结构体的位置同时还能够检测出该结构体的内容有没有被篡改因为我们保存了它的哈希值。
比特币中最基本的结构就是区块链区块链就是一个一个区块组成的链表。
区块链和普通的链表相比有什么区别:用哈希指针代替了普通指针(B
pointers)区块链第一个区块叫作创世纪块(genesis
每一个区块都包含指向前一个区块的哈希指针。
普通链表可以改变任意一个元素对链表中其他元素是没有影响的。
而区块链是牵一发而动全身如果区块链中任一块被修改则后面所有的区块都要发生变动因为后一个区块头部存储是前面所有区块求H()后的值所以只需要保存最后一个哈希值就可以判断区块链有没有改变。
针对这一特性比特币没有要保存所有区块的内容可以只保留最近的几千个区块。
如果要用到以前的区块可以向系统中其他节点要这个区块。
假设整个区块链当中有些节点是有恶意的它给出块算出它的哈希值与保留的区块的哈希值对比即可判断是否为异常节点。
由上图可看到区块链系统中的的每个节点可以获得最近一个区块的哈希值H(recent
block)从而就可以追溯到创世纪块。
通过哈希指针的链式结构也可以知道区块内容是否被篡改因为只要某个区块A被篡改它的哈希值就会改变它之后区块B的哈希指针就不会指向A了这样系统会很快知道A被篡改。
或者篡改者从区块A一直改到最新区块到最后最新区块的哈希值也会改变跟系统中保存的最近区块哈希值H(recent
tree跟二叉树很类似只不过把普通指针同样换成了哈希指针。
Merkle
body里的所有交易每个交易取哈希值相邻交易的哈希值结合起来一起取哈希层层往上取哈希直到得到最后一个哈希值这个哈希值也就是根哈希值root
hash就可以检测出对树的任何节点的修改。
要想改变其他节点的哈希值同时保证根哈希值的不变就必须人为制造哈希碰撞但通过哈希的性质知道这是不可能的。
tree内的从最底层的某个交易出发到最顶部根哈希的一条路径。
如上图中最下面的黄色交易开始到最底部的路径就是一个merkle
在比特币区块链网络中有很多节点包括计算机、手机、矿机、服务器等等。
在所有节点中分为全节点和轻节点。
tree的具体内容只有一个根哈希值。
这时轻节点向一个全节点发出请求请求证明黄色的交易被包含在这颗merkle
proof由交易者提供。
全节点收到这个请求之后只需要将图中标为红色的这三个哈希值发给轻节点即可。
有了这些哈希值之后轻节点可以在本地计算出图中标为绿色三个哈希值。
首先算出黄色交易的哈希值即它正上方的那个绿的哈希值然后跟旁边红色的哈希值拼接起来可以算出上层节点绿色的哈希值。
然后再拼接再算出上层绿色哈希值再拼接就可以算出整棵树的根哈希值。
轻节点把这个根哈希值和block
header里的根哈希值比较一下就能知道黄色的交易是否在这颗merkle
proof里提供的这几个哈希值就是从黄色的交易所在的节点的位置到树根的路径上用到的这些哈希值。
轻节点收到这样一个merkle
proof之后只要从下往上验证沿途的哈希值都是正确的即可。
(验证时只能验证该路径的哈希值其他路径是验证不了的即该图中红色的哈希值是验证不了的)这样是否不安全呢?
假如黄色交易被篡改它的哈希值发生了变化那能不能调整旁边红色的哈希值使得它们拼接起来的哈希值是不变的呢?
1.全节点将整个区块所有交易信息发给轻节点这样可以证明某个交易不在区块中但这是非常不高效的方法且比较笨的方法。
proof计算根哈希值轻节点向全节点对这个交易发出请求全节点为了证明此交易不在区块链中。
对区块中所有交易的哈希值进行排序然后计算要证明的交易的哈希值根据二分查找法来确定这个交易哈希值的位置再将此位置相邻的2个交易merkle
hash若计算得到的根哈希值跟本地的区块头中的根哈希值比较一样则证明此交易一定不在区块链中因为如果在的话最后计算出来的根哈希值比较必然是不一样的。
可以把整棵树传给轻节点轻节点收到后验证树的构造都是对的每一层用到的哈希值都是正确的说明树里只有这些叶节点要找的交易不在里面就证明了proof
non-membership。
问题在于它的复杂度是线性的θ(n)是比较笨的方法。
如果对叶节点的排列顺序做一些要求比如按照交易的哈希值排序。
每一个叶节点都是一次交易对交易的内容取一次哈希按照哈希值从小到大排列。
要查的交易先算出一个哈希值看看如果它在里面该是哪个位置。
比如说在第三个第四个之间这时提供的proof是第三个第四个叶节点都要往上到根节点。
如果其中哈希值都是正确的最后根节点算出的哈希值也是没有被改过的说明第三、四个节点在原来的merkle
tree里面确实是相邻的点。
要找的交易如果存在的话应该在这两个节点中间。
但是它没有出现所以就不存在。
其复杂度也是log形式代价是要排序。
排好序的叫作sorted
比特币协议是一套技术规则定义了比特币网络如何运作包括交易的创建、验证和共识机制。
它基于密码学和分布式系统确保去中心化、安全性和不可篡改性。
双花是指同一笔比特币被多次花费的行为这是传统数字货币面临的核心问题之一。
BTC实现模型每笔交易都会消耗之前的UTXO并生成新的UTXO。
因此一旦某个UTXO被用于交易它就不能再次被使用。
比特币网络中的节点会验证交易是否引用了有效且未花费的UTXO若UTXO已被花费则交易无效双花攻击无法成功。
BTC的UTXO并将其全部发送给B该UTXO被标记为已花费新的UTXO由B持有。
此时如果A试图再用这5
BTC进行另一笔交易例如转给C节点会检查A是否仍有可用的UTXO。
如果没有足够的UTXO交易将被拒绝。
输入Inputs引用之前的未花费交易输出UTXO证明你有权花费这些比特币。
存储整个区块链的完整副本截至2025年3月已超过500GB。
独立验证所有交易和区块的合法性遵循协议规则。
增强网络的安全性和去中心化但需要较高的存储和带宽。
Verification。
只下载区块头约80字节/区块不存储完整交易数据。
依赖全节点提供相关交易信息来验证支付。
优点是占用资源少适合移动设备缺点是安全性较低依赖其他节点。
全节点对网络健康至关重要轻节点则更注重便捷性。
轻节点通过检查区块头中的Merkle根验证交易确认其是否在链上。
交易列表包含该区块的所有交易列表包括Coinbase交易。
Merkle
比特币共识是网络中所有节点就区块链的状态哪些交易有效达成一致的机制。
工作量证明PoW矿工通过算力竞争解决数学难题以生成新区块。
最长合法链规则节点始终接受工作量最大的合法链见1.5。
共识规则交易必须符合协议如签名有效、无双花区块必须满足难度目标且包含有效的前区块哈希每2016个区块调整一次难度确保出块时间稳定在10分钟。
去中心化特性没有中央权威共识由全球节点共同维护。
分叉处理如果网络出现临时分叉如两个矿工同时挖到区块节点会选择最长链分叉的短链将被丢弃。
防止篡改攻击者若想修改历史交易需重新计算从目标区块到当前高度的所有工作量并超过现有链的增长速度。
如果一个矿工挖到一个区块但另一个矿工随后挖出一条更长的链网络会切换到更长链短链的区块成为“孤块”Orphan
Block这也是为什么建议等待6个确认以确保交易所在链足够稳定。
竞争获得的矿工必须完成计算任务以证明自己消耗了足够的算力。
整个过程涉及
交易打包、哈希计算、难度调整、区块广播和链上确认以下是详细步骤
2000~3000笔交易约1MB~4MB取决于SegWit使用情况。
字段说明版本号区块协议版本如0x20000000前一个区块哈希父区块的SHA-256哈希确保链式连接默克尔根Merkle
Root本区块所有交易的哈希树根时间戳区块生成时间Unix时间难度目标nBits当前网络难度压缩格式Nonce初始随机数从0开始递增
Header))≤TargetSHA-256(SHA-256(Block
0000000000000000000abc123...前导19个0
hashlib.sha256(hashlib.sha256(header_with_nonce).digest()).digest()hash_int
矿工通过消耗电力算力竞争记账权获得BTC奖励同时维护网络安全。
这一过程是比特币
区块链是去中心化的账本比特币采用的是基于交易的账本模式transaction-based
ledger只记录了转账交易和铸币交易并没有直接记录每个账户上有多少钱。
如果想知道某个比特币账户上有多少钱要通过交易记录来推算。
Output的数据结构即还没有被花出去的交易的输出。
一个交易可能有多个输出被花掉的就不在UTXO里了。
如下图中A转账给B和C的交易B的已经花出去了也就不在UTXO里了而C的还没花出去就在UTXO里。
UTXO集合中的每个元素要给出产生这个输出的交易的哈希值以及它在这个交易中是第几个输出。
用这两个信息就可以定位到一个确定的交易中确定的输出。
使用UTXO可以用来快速检测双花攻击想知道新发布的交易是不是合法的要查一下全结点存在内存中的UTXO。
要花掉的币只有在这个UTXO这个集合里才是合法的否则要么是不存在的要么是已经花过了的。
随着交易的发布每个交易会消耗掉一些输出同时也会产生一些新的输出。
例如上图例子中B将5个BTC给D这消耗掉了前面A把5个BTC给B的输出但产生了新的B把5个BTC给D的输出这个输出会保存在UTXO里。
如果一个账户从交易中获得比特币之后不花出去那么这些输出就要一直保存在UTXO里。
有的人是一直不花比如中本聪有的是把密钥丢了没法花但不论怎样这些没消耗掉的交易输出都要一直存在UTXO里目前的大小是能保存在一个普通服务器内存中的。
每个交易可以有若干输入和若干输出所有输入的金额之和要等于所有输出的金额之和。
这里可能有些违反直觉不仅可以有多个输出也可以有多个输入甚至这些输入也不必来自同一个地址。
每个输入地址都要提供对应的签名所以一个交易可能有多个签名。
有些交易的总输入可能略微大于总输出如可能总输出是1个BTC总输出是0.99个BTC这之中的差额就作为记账费给了获得记账权的那个结点。
这样设计是因为仅仅为获得记账权的结点给予出块奖励是不够的获得记账权的结点为什么要把某些交易记下来这样做对他有什么好处呢一个结点完全可以只打包自己的交易记录别人的交易不仅要去验证其合法性而且一个区块装的交易多了在网络上传输的带宽也会比较多在网络上传输的速度也会慢。
这里的差额作为记账费就解决了这个给别人记账的动机的问题。
这里0.01个BTC已经是很大的交易费了也有一些很简单的交易是没有交易费的也就是完全符合t
目前来讲矿工挖矿主要的目的还是为了第一个激励机制——得到出块奖励。
因为出块奖励是要逐渐减少的每隔21万个区块就要减半比特币系统的平均出块时间是10分钟大约每隔4年出块奖励就会减半。
到很多年之后出块奖励变得很小这时候交易费就成为主要动机了。
除了比特币系统这样基于交易的账本模式transaction-based
ledger还有一些系统是基于账户的模式account-based
ledger比如后面要学的以太坊。
在这种模式中系统要显式的记录每个账户中有多少个币。
比特币系统的这种模式隐私保护性比较好但会带来一些代价如转账交易要说明币的来源币是从之前的哪个交易的哪个输出中来的以防止双花攻击。
种取值。
因为比特币近些年太火爆了挖矿的人数很多所以挖矿的难度被调整的很高单纯靠调整nonce是很可能得不到符合难度要求的解的搜索空间不够大。
所以区块的块头中哪些域可以改再来回顾一下块头中的域括号中是占的字节数
Tree中铸币交易的CoinBase域来调整其根哈希值区块产生的时间4有一定的调整余地比特币系统并不要求非常精确的时间这个域可以在一定范围内调整挖矿目标阈值编码后的版本4nonce4可以改
可以看到因为铸币交易是没有交易来源的所以可以在其CoinBase域里随便写入内容铸币交易的变化会使该交易的哈希发生变化变化沿着Merkle
nonce块头的nonce字段不够用就再拿着这个域的一部分字节一起调整就增大了搜索空间。
例如拿出这个域的前8个字节当做extra
实际挖矿时一般也是为此设计了两层循环外层循环调整铸币交易的CoinBase域的extra
Tree的根哈希值内层循环调整块头的nonce计算整个块头的哈希值。
在这个转账交易中左边是交易的两个输入虽然旁边写的是Output这是表示它们花掉的是之前哪个交易的Output右边是交易的两个输出从绿色Unspent字样可以看到还没有花出去所以会保存在UTXO里。
可以看到比特币系统中交易的输入和输出都是用脚本来指定的验证交易输入输出的过程就是把输入脚本和输出脚本配对执行不是把同一个交易的输入输出脚本配对执行而是把这个交易的输入脚本和提供币的来源的那个交易的输出脚本配对执行。
只要配对后都能成功执行交易验证就是通过的。
挖矿的过程就是不断尝试nonce去求解puzzle每次尝试可以看做一个伯努利试验Bernoulli
outcome。
掷硬币就是一个最简单的伯努利试验要么正面朝上要么反面朝上这两个概率不必一样大对于挖矿而言成功和失败的概率相差非常悬殊成功的概率很小。
当进行了大量的伯努利试验这些伯努利试验就构成了伯努利过程Bernoulli
trails。
伯努利过程的一个性质是无记忆性memoryless即做大量的试验前面的试验结果对后面没有影响例如掷硬币很多次都是反面朝上下一次掷硬币正面朝上的概率也不会增加。
当伯努利分布也即二项分布的n很大而p很小时试验次数很多每次试验成功概率很小可以近似为泊松分布。
这里挖矿就是一个n很大p很小的伯努利过程所以可以近似为泊松过程Poisson
free与算力优势——挖矿公平性的保证出块时间是服从指数分布exponential
的整个系统的出块时间按照比特币协议被调整在10分钟左右而具体到某个矿工的出块时间取决于其算力占整个系统中矿工的算力的百分比这比较好理解例如某个矿工的算力能占到整个系统总算力的1%那么平均100个区块有1个是他挖到的也即平均要等1000分钟能挖到1个区块。
也就是说从任何一个位置将其截断剩下的部分仍然是服从指数分布的。
“将来还要挖多少时间”和“过去已经挖了多少时间”是没有关系的。
体现在比特币系统的挖矿中也就是不管大家已经挖了多长时间接下来系统中要出块的平均时间仍然还是10分钟左右。
这也就是progress
free——过去做了多少工作不会让后续成功的概率变化。
这个性质看似无情但是是必要的。
假设一个加密货币系统不满足progress
free即过去做的工作越多后面成功的概率就越大那么就会造成算力强的矿工会有不成比例的优势而不能按照算力的比例计算优势。
比特币总量的分析出块奖励是系统中产生新的比特币的唯一途径而出块奖励每隔21万个区块大约每隔4年要减半所以新产生的比特币的总量就形成了一个几何序列geometric
认为比特币挖矿是在解决某种数学难题是错误的观念求解比特币挖矿的puzzle除了比拼算力之外没有任何实际意义。
比特币越来越难挖只是因为出块奖励人为地被减少了并且加入的人越来越多而为保持系统中的平均出块时间而提高了挖矿的难度。
但要注意挖矿的过程虽然没有实际意义但对维护比特币系统的安全性是至关重要的。
Bitcoin
大部分算力掌握在诚实的结点手里只能说有比较大的概率下一个区块是由诚实的矿工发布的但是不能保证记账权不会落在有恶意的结点手里。
假设一个有恶意的结点M获得了记账权它想把结点A的钱转走但因为没法伪造A的签名没有A的私钥写个任何不正确的签名上去都会导致诚实的结点不会接受这个候选区块而是继续沿着上一个区块扩展。
因为这个区块是不合法的所以多长都不是最长合法链这样的攻击是无效的。
M把BTC转给A然后就紧接着挖矿挖到了一个区块在这里填写了M把BTC转给自己的交易以希望沿着这个区块成为最长合法链这样就能将转给A的挤掉从而将花出去的BTC回滚。
这也是双花攻击的一种。
试想A是一个购物网站允许BTC支付在M-A这个交易刚写入区块链以后A就认为M支付成功那确实会出现上述问题。
如果M-A这个交易所在区块后面又跟上一些区块之后呢这个攻击的难度就会大大增加。
因为它最好的方式仍然是在M-A的前一个区块位置插入但是想让它成为最长合法链却非常难因为它已经不是最长合法链诚实的结点只会去扩展最长合法链。
如果大部分结点掌握在诚实结点手里这样攻击的难度非常大有恶意的结点要连续获得好多次记账权才可能改变最长合法链。
所以一种最简单的防范方法就是多等几个区块也叫多等几个确认confirmation。
confirmation是指交易刚发布出去还没有写入区块链中的时候就认为交易已经不可篡改了。
两个交易有冲突结点接收最先听到的交易。
上面分叉攻击的例子中M-A后的M-M大多诚实结点会将其拒绝。
购物网站委托全结点监听区块链从支付成功到发货其实还有比较长的处理时间如果发现这个交易最后没有写到最长合法链购物网站可以选择取消发货。
这个是没关系的因为比特币协议也没有规定获得记账权的结点必须发布哪些交易而且没有写进这个区块也可以写进下一个区块总有诚实的结点愿意发布这些交易。
而且比特币系统在正常工作时候也会出现某些交易被滞后发布的情况可能就是一段时间内的交易太多了毕竟一个区块不能超过1M。
正常情况下结点挖到一个区块就立即发布这是为了得到出块奖励和收取交易费。
selfish
mining就是挖到的区块都留着这样的动机是比如在前面的分叉攻击中一直等到6个confirmation过了再一口气把算好的很长的分叉发布出去替换掉最长合法链。
实际上这样做的难度还是很大因为这个恶意结点的算力要超过那些诚实的算力才可能在一定时间后比它长。
另外就是大多诚实的结点已经扩展那个M-A的交易所在的区块了这个恶意结点的同伙结点也要很多才行。
即便不是为了做什么攻击就是为了赚取出块奖励和收取交易费selfish
mining也有好处——能够减少自己的竞争对手。
比如下图中大家都在从A挖下一个区块然后某个结点挖出了B先藏着这时候别人还在从A挖下一个区块然后这个结点紧接着挖出了C将B和C一起发布出去这样就少了一个结点C的竞争。
或者是继续往下挖当听到有人发布D时将B和C一起发布出去这样最长合法链是沿着ABC的别人挖出的D就作废了。
但这样会带来不小的风险假设在挖出C之前就有人挖出D并且发布了这时候就只能赶紧把B发布出去很可能连这个记账权都竞争不到了。
mining的回报并非很高只是让别人做了无用功自己少了些竞争但风险却是挺大的。
参考地址【区块链学习笔记】4比特币系统的实现_比特币的激励机制-CSDN博客
新的交易要发布到比特币网络上矿工将交易打包成的区块也要发布到比特币网络上。
比特币网络中的P2P网络是很简单的所有结点之间都是对等的没有超级结点。
要加入这个网络至少要有一个种子结点seed
node和种子结点联系它会告知它所知道的网络中的其它结点有点像构造路由表的过程。
结点之间通过TCP来通信有利于穿透防火墙。
要离开网络也不必通知其它结点只需要直接退出应用程序其它结点一直没有听到你的消息过一段时间就会将你删除掉。
比特币网络的设计原则是简单、鲁棒健壮性而不是高效。
每个结点维护一个邻居结点的集合消息在网络中采用flooding方式传播结点第一次听到某个消息会将它传播给所有邻居结点同时记录一下自己已经收到过这个消息了。
邻居结点的选取是随机的没有考虑底层的拓扑结构。
比如美国的一个结点可能和中国的一个结点是邻居结点。
这样设计的好处是增强鲁棒性牺牲了效率。
比特币网络中每个结点要维护一个等待上链的交易的集合这个集合中的交易都是要写入区块链的合法的交易结点第一次收到这个交易的时候就会把它写入这个集合并转发给所有邻居。
如果有两个有冲突的交易几乎同时发布到网络上每个结点根据其位置的不同可能先收到的交易是不同的那么另一个交易对于这个结点而言就是非法的了不会被收纳到集合中。
以左边的集合为例它先听到A-B的交易将其写入到了自己的交易集合中。
接下来它收到了一个新发布的区块其中包含A-B这个交易说明这个交易已经被写入区块链了所以就要在自己的交易集合中将其删除掉。
如果这个结点收到的新发布的区块中的交易是被自己丢弃掉的A-C的这个交易呢这时也要将集合中的A-B删除掉因为检查可以发现此时集合中的A-B这个交易是非法交易因为它和新发布的区块中的A-C这个交易冲突了。
也就是说要看接收A-B交易的结点先获得记账权还是接收A-C交易的结点先获得记账权。
一个交易发布到比特币网络上未必所有结点都能收到有的结点不一定按照比特币协议的要求来转发可能合法的不转发不合法的又转发了而且不同结点收到交易的顺序也很可能是不一样的网络传输中的延迟可能很大。
这是一个去中心化的系统中要面临的实际问题只能尽力而为。
和新发布的交易的传播方式是类似的不过每个结点除了要检查区块的内容是不是合法的还要检查区块是不是在最长合法链上。
越大的区块在网络上传播越慢比特币协议要求区块大小不能超过1M因为比特币网络的效率比较低一个1M大小的区块可能要几十秒才能传播给比特币网络上的大多数结点。
显然目标阈值target越小则挖矿的难度就越大。
所以调整挖矿难度就是在调整target以调整目标空间在整个输出空间中所占的比例。
比特币中使用的哈希函数是SHA-256产生的哈希值是256位的所以整个输出空间是2的256次方
调整目标空间所占的比例在这个问题里直观的来看就是最后得到的哈希值前面有多少位0这只是通俗直观来看的也许第一个非0位是要小于4也说不定这个0越多显然值就越小也就是挖矿难度越大了。
上式中常量difficulty_1_target是指挖矿难度difficulty定义为1时所对应的目标阈值target的值。
挖矿难度最小就是1所以这个常量也就是target允许的最大值。
系统中的总算力越来越强如果挖矿难度保持不变那么平均出块时间会越来越短这会造成一些问题。
假设平均出块时间减小到了1秒钟也就是每隔1秒左右就有一个新的区块携带一些列交易被发布到比特币网络上而在比特币网络上这个区块传播给大多数结点可能就要几十秒。
这是一个二分叉的情况如果出块时间很短就会导致这种分叉成为常态。
而且不仅仅是二分叉可能会出现很多分叉。
分叉过多对比特币系统达成共识没有好处并且会危害比特币系统的安全性。
例如前面说的分叉攻击正常情况下因为大部分结点是诚实的有恶意的结点想要在6个确认后拿这段时间集中算力算出的新链去覆盖掉最长合法链是很难的因为诚实结点也都在集中算力扩展最长合法链。
如果出块时间很短就会导致分叉过多因为相比于出块时间可以认为网络上传输的时间变长了这样诚实结点的算力就被分散了这时恶意结点要进行51%
attack很可能就不需要50%以上的算力了可能百分之十几就足够了这样大大降低了比特币系统的安全性。
比特币10分钟的平均出块时间也未必是最优的后面要学的以太坊的出块时间就降低到了15秒。
大幅降低了出块时间所以以太坊就要设计一个新的共识协议——GHOST。
在这个协议中分叉产生的orphan
总之在不同的区块链账本系统中不论出块时间设计成多长都要设法让其保持稳定而不能允许它随着系统中总算力的提高而无限减小下去。
比特币协议中规定每隔2016个区块大约每2个星期要重新调整一下目标阈值target具体的迭代更新公式是
target是写在比特币系统的代码里的代码也都是开源的如果有结点到了该调整的时候不调整target怎么办。
这也是一个大部分结点诚实的问题如果不调整target那么发布的区块块头里的4字节nBits域32字节的target压缩编码后的版本就不是正确的诚实的结点不会接收这样的区块。
一直在线在本地硬盘上维护完整的区块链信息在内存中维护UTXO集合以便快速检验交易的正确性监听比特币网络上的交易信息验证每个交易的合法性监听别的矿工挖出的区块验证其合法性
区块中的每个交易都要合法包括铸币交易及其出块奖励发布的区块是不是符合难度要求、难度目标阈值的设置是否正确、每两周调整的挖矿难度区块是在延伸最长合法链
决定沿着哪条链挖下去决定哪些交易被打包进区块决定当出现等长分叉时选择哪个分叉缺省情况是选择最先接收到的区块的分叉
不是一直在线不用保存完整区块链只要保存每个区块块头这样和全节点的大小相差大约1000倍不用保存全部交易只需要保存和自己相关的交易没法验证大多数交易的合法性只能检验与自己相关的交易的合法性无法检测比特币网络上发布的区块的正确性可以验证挖矿的难度因为挖矿时候计算哈希值只用到了块头信息而块头信息轻节点是保存了的只能检测哪个是最长链不知道哪个是最长合法链因为无法检测这条链上所包含的交易都是合法的
轻节点假设矿工全节点大多是有理智的即假设矿工们不会沿着不合法的链一直挖下去。
比特币网络中大部分节点都是轻节点如果只是想转账而不是去挖矿的话只用轻节点就可以了。
当在挖矿过程中发现新发布了一个区块那么应该停止挖矿重新从UTXO中取出一系列合法交易组成候选区块在刚发布的这个区块后面开始挖矿。
因为一方面这个区块中的交易可能和刚刚在挖的那个区块有重复另一个本质的原因就是候选区块的块头有指向前一个区块的哈希指针。
因为最新的区块已经变了这个哈希指针也要跟着改变。
那么这样是不是会因为之前的工作都白费了而很可惜实际上不可惜因为前面学过挖矿过程的无记忆性memoryless,progress
free无论是在刚刚的区块上继续挖还是新组装一个区块继续挖成功的概率是一样的。
比特币系统安全性的保证因为别人没法伪造你的私钥也就没法把你账户上的BTC转走。
但这个密码学上的保证是要以“系统中大部分节点是诚实的”为前提即大家不会接受那些不合法的交易进入区块链。
最早时候大家都是用普通计算机来挖矿但如果专门搞一台计算机来挖矿是很不划算的。
因为计算机大部分内存是闲置的挖矿只要用到很少一部分内存CPU大部分部件是闲置的计算哈希值的操作只用到通用CPU中的很少一部分指令硬盘和其它很多资源也都是闲置的。
随着挖矿难度提高用通用计算机上的CPU挖矿很快就无利可图了。
GPU主要用来做通用的大规模并行计算用来挖矿还是会有不少浪费而且GPU的噪音很大其中很多部件还是浪费了如用于浮点数计算的部件。
近些年GPU价格涨得很快这不仅是DL火热的原因实际上很多GPU是买来挖矿的。
不过现在挖矿的难度已经提高到用GPU也有些划不来了不会再有那么多人买GPU来挖比特币。
Circuit这之中有专门为了挖矿而设计的芯片没有多余的电路干不了别的事它的性价比是最高的而且为某一种加密货币设计的ASIC芯片只能挖这一种加密货币的矿除非两个货币用同一个mining
有些加密货币在刚启动的时候为了吸引更多的人来挖矿特意用一个和已有的其它加密货币一样的mining
研制挖特定加密货币的ASIC芯片需要一定周期但和研制通用芯片的速度相比已经是非常快的了如研制比特币挖矿的ASIC芯片大约用一年的时间。
不过加密货币的价格变化是比较剧烈的曾经就发生过比特币价格在几个月内下跌80%因为加密货币多变的价格这些挖矿设备的研制风险也是很大的。
挖矿的竞争越来越激烈定制的ASIC芯片可能用了几个月就过时了到时候又要买新的ASIC芯片参与竞争。
ASIC矿机上市后的大部分利润也就在前几个月这个设备的迭代也是很块的。
要买ASIC矿机往往要先交钱预定过一段时间厂商才会发过来。
实际上有些黑心厂商在生产出来以后也不交付给用户声称还没成产好然后自己在这段黄金时间用矿机挖矿赚取比特币。
不过这其实看得出来比特币系统中算力突然有了大的提高那一般是某个大的厂商生产出了新的矿机。
所以真正赚钱的未必是挖矿的而是卖矿机的。
为了让通用计算机也能参与挖矿过程抗ASIC芯片化有些加密货币采用Alternative
单个矿工挖矿的收益是很不稳定的平均出块时间10分钟是对于比特币系统中的所有矿工而言的。
一个矿工用一个矿机挖出矿的时间可能要很久并且除了挖矿之外还要承担全结点的其它责任。
manager全结点去驱动很多矿机下属矿工只负责计算哈希值全结点的其它职能只由矿主来承担。
有了收益以后再大家一起分配。
如果矿池中的矿机都是属于同一个机构的那怎么分配就只是公司内部怎么发工资的问题了。
如果矿机来自不同机构这时候矿工很可能分布在世界各地只是都加入了这个矿池。
矿工和矿主联系矿主将要计算的哈希值的任务分配给他矿工计算好后将结果发给矿主最终得到出块奖励后一起参与分红。
能否平均分配即挖到区块后奖励平分给所有矿工。
这样就完全是吃大锅饭的模式了有的矿工完全可以不干活或者少干活所以需要按矿工的贡献大小进行分配所以这里也需要工作量证明来证明每个矿工所做的工作。
每个矿工单打独斗之所以收入不稳定是因为挖矿难度太大了相比比特币系统的平均出块时间所以可以考虑矿池将挖矿的难度降下来。
比如本来要求前面有70个0现在矿池只要求前面有60个0这样挖到的是一个sharealmost
validblock即这个区块差不多在一定程度上是符合难度要求的。
矿工挖到这样的区块之后将其提交给矿主矿主拿到这些区块并没有什么用仅仅是因为目标空间是这个问题的解空间的子集并且求解两个问题的过程是一样的都是计算哈希因此这些区块可以作为证明矿工所做的工作量的证明。
等到某个矿工真正挖到矿获取出块奖励之后再按照大家提交的share的多少来进行分配。
是否会有这样的矿工挖到share提交给矿主挖到真正的矿自己发布出去以获取出块奖励这是没法独吞出块奖励的因为每个矿工的任务是由矿主来分配的矿主负责组装好区块然后交给矿工去不断尝试nonce和CoinBase
nonce有可能就是讲它们划分一下然后分配给不同的矿工去做要注意铸币交易CoinBase
transaction中的收款人地址是矿主的地址不是任何一个矿工的地址。
如果自己把铸币交易的地址改成自己的然后去挖矿这样提交上去的share矿主是不认可的所以还是没有用。
矿池之间是有竞争对手的一种竞争方式就是到对方的矿池里去捣乱即派遣一些矿工去加入到对方的矿池里去挖矿只提交share但挖到真正的矿就将其丢弃掉故意不提交。
然而如果这个对手矿池仍然获得了出块奖励这些矿工也能参与分红。
如果没有矿池如果要发动51%攻击攻击者要花费大量的硬件成本。
有了矿池以后矿池实际上将算力集中了起来攻击者未必拥有很多算力只要吸引大量的不明真相的群众将算力集中到自己的矿池就可以。
在2014年的时候GHash矿池的总算力就超过了比特币系统中总算力的一半引起了恐慌然后GHash主动减少了算力以防止大家对比特币失去信心。
如今的矿池的算力还算比较分散有好几家矿池在竞争但一个集体的算力完全可以潜伏分散在不同矿池中等到攻击时再集中起来矿工要转换矿池是很容易的。
computing的概念平时不需要维护这些节点需要计算时再召集起来。
矿池要收取管理费有的收取出块奖励中的一部分有的收取赚取的交易费。
有恶意的矿池可以在发动攻击之前故意将管理费降得很低吸引大量矿工进入矿池。
因为算力占了半数以上并且矿工挖矿任务被分配开并行进行分叉出来的链的增长速度很快最终势必成为最长合法链。
假设攻击者不喜欢某个账户A不允许和A有关的所有交易上链。
这时如果有人发布了含有和A有关的交易的区块它可以很快发布一个不包含这些交易的区块然后不必等候6个确认区块立即发布到比特币网络上竞争最长合法链。
这里不必等候的原因是之前普通分叉攻击等候几个确认区块只是为了让收款人认为已经没问题了已经成功收款了这里没有这种顾虑。
在之前学习共识协议时学过大部分节点是诚实节点时记账权也可能落在有恶意的节点手里它完全可以不发布某些交易但在那种情形下总有诚实的节点愿意发布这些交易所以是没关系的。
但当在这种情况下即有恶意的节点算力很大时却可以始终让某些交易不上链。
即完全可以公开**某些交易这样一来别的矿工也不敢随便打包这些交易了因为很可能自己辛苦挖的矿最后沦为丢弃的区块。
不论算力再强因为没法伪造别人账户的签名除非获得其私钥所以没法伪造交易将别人账户上的BTC转走。
即便是仗着自己算力强强行将不合法的区块发布到区块链上并沿着这条链继续延伸诚实的节点依然不会沿着这条不合法的长链延伸所以还是没用的。
比特币系统中使用的脚本语言很简单唯一能访问的内存空间就是一个栈这点和通用脚本语言的区别很大。
这个交易有一个输入和两个输出其中一个输出已经被花出去了另一个没有被花出去。
输出脚本有两行分别对应上面的两个输出即每个输出有自己单独的一段脚本。
这些部分直接截图肖老师的PPT在PPT上记一下笔记在blockchain.info上不太好找那个交易的这些详细信息。
交易的输入是一个列表这个例子中输入只有一个所以这个列表也就只有一个列表项。
下图中两个交易分属两个区块中间隔了两个区块B转给C的这个交易的BTC的来源是前面A转给B的这个交易。
所以右边这个交易中的相应输入的txid是左边这个交易的id右边这个交易中的vout指向的是左边这个交易的对应输出。
在早期的比特币系统中要验证这个交易的合法性就要把B-C这个交易的输入脚本和A-B这个交易的输出脚本拼在一起执行看看能不能执行通过。
后来出于安全因素的考虑这两个脚本改为分别执行首先执行输入脚本如果没有出错那么再执行输出脚本如果能顺利执行并且最后得到非零值true那么这个交易就是合法的。
如果一个交易有多个输入每个输入脚本都要去找到前面特定区块中所对应的输出脚本匹配之后来进行验证。
全部验证通过后这个交易才是合法的。
输入脚本中直接给出付款人的签名付款人用自己的私钥对输入脚本所在的整个交易的签名输出脚本中直接给出收款人注意在这里肯定要是同一个人的公钥最后的CHECKSIG是检查签名时用的指令。
第三条语句弹出栈顶的两个元素用公钥PubKey检查一下签名Sig是否正确。
如果正确返回True说明验证通过
P2PKH的输出脚本中没有给出收款人的公钥给出的是公钥的哈希值。
在输入脚本中给出了这个人的公钥也就是既要给出公钥又要给出签名。
其它的都是一些操作指令后面详细学习它们是怎么运行的。
P2PKH是最常用的一种形式。
第四条语句将栈顶元素取出来取哈希再将得到的哈希值压入栈也就是将栈顶的公钥变成了其哈希值
第六条语句弹出栈顶的两个元素比较它们是否相等防止有人用自己的公钥冒充币的来源的交易的收款人的公钥
第七条语句弹出栈顶的两个元素用公钥PubKey检查一下签名Sig是否正确。
如果正确返回True说明验证通过
这是最复杂的一种形式这种形式下输出脚本给出的不是收款人的公钥的哈希而是收款人提供的赎回脚本Redeem
Script的哈希。
将来要花这个输出脚本的BTC的时候相应交易的输入脚本要给出赎回脚本的具体内容同时还要给出让赎回脚本能正确运行所需要的签名。
在验证时一方面验证输入脚本给出的赎回脚本内容是否和对应输出脚本给出的赎回脚本哈希值相匹配另一方面反序列化并执行赎回脚本以验证输入脚本给出的签名是否正确。
赎回脚本中给出公钥输入脚本中给出交易签名和赎回脚本具体内容输出脚本中给出了赎回脚本的哈希值。
第三步弹出栈顶元素取哈希再压栈也就得到了赎回脚本的哈希Redeem
第五步比较栈顶两个元素是否相等相当于用之前的输出脚本给出的赎回脚本哈希验证了输入脚本提供的赎回脚本是否是正确的
第二阶段的验证是对输入脚本提供的赎回脚本的验证首先要将其反序列化得到可以执行的赎回脚本。
然后执行这个赎回脚本。
第二步验证输入脚本中给出的交易签名的正确性。
验证通过就会返回True
P2SH在最初版本的比特币系统中是没有的后来通过软分叉的形式加进去了它常用的一个场景就是多重签名。
如果区块链软件的共识规则被改变并且这种规则改变无法向前兼容旧节点无法认可新节点产生的区块区块链发生永久性分歧即为硬分叉
如区块大小的改变。
假设新规则从1M变成4M新规则下的节点都会认可大节点和小节点会接着大节点来进行扩展但是旧规则下的节点只会接受小节点所以只会接着小节点来扩展这样就会形成两条链。
并且区块奖励是否有效也会进行分叉比如下面这条链中的区块奖励在下面这条链上是被认可的。
比特币的分叉币是从比特币区块链上分叉出来的新加密货币旨在改进或扩展比特币的功能。
以下是几种主要的比特币分叉币及其特点
主要改进将区块大小从1MB增加到8MB后升级至32MB以提高交易速度和降低手续费。
每个比特币投资者的账户上将出现与比特币数量等量的比特币现金
主要改进采用Equihash算法使普通用户可用GPU挖矿减少ASIC矿机的垄断。
主要改进结合比特币和ZClassic的隐私技术zk-SNARKs提供匿名交易。
比特币的分叉币主要在扩容、隐私、挖矿去中心化等方面进行改进其中BCH、BSV、BTG等仍有一定市场影响力而许多其他分叉币已逐渐消失79。
投资者需谨慎评估其技术和社区支持情况。
如果区块链的共识规则被改变后这种改变是向前兼容的旧节点可以兼容新节点产生的区块就会产生临时性区块即为软分叉。
此时新旧节点都会认可上面那条链但是只有旧节点会认可下面这一条。
所以新节点只会沿着上面的链扩展旧节点不一定但是新节点拥有大部分的算力所以随着上面那条链的长度增加下面的链就会作废最终大家都会认可上面那条链。
只要系统中拥有半数算力以上的节点更新了软件系统就不会出现永久性的分叉肯能会有临时性的分叉
网上购物Input中的addr1、addr2....以及可能存在output中的找零地址找零的钱肯定是比input中最小的UTXO更小会被推断为一个人因为同时拥有这些地址的私钥和现实产生联系时存在资金泄露问题
账户就会和实现身份建立联系。
如果在交易过程中周围人记住这笔交易在链上查询就能通过这个交易查询关联到账户
网络层匿名性洋葱路由TOR只知道上一个节点是谁而不知道最早发出的节点是谁
证明者向验证者证明一个陈述是正确的但不需要透露除了这个陈述是正确的之外的信息。
如果x,y不同那么它们的加密函数值E(x)和E(y)也不相同。
不同于hash可能会存在碰撞同时如果E(x)E(y),说明xy
给定E(x)和E(y)的值可以很容易地计算出某些关于x,y的加密函数值。
公开E(x)、E(y)通过同态隐藏的性质3算出E(xy)的值再对比E(7)的值如果相同则验证通过否则验证失败。
用户A提供SerialNum银行在不知道SerialNum的情况下返回签名Token减少A的存款
B拿SerialNum和Token给银行验证银行验证通过增加B的存款
零币和零钞在协议层就融合了匿名化处理其匿名属性来自密码学保证。
零币(zerocoin)系统中存在基础币和零币通过基础币和零币的来回转换消除旧地址和新地址的关联性其原理类似于混币服务。
零钞(zerocash)系统使用zk-SNARKs协议不依赖一种基础币区块链中只记录交易的存在性和矿工用来验证系统正常运行所需要关键属性的证明。
区块链上既不显示交易地址也不显示交易金额所有交易通过零知识验证的方式进行。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback