北京大学肖臻老师《区块链技术与应用》笔记BTC篇CoderZjz

比特币属于加密货币,可见其中必然会涉及到密码学的知识。而比特币本身开放,其交易记录、交易金额、交易内容甚至源代码都面向全网开放,加密又使用在哪里呢?在比特币中,正是加密确保了信息的不可篡改,保证了区块链本身的优势——不可篡改。

在比特币系统中,加密主要涉及两个内容:

在比特币中,其最基本的数据结构便是一个个区块形成的区块链。

MarkleTree是比特币系统中又一个重要的数据结构首先,回顾一下BinaryTree(如果不懂请自行复习数据结构)。MarkleTree和BinaryTree的区别有哪些?

在比特币系统中,不同区块通过哈希值指针连接,在同一个区块中的多个交易(数据块),则通过MarkleTree的形式组织在一起。区块本身分为两部分(块头和块身),在块头中存在有根哈希值(没有交易的具体信息),块身中存在交易列表。

为什么要分轻节点和全节点?因为硬件的局限。一个区块大小为1MB,对于移动便携设备来说,如果存储区块的所有内容,则所需空间过大,而这是不现实的。所以轻节点只需要存储区块块头信息,全节点存储区块所有内容即可。

一般来说,一般的链表我们都可以改造为使用哈希指针的链表,但当链表中存在环时,哈希指针便不能再使用。

在比特币系统中由挖矿来决定货币发行权和发行量。

该问题的解决,依赖于系统中维护的一个数据结构,记录货币的使用情况(是否被花过?被谁花过?)。该数据结构由系统中全体用户共同维护,保证了交易的有效性。该数据结构,便是区块链。

可否各个节点独立完成区块链构建?很明显不行,各个节点独立打包交易,形成区块链,必然无法避免区块链内容不一致。从分布式系统角度来说,账本内容需要取得分布式共识,从而保证区块链内容在不同节点上的一致性。

比特币系统中采用了很巧妙的方案解决这个问题。虽然仍然是投票,但并非简单的根据账户数目,而是依据计算力进行投票。在比特币系统中,每个节点都可以自行组装一个候选区块,而后,尝试各种nonce值,这就是挖矿。[H(blockheader)<=target]当某个节点找到符合要求的nonce,便获得了记账权,从而可以将区块发布到系统中。其他节点收到区块后,验证区块合法性,如果系统中绝大多数节点验证通过,则接收该区块为最新的区块并加入到区块链中。

可见,依赖于算力竞争,有效的防止了“女巫攻击”。

为什么系统中节点要竞争记账权?需要提供算力和电力成本,节点为什么要去做?

比特币系统设计之初便考虑到了这个问题,那就是引入激励机制。比特币通过设置出块奖励来解决该问题,一个获得合法区块的节点,可以在区块中加入一个特殊交易(铸币交易)。事实上,这种方式也是唯一一个产生新比特币的途径。

比特币系统设计规定,起初每个区块可以获得50个比特币,但之后每隔21万个区块,奖励减半。

区块链是一个去中心化的账本,比特币采用了基于交易的账本模式。然而,系统中并无显示记录账户包含比特币数,实际上其需要通过交易记录进行推算。在比特币系统中,全节点需要维护一个名为UTXO(UnspentTransactionOutput尚未被花掉的交易输出)的数据结构。

UTXO集合中每个元素要给出产生这个输出的交易的哈希值,以及其在交易中是第几个输出。通过这两个信息,便可以定位到UTXO中的输出。

为什么要维护这样一个数据结构???为了防范“双花攻击”,判断一个交易是否合法,要查一下想要花掉的BTC是否在该集合中,只有在集合中才是合法的。如果想要花掉的BTC不在UTXO中,那么说明这个BTC要么根本不存在,要么已经被花过。所以,全节点需要在内存中维护一个UTXO,从而便于快速检测doublespending(双花攻击)。

每个交易会消耗输出,但也会产生新的输出。

每个交易可以有多个输入,也可以有多个输出,但输入之和要等于输出之和(totalinputs=totaloutputs)。存在一些交易的totalinputs略大于totaloutputs,这部分差额便作为交易费,给了获得记账权的节点。在公开课笔记4中最后提及到“区块中保存交易记录,如果仅仅设置出块奖励,那么,会不会存在节点只想发布区块获得出块奖励而不想打包交易?”因此,BTC系统设计了Transactionfee(交易费),对于获得记账权节点来说,除了出块奖励之外,还可以得到打包交易的交易费。但目前来说,交易费远远小于出块奖励。等到未来出块奖励变少,可能区块链的维护便主要依赖于交易费了。

还有哪些域可以调整呢?

下图为blockheader中对各个域的描述。而仅仅调整nonce是不够的,所以这里可以通过修改MerkleTree的根哈希值来进行调整。

思考:打包的交易和顺序确定了,根哈希值不就确定了吗?这个怎么能修改呢?

虽然这样看起来是一个冷酷的事情,过去的工作可能都会白做。但实际上这才是挖矿公平性的保障。对算力有优势的矿工来说,其之前所做大量工作仍有可能会白费。

比特币越来越难被挖到,且出块奖励越来越少,是否说明其未来挖矿的动力将越来越低呢?实际上,恰恰相反。在早期比特币很容易挖到的时候,比特币并不被人们所看好,而后,比特币估值上涨,吸引其他人参与挖矿,又进一步促进了比特币价值上涨,进而又吸引更多人参与进来。当出块奖励趋于0时,则整个系统将依赖于交易费运行,届时交易费将成为维护比特币系统运行的重要保障。

大多数算力掌握在好的用户手中,能否保障不良交易记录不会被写入区块链?需要注意的是,算力低的用户并非完全不能获得记账权,仅仅是概率上较低的问题。但实际上,即使拥有少量算力的恶意节点,也有一定概率获得某个区块的记账权。

比特币系统的工作过程:用户将交易发布到比特币网络上,节点收到交易后打包到区块中,然后将区块发布到比特币网络上,那么新发布的交易和区块在比特币网络上是如何传播的呢?

比特币网络设计原则:简单、鲁棒(最坏情况下能达到最优状况,即健壮性)而非高效。每个节点维护一个邻居节点集合,消息传播在网络中采用洪泛法,某个节点在收到一条消息会将其发送给所有邻居节点并标记,下次再收到便不会再发送该消息。邻居节点选取随机,未考虑网络底层拓扑结构,也与现实世界物理地址无关。该网络具有极强鲁棒性,但牺牲了网络效率。

比特币系统中,每个节点要维护一个等待上链的交易集合。第一次听到交易,若是合法交易,则将其加入该交易集合并转发给邻居节点,以后再收到该交易就不再转发(避免网络上交易无线传输)。假如网络中存在两个冲突交易,如交易1:A->B,交易2:A->C(假设花费的同一笔钱)。具体接收哪个取决于节点先接收到哪个交易,之后收到另一个交易会将其放弃。

假如某个节点先听到A->B,但又听到A->C已经上链,则此时A->B为非法交易,所以要再等待上链交易集合中删除A->B

新发布区块在网络中传播方式与新发布交易传播方式类似,每个节点除检查该区块内容是否合法,还要检查是否位于最长合法链上。区块越大,则网络上传输越慢。BTC协议对于区块大小限制为不大于1M大小。

区块大小越大,网络上传播时延越长;区块大小越小,则可以包含的交易数目越少。

此外,比特币网络传播属于Besteffort(尽力而为),不能保证一定传输成功。以一个交易发布到网络上,未必所有节点都能收到,也未必所有节点收到交易顺序都一致。

之前已经提过,挖矿本质上就是不断调整blockheader中的nonce值,使整个blockheader的哈希值小于等于给定的目标阈值。即:H(blockheader)<=target.(target便是目标阈值,target越小,目标难度就越大)对于挖矿难度的调整,可以视为调整目标空间在整个输出空间中所占比例大小。

可见,如果实际实际比较长,target会比较大,相应的挖矿难度会降低;如果实际实际比较短,target会比较小,相应的挖矿难度会增大。

如何让所有矿工都愿意调整这个挖矿难度呢?这一调整算法在代码中已经写入,如果有恶意节点故意不调,其所产生的区块不会被大多数诚实的节点承认。在blockheader中有一个nbits的域,它是对target的编码存储(target为256位,nbits为32位,也就是说blockheader并未直接存储target),其他节点在进行合法性验证时候会验证nbits域是否合法,不合法则对该区块不予以承认。

思考:比特币出现之后也曾经涌现出一大堆数字货币,为什么偏偏比特币存活了下来?很大程度上是由于比特币设计本身注重鲁棒性而非高效,使得系统的健壮性极高。可见实际工业应用,不应该一味追逐新技术的应用,实际上来说,哪一种能更好解决我们的实际问题就用哪种。像区块链技术火起来之后的炒币浪潮,其中又有多少是披着区块链皮的项目呢?更别说火极一时的区块链养狗,养猫之类的项目,实际上根本不需要用上区块链技术!

思考:挖矿难度变低是好事吗?对于矿工来说,挖矿难度变低,挖矿变得更容易,这也说明大多数人对该币种不再看好,这个币种的价值也会大跳水,这对矿工来说可是一个坏消息。

之前提到,由于硬件限制,BTC系统中分为轻节点和全节点,下表阐述了全节点和轻节点的区别

在比特币网络中,大多数节点都是轻节点。如果只是想进行转账操作,不需要挖矿,就无需运行一个全节点。在挖矿过程中,如果监听到别人已经挖出区块延申了最长合法链,此时应该立刻放弃当前区块,在本地重新组装一个指向最后这个新合法区块的候选区块,重新开始挖矿。

目前,挖矿设备逐渐趋于专业化,其经历了三个过程,总体趋势从通用到越来越专用。普通CPU->GPU->ASIC芯片(挖矿专用矿机)

实际上,挖矿本身就是计算,对于普通计算机来说,挖矿过程中大多数内存、硬盘、CPU中大多数部件(用到指令较少)等都是闲置的,如果用普通计算机专门用于挖矿是根本不划算的。随着挖矿难度提高,用通用计算机挖矿很快变得无利可图。所以,挖矿设备转入第二代——GPU(主要用于大规模并行计算,如:深度学习)。但是,用GPU挖矿,仍然有一定浪费(GPU为通用并行计算设计,挖矿仍然有很多部件闲置。例如:浮点数运算部件,挖矿过程只使用整数操作,该部分部件根本不会用到)。

GPU价格上涨,仅仅是深度学习火热导致的吗?实际上,很多GPU被用于了挖矿。

当然,目前GPU挖矿也已经不划算了(目前一些新开发货币仍然用GPU挖矿)。所以,开始进入第三代设备:ASIC芯片(专门为挖矿设计的芯片),这种芯片专门为挖矿设计,只能用于特定币种的挖矿。但ASIC芯片设计、流片流程很长,假如BTC价格剧烈变化,前期投入很可能会血本无归。所以,ASIC芯片需要提前预订。假如BTC系统中,算力突然很猛烈增加,一般是一个大的厂商生产出新的ASIC矿机。

ASIC芯片只能用于挖矿,一旦其过时,便完全作废。

思考:ASIC芯片的出现是好事吗?很明显,ASIC芯片并不是普通人可以参与的,一定程度上提升了挖矿的门槛,违背了比特币系统去中心化的初衷。理想状态下,所有人用CPU挖矿,这样只要有一台家用计算机便可以参与挖矿。当然,后续有一些货币便考虑到了这个问题,设计了抗ASIC芯片化的解决方案,后续介绍以太坊时会对这种方案进行介绍。但反过来想,如果大家都用ASIC矿机挖矿,如果有人想要颠覆BTC系统,必然会导致BTC价格跳水,从而导致其所购买ASIC矿机作废,投入成本血本无归。所以,很多人反倒认为ASIC芯片出现,一定程度上并不是坏事。

挖矿另一个趋势便是大型矿池的出现。对于单个矿工来说,即使使用了ASIC矿机,其算力在整个系统中仍然只占据很少一部分,即使从平均收益看有利可图,但收入很不稳定。此外,单个矿工除挖矿还要承担全节点其他责任,造成了算力的消耗。

所以,必须涉及如何分配的问题。如果分配不公平,挖矿的动力就会减少。

矿池一般具有两种组织形式。1.类似大型数据中心(同一机构),集中成千上万矿机进行哈希计算。2.分布式。矿工与矿主不认识(不同机构),矿工与矿主联系,自愿加入其矿池,矿主分配任务,矿工进行计算,获得收益后整个矿池中所有矿工进行利益分配。

思考一:有没有可能,某个矿工平时正常提交share,但真正挖到区块后不提交给矿主而是自己偷偷发布出去,从而避免他人分走挖矿所得到的出块奖励?事实上,这种情况是不可能的。因为每个矿工挖矿任务是矿主分配的。矿主组装区块,交给矿工计算,而区块中铸币交易的收款人地址是矿主,如果矿工修改该地址,计算的nonce值也会作废。思考二:如果矿工自己刚开始就自己偷偷组装一个区块,自己挖矿,这样就类似于其脱离了该矿池。因为其自己所组织的区块不会被矿主所认可,其提交的share也不会被认可,也就得不到分配的收益。思考三:有没有可能矿工捣乱?平时提交share,等挖到后扔掉区块,不提交?这种可能是有的,如果矿工本身仅仅想捣乱,是可以这么做的。但扔掉区块后,对其本身来说,也没有相应的奖励获得,看似是损人不利己的情况。但是,矿池之间存在竞争关系。有可能为了打击竞争对手,会派出矿机加入竞争对手矿池挖矿,从而起到搞破坏的作用。即只参与其他矿工挖矿分红,自己挖到的区块却丢掉不给他人分。

由这些数据可以得知,矿池本身对BTC系统带来了较大威胁。某个恶意用户如果想发动攻击,以前需要自己达到51%算力,现在自己只需要作为矿主,只需要很少一部分算力就可以了。只要能够吸引到足够多的不明真相的矿工,便可以用较低成本实现51攻击。当然,矿主经验管理矿池,也需要收取一定比例(出块奖励、交易费)作为管理费用。如果恶意者想要攻击系统,会将管理费降低甚至赔本吸引足够多矿工加入。这便使得发动51%攻击变得容易了起来。

矿工只能计算哈希值,并不知道区块包含哪些交易,区块链状况是什么。所以,这些“群众”是无知的,容易被利用(《乌合之众》当中提出的观点,大多数人真的就能掌握真理吗?)。此外,51%攻击只是一个概率问题,并非达到51%算力就能发动攻击,不能达到就无法发动攻击。此外,矿池本身算力也是在不断变化的。

像不像即当裁判又当运动员?”堂下何人状告本官“?

优点:解决了矿工收入不稳定的问题,减轻了矿工的负担。缺点:威胁到了区块链系统的安全,使得51%攻击变得容易起来。

比特币系统中使用的脚本语言非常简单,唯一可以访问的内存空间只有栈,所以也被称为“基于栈的语言”

特点:输出脚本直接给出收款人公钥。(CHECKSIG为检查签名操作)

注:实际执行已经不再拼接两个脚本

特点:输出脚本不直接给出收款人公钥,而是公钥的哈希。

执行过程(将两个脚本拼接起来):

说明:1.图中第5步,两个公钥哈希是不同的。上面一个是输出脚本提供的收款人的哈希,下面一个是要花钱时候输入脚本要给出的公钥通过HASH160操作得到的。2.图中第6步,该操作的目的是为了防止冒名顶替(公钥)。假设比较正确,则两个元素消失(不往栈中压入TRUE或FALSE)。

特点:输出脚本给出的不是收款人公钥的哈希,而是收款人提供的一个脚本的哈希。该脚本称为redeemScript,即赎回脚本。等未来花钱的时候,输入脚本要给出redeemScript的具体内容以及可以使之正确运行需要的签名。

实例:

多重签名下为最早的多重签名实现方法:该方法通过CHECKMULTISIG来实现,其中输入脚本提供N个签名,输出脚本给出N个公钥和阈值M,表示N个人至少有M个签名即可实现转账(N>=M)。输入脚本只需要提供N个公钥中M个合法签名即可。【给出的M个签名顺序要和N个公钥中相对顺序一致】

早期的实际应用中,多重签名就是这样写的。但是,在应用中体现出了一些问题。例如,在网上购物时候,某个电商使用多重签名,要求5个合伙人中任意3个人才能将钱取出。这就要求用户在生成,转账交易时候,要给出五个合伙人的转账公钥以及N个M的值。而对于用户来说,需要购物网站公布出来才能知道这些信息。不同电商对于数量要求不一致,会为用户转账交易带来不便之处(因为这些复杂性全暴露给了用户)。为了解决这一问题,就需要用到P2SH

如图为使用P2SH实现多重签名

现在的多重签名,大多都采用P2SH的形式

有没有觉得第二个应用场景有些熟悉?实际上,之前谈到BTC发行的唯一方法,便是通过铸币交易凭空产生(数据结构篇中)。在铸币交易中,有一个CoinBase域,其中便可以写入任何内容。那么为什么不使用这种方法呢,而且这种方法不需要销毁BTC,可以直接写入。

实际中的脚本,都需要加上OP前缀,如:CHECKSIG应该为OP_CHECKSIG,这里仅仅为了学习友好,就删去了该前缀

本节介绍比特币系统中的分叉(fork)

分叉指的是,原来的系统中为一条链,但分成了两条链。分叉形成的原因可能有多种,例如:挖矿时两个节点差不多同时挖出矿,都会发布区块(对比特币系统当前状态产生分歧导致的分叉——statefork);分叉攻击,同样也会导致分叉(forkingattack,人为故意造成);比特币协议改变,在分布式系统中不能保证所有节点同时升级软件,假设存在少数节点未升级,导致出现分叉(protocalfork);

根据对比特币协议修改的不同,可以将分叉分为硬分叉和软分叉。很多人都听说过硬分叉和软分叉,但对其实际含义并不了解,本篇便专门介绍比特币系统中的分叉。

什么情况会出现硬分叉?对比特币协议增加新协议,扩展新功能,未升级软件的旧节点会不认可这些修改,会认为这些特性是非法的。这也就是对比特币协议内容产生分歧,从而导致分叉。硬分叉的一个典型例子,就是对比特币区块大小的修改(之前有提到过,BTC区块大小限制1MB,但是否合适存在争议)。

假设系统中大多数节点更新了软件,少数节点仍然遵从1MB限制的协议(注意,这里大多数和少数是按照算力来区分的,和账户数量无关)。即:新节点认为区块大小最大4MB,旧节点认为区块大小最大1MB,且新节点占据大多数。

此时,就出现了新节点永远沿着上面的链挖矿,旧节点永远沿着下面的链挖矿,由于新节点算力足够强,所以形成两条永远都在延伸且平行的链。当然,上面的链,也有可能会挖出大小在1MB内的小区块,但对旧节点来说,该链上存在非法区块,不会认可该链。可见,这种分叉是持久性的。只要这部分旧节点永远不更新软件,下面的链便永远不会消失。

1.BTC社区中有些人很保守,不愿意加大区块大小2.区块大小并非越大越好,在网络篇中提到,比特币网络传输为"尽力而为",区块加大会造成传输变慢等问题。3.单纯增加区块大小,对交易数量的增加远不能达到数量级的提升。

出现hardfork后,便变成了两条平行的链,也就造成了社区分裂。社区中有一部分人,会认为下面的链才是”正统“(根正苗红),各个链上的货币独立。

实际上,这个事情真正出现过。后续会介绍以太坊,以太坊历史上的一件大事就是硬分叉事件。以太坊称为ETH,但目前看到的ETH已经不是最初的ETH了,以太坊在历史上发生过硬分叉,另一个链称为ETC(和过高速公路那个ETC可半毛钱关系都没有呀)。实际上,ETC才是以太坊设计原本的协议,而ETH是黑客攻击ETH上一个智能合约THEDAO后进行回滚的协议链(将黑客攻击偷取的以太币采用硬分叉方式回滚回到另一智能合约,然后退还给真正拥有者)。但是这次硬分叉的后果,由于有人不愿意这么做,造成了以太坊社区的分裂。实际上,虽然ETC不如ETH又名,但实际它也是目前一种主流货币。分叉之初,由于两个链分叉造成了互相影响,产生了很多麻烦。比如:在ETH链上有一笔转账B->C,有人便在ETC链上回放,将ETC链上的货币页转给了C(C收到两笔钱)。后来,对两条链各添加了一个chainID,将两个链区分开,才使得这两条链真正分开。

如果对BTC协议添加限制,使得原本合法交易在新交易中不合法,便会形成软分叉。

同样,有人想将区块大小调大,也就会有人思考调小的好处。在这里,我们假设将区块大小从1MB减小至0.5MB(实际中,1MB已经足够小,不会调小了).

需要注意的是,区块链中区块大小调整并非简单修改一个参数,调改大小便很有可能会引发分叉,由于参数修改方式不同,有可能会是硬分叉,也有可能是软分叉。

假设系统中大多数节点更新了软件,少数节点仍然遵从1MB限制的协议(注意,这里大多数和少数是按照算力来区分的,和账户数量无关)。即:新节点认为区块大小最大0.5MB,旧节点认为区块大小最大1MB,且新节点占据大多数。

需要注意的是,旧节点如果不升级软件,挖出的区块可能就白挖了(大于0.5MB),但对于系统来说,不会存在永久性分叉。

思想1:特殊机制,该脚本即使返回错误,仍然写入区块链。(实际并不是)思想2:即使返回失败,仍然写入区块链,只是具体处理时候不计算其即可。(恶意节点大量抛出失败交易,攻击区块链怎么办?上一篇中提到,每秒平均只能处理7笔交易)

可以看到,理论上限为每个区块可包含4000个交易,而该图中并远未达到上限。所以很多人说到的1MB区块太小,另一方面实际中很多区块没有装满。

实际上,比特币中的数据是完全公开的,而网上的交易是要与实体世界进行交易的,所以大大破坏了其匿名性。假如银行允许用假名(以前的存折时代),由于银行数据并非公开,所以银行系统的匿名性是要比比特币更好的。

在很多国家,都有防洗钱法。如何防范不法分子采用BTC进行洗钱呢?其实很简单,只需要盯住资金转入转出链即可。对于大额资金转入BTC或将大量BTC转为现实货币,很难逃避司法金融机构的监管。

因此,可见互联网并非法外之地。如果想要干坏事,基本都能被查到。

匿名的本质是不想要暴露身份。而对于普通人来说,BTC的现有机制已经足够保持个人隐私了。但如果涉及违法,行政机关想要获得真实身份,其实很容易。那么可以采取哪些方法尽可能提高匿名性?

从应用层看,可以将各个不同用户的BTC混合在一起,使得追查变得混乱(Coinmixing);从网络层看,可以采用多路径转发的方法,数据不直接发送出去,而是经过很多跳(洋葱路由的基本思想)。

实际上,暴露用户隐私正是由于区块链的公开性和不可篡改性。不可篡改性对于隐私保护,实际上是灾难性的。

零知识证明:一方(证明者)向另一方(验证者)证明某一个陈述是正确的,但不需要透露除该陈述是正确的之外的任何信息。例如:A想要向B证明某一账户属于A,这说明A知道该账户的私钥。但不可能通过A公布私钥的方法来证明,该账户确实属于A。因此,A可以产生一个账户签名,B通过公钥对签名进行验证。(实际上该证明是否属于零知识证明存在争议,因为泄露了用私钥产生的签名)

盲签名是一种特殊的数字签名技术。盲签名因签名的人看不到所签署文件的具体内容而闻名,它有两个显著的特点:一是签名者对消息的内容是不可见的;二是签名被公开后,签名者不能追踪签名。

为什么要这么做呢?例如电子交易中,我们的交易信息依赖于银行等第三方机构。第三方机构需要防范双花攻击等,就需要对电子货币进行签名。而签名的过程中,必然会导致其了解到交易内容。如果想要银行等第三方机构负责相应工作,但不知道交易具体内容,就可以采用盲签的方法。

既然了解到BTC提供了较好匿名性,但其无法完全消除关联性,那么如果想要这样一种货币怎么办?这就涉及了零币和零钞。

从数学上看,零币和零钞是安全的。但其并不是百分之百的匿名,其并未解决与系统外部实体发生交互时对匿名性的破坏。

BTC系统中很多地方使用到了哈希指针。指针保存的本地内存地址,只有在本地计算机上才具有意义,如果发送给其他计算机就没有意义了。那么在区块发布时候,哈希指针如何通过网络进行传播?

因此可见,在blockheader中只有hash值,没有指针。那么如何查找到前一个区块的内容?全节点一般将区块存储于一个key-value数据库中,key为哈希,value为区块内容。常用的key-value数据库为levelDB,只要掌握到最后一个区块的哈希值即可依据哈希值一直往前找到区块链所有内容。有些节点只保存区块链部分信息,如果需要用到前面的区块,可以问其他节点要。哈希指针性质保证了整个区块链内容是不可篡改的。

有情侣一起买BTC,将私钥从中截断,每人保留其中一部分。如果未来两人依旧感情很好,就可以将钱取出;如果分手,这部分钱就会永久锁死,谁也无法取出,通过区块链的不可篡改性作为两人的爱情见证。这样做有什么问题?如此下来,N个人怎么办?如果按照这种方法,将私钥分为N份。但这样会有一系列问题。一.如果N个人中任意一个人忘记私钥,则无法将钱取出。二.截断私钥长度,会降低安全性,因为私钥长度会直接影响破解难度(2^256远远大于2^128),之间难度差距远远不止一倍。【可见,对于多个人账户,应该使用多重签名,而非截断私钥的方法。】三.如果分手,该钱变成死钱,一直保存在UTXO集合中,对矿工不友好。

之前有提及,理论上来说,分布式系统不可能达成共识。但实际中为何变成可能了?严格来说,BTC系统***识随时可能被推翻,例如分叉攻击导致系统回滚。此外,理论和实际存在差异。不可能结论针对特定模型,实际中对模型稍微修改或添加线下方法即可将不可能变为可能。

知识改变命运,这句话本身没有错,但是对知识的一知半解可能让你的命运变得更差,搞科研是很有意义的,但是不要给学术界的思维限制头脑,不要为程序员的思维限制想象力。(肖老师这段话是真的爱了爱了)

为什么要挖矿?因为有收益,且收益大于开销。早期BTC难度低且出块奖励高,从而吸引矿工。之前有提到,BTC总量固定,有人认为其是一个精妙的设计。但实际上,总量固定的东西并不适合作为货币,这也就决定了BTC并不能在未来完全颠覆现有货币体系。以太坊中便没有BTC中出块奖励定期减半的做法,此外,某些新型货币会自带通货膨胀的功能。对个人来说,通货膨胀并非好事,因为钱不值钱了。但人类每年创造的价值,如果用总量固定的东西作为货币,则其只会越来越值钱,而这会导致拥有者不断看着其升值,其他没有的人无论如何奋斗都赶不上(房市也是如此,炒房使一部分人靠房租便可大赚特赚,个人奋斗却很难买房。这也是我国目前存在的较大的问题,社会财富的分配不公,最终引发各种社会矛盾,需要政府解决)。

会不会BTC这种建立在密码学上的加密货币,在量子计算出来后会不会变得不安全。一.量子计算距离使用仍然有很长距离(人工智能也是,目前仍然处于弱人工智能阶段。其实很多技术都是如此,炒的情况很严重,但距离实用很远。但是不炒便不会有资本流入进行研究,这也是一个非常相悖的地方)。二.量子计算若真正使用到破坏现有加密算法,对传统金融业的破坏仍然是最大的。三.实际中使用的并非公钥,而是可以用公钥哈希。而哈希函数一般都是不可逆的,所以即使量子计算也无法反推私钥。BTC中用的SHA-256,无论输入多大,最终结果都为256位,必然会导致信息丢失,无法反推原本数据。总结:加密可逆、哈希不可逆;加密不损失信息、哈希破坏信息(加密和哈希的区别)

THE END
1.北京不再限制养狗但天安门广场长安街禁止遛狗首先并不是什么人都能养犬。北京市地方法规规定,个人养犬应当具备以下条件:“有合法身份证明;有完全民事行为能力;有固定住所且独户居住;住所在禁止养犬区域以外。”其次,并不是买来一条狗就能养。要取得合法养犬资格,须办理好几项手续。按规定,个人在养犬前,应当征得居民委员会、村民委员会的同意。对符合养犬条...https://news.sina.com.cn/c/2003-09-06/0044699550s.shtml
2.北京8个孕前亲子鉴·定价格名单(附2024年地...来自中量康权科技...北京如何做亲子鉴定,需要什么手续?1、选定做亲子鉴定的正规机构,做好咨询预约;2、在约定时间到达鉴定机构。参与鉴定的双方、三方都需要带能够证明本人身份的真实有效的证明到亲子鉴定机构。在鉴定机构填写司法委托手续、在采样单上录指纹、拍照、签字;3、鉴定机构工作人员给被鉴定人采样。亲子鉴定样本通常是血痕(指尖血...https://weibo.com/2135292200/OEHTH8ONQ
3....一天.他在徒步回家的路上.突然.感到脚下有什么绊了一下.低头...近年来中国兴起了养狗热潮,说是西洋人也喜欢养狗,因为狗是人类的朋友。但西洋人有导盲犬,我们有吗?没有。反正街上是见不到一条导盲犬。 143、以德报怨没有社会效用 过去我们一直以为“以德报怨”是最高的道德境界,可是关于德怨相报的经济学分析却表明,以德报怨的社会效用为0分,一个小偷被抓到了,报之以德...http://www.1010jiajiao.com/timu_page_325636
1.北京养犬管理规定为了维护首都的社会秩序,保持市容整洁,预防狂犬病的发生,保护人民的健康,市人民政府批准《北京市养犬暂行管理办法》,部分法规如下:一、个人养犬,应当具备下列条件:(一)有合法身份证明。(二)有完全民事行为能力。(三)有固定住所且独户居住。(四)住所在禁止养犬区域以外。二、个人在养犬前,应当征得居民委员会、村民...https://mip.66law.cn/v/wenda/1232965.aspx
2.北京养犬证办理指南本地生活养犬登记证每年年检一次,养犬人在年检时持养犬登记证到住所地公安机关办理年检手续,并缴纳管理服务费。公安机关核实犬只符合养犬标准、证件正确无误后办理年检手续,并在养犬登记证上加贴养犬年检标志。 养犬人也可通过“平安北京”及“首都治安微提示”微信公众号办理养犬登记、年检手续。进入“平安北京”微信公众...https://www.bendishenghuo.net/b645732.html
3.如何办理养犬登记手续?犬类管理问题首都之窗养犬人带个人身份证明,携犬到住所地区公安机关办理养犬登记手续。办理登记手续时需填写《养犬登记表》,与公安机关签订《个人养犬承诺书》,并缴纳养犬管理服务费。养犬人可以携犬到区兽医行政主管部门认定的狂犬病免疫点对犬只免费接种狂犬病疫苗。同时,养犬人也可通过手机端进行网上办理。https://www.beijing.gov.cn/hudong/bmwd/jsjbmyyt/20222mwd/sz2023/qlgl/202310/t20231012_3275882.html
4.社区文明养犬问答(精选7篇)文明养犬篇 1.《北京市养犬管理规定》是 正式施行的。 A.2003年10月15日 B.2003年12月15日 C.2004年10月15日 D.2004年10月15日 2.重点管理区内养犬,第一年应当缴纳管理服务费 元。A.1000元 B.1500元 C.2000元 D.2500元 3.带狗可以去天安门广场游玩吗? https://www.360wenmi.com/f/fileirfkfi22.html
5.辽宁省养犬管理规定2024最新全文:今日转载于政府网(gov)(九)不得携带烈性犬进入养犬重点管理区,因免疫、诊疗等原因需要进入养犬重点管理区的,应当将其装入犬笼; (十)不得危害他人人身安全,发生犬只伤人的,应当立即将受伤者送医疗机构诊治,并先行支付医疗费用; (十一)犬只死亡或者转让后三十日内,应当到居住地或者单位所在地公安派出所办理有关手续; ...http://www.bjsheng.cn/flfg-gov/31346.html
6.北京发养犬整治通知:每户限养一只禁养大型犬八、未办理养犬登记手续的单位及养犬人,应在本通告公布之日起10日内,到属地公安机关办理养犬登记证,逾期不办理的,依据《北京市养犬管理规定》第二十七条予以处罚。 九、在重点管理区饲养大型犬、烈性犬的单位及养犬人,应在本通告公布之日起10日内,将犬迁移到一般管理区饲养或送交区县养犬管理部门,逾期不迁移或...https://www.cnhubei.com/200611/ca1200692.htm
7.100家大公司java笔试题汇总(带答案)网器里44af66输出结果是什么?D A. 0 B. 1 C. 2 D.编译失败 3.下列哪种说法是正确的(D) A. 实例方法可直接调用超类的实例方法 B. 实例方法可直接调用超类的类方法 C. 实例方法可直接调用其他类的实例方法 D.实例方法可直接调用本类的类方法 4. 如下代码: ...https://blog.csdn.net/sinat_25398439/article/details/53172105
8.这些狗狗上了“头条”!作为主人你怎么看?(附视频)但随着养犬家庭的不断增多,不文明养犬行为造成的不快甚至纠纷时常发生。小编想说养犬最需要的是公德心,不能因为你喜欢养狗,就对别人不负责任! 今年以来,为进一步规范养犬行为,维护城市环境和社会公共秩序,金昌市决定,在5月至7月,开展不文明养犬专项整治行动,目前,整治行动已过半。 https://m.thepaper.cn/newsDetail_forward_7714316