美文网首页
搞懂区块链,你是不是先该看看中本聪的论文(02)

搞懂区块链,你是不是先该看看中本聪的论文(02)

作者: horizon901 | 来源:发表于2018-10-08 13:45 被阅读113次

    第2部分:一些基本概念以及它们在比特币中是怎么用的

    2.1 什么是比特币系统?

    广义上的比特币是指比特币系统,也就是指中本聪设计的这套电子支付系统。比特币系统本质上就是一个电子记账簿。从这一点上说,比特币的电子账簿系统其实和现代商业银行的后台账簿系统非常相似:你有多少余额,从哪收过款,给谁汇过钱……这些内容都可以在这个后台账簿中找到对应的数字和记录,并以其为准。只不过对于传统账簿来说,记账权由商业银行等某个中心化机构所拥有,所有交易细节也不必公开和永久保留,只要保证每个账户余额不错就没问题;而比特币的思路是“所有人共同维护同一个账簿,公开透明且人手一份,账簿的记账权由分布在全网各处的大伙共同拥有,进而从根本上杜绝中心化操作带来的弊端和风险。

    由于记账权是分布式的,一些对于中心化方式来说非常简单的问题,比如账簿一致性、交易安全性、交易时序性、如何记账、怎么激励等,对于比特币系统来说都要重新设计。因此,为保障这个分布式的记账系统能够安全稳定的运行,比特币系统采用了大量密码学原理和一些独特的机制。

    2.2 什么是比特币?

    狭义上的比特币是指中本聪的这套支付系统中所使用的货币的名称,用BTC(BitCoin)表示。在比特币世界中,比特币是通过“挖矿”创造出来的,这些新产生的比特币,以挖矿奖励的交易形式发放给成功挖矿的人,然后再通过自由交易的方式扩散到普通用户手中:“某年某月某日某时,系统奖励矿工张三12.5个比特币;某年某月某日某时,张三又把挖矿攒的10000比特币给了李四(可能是换了两个披萨饼);某年某月某日某时,王五把麻六和赵七分别给他的10个和6.789个比特币分别给了周大11.789个和孙二5个……”,这些一条条代码化了的转账记录(也称为交易记录)就组成了比特币世界中的账簿。这些交易记录就构成了比特币(具体定义见后续UTXO章节)。比特币中的账簿之所以只记录交易细节而不合并成账户余额的原因,主要是为了保留每一笔花费的历史线索,这样既便于追溯验证,也能防止篡改。而且,只要确保所有的交易信息都能记清楚,那么大家各自有多少钱很容易就能算出来了,因此这些交易记录中也不必单独设立“余额”的部分。

    由于比特币系统中没有中心机构统一记账,这些交易记录是由大家共同验证和认可后,并由一些人通过竞争的方式最终计入账簿的,因此这个账簿就具有最高的权威性。每个人有多少钱,某笔交易算不算数,只能账簿说了算。某笔钱只要在这个统一账簿中有记录,那么大家就认可这笔钱的所有权转移,如果找不到该记录,就相当于这笔交易从未发生过,其中涉及的比特币也就不会被转移。因此,确认自己的交易在不在一个合法的大账本上,是确认比特币是否成功转移的唯一方式。

    以上就是比特币的核心思想,但是要实现以上的这些功能,不能简单的依靠约定或法令,而需要由一套复杂的数学原理和程序机制来保障。因此,比特币并不仅仅是一个简单奇思妙想,而是建立在了一套复杂的专业知识之上的。事实上,中本聪本人就是一位同时精通密码学、经济学理论、以及懂编程的天才极客;而且,比特币世界的的很多重要理论和基础其实早在之前就已经有人作出了深入的研究和成果。可以说,比特币的机制是一个多学科知识融汇交织组合创新的综合体系,有一定复杂性。因此想要弄清楚比特币的基本原理,在进行中本聪的论文分析之前,我们还需要了解一些基础概念和相关知识。

    好在这些基本知识并不复杂,也不需要多么深厚的专业功底。接下来,我们将对这些基本概念及其在比特币中是怎么应用的做简要介绍,为后续深刻理解和体会中本聪的比特币白皮书做好铺垫。为了确保通俗性,我们将忽略严谨性,只抓相关内容的主要方向。

    2.3 哈希函数

    哈希函数(Hash Function),也称为散列函数,是比特币理论中最重要的一类函数。哈希函数有一个非常神奇的功能:可以将任意长度的一段字符(称为源文或明文)抽提为一串固定长度的二进制码(哈希值)。根据抽提规则不同,目前主要包括MD4、MD5、SHA1、SHA256、RIPEMD160、TIGER等。在比特币中常用的哈希函数主要有SHA256和RIPEMD160等。

    有了哈希函数,我们就可以将任意长度的文字“压缩”成一个特定长度的字符串,并且在二者之间形成一种映射关系。在很多时候,我们甚至可以用这串压缩后的字符作为那个长篇文字的替身或者标签来使用。从哈希函数的功能和原理,我们能推导出这个函数所具有的五个神奇性质:

    2.3.1 性质1——单值性(只能一对一)

    同一种哈希计算规则下,只要明文确定,则必有且仅有一个哈希值与之对应,也就是说一个明文只会生成一个哈希值。

    但是这里要说明的是,这个值虽然只有一个,但其呈现形式并不是唯一的:采用不同的表示方法的话,同一个哈希值的样子看起来也会不一样,但本质上依然还是那个值,大小没有变。以SHA256这类哈希函数为例,其哈希结果是一个由0和1组成的256位数值,由于256位二进制数实在太长了,表示起来很不方便,因此哈希值也常常采用十六进制表示,这样256位就可以缩减到64位,字符也从0、1两种变为0-9、a、b、c、d、e、f共十六种。

    比如大写字母“A”经哈希函数(SHA256)计算后,其结果用二进制表示的话是:

    SHA256(A)=0101010110011010111010101101000010000010011001001101010101111001010111010011100100001001011100011000110011011101000001011010101111010100100101010111001011101000010011111110010101010101100100001110111011110011000110101000100010100000100011111101111111111101

    而用十六进制表示的话是:

    SHA256(A)=559aead08264d5795d3909718cdd05abd49572e84fe55590eef31a88a08fdffd

    再比如,中本聪的论文标题“Bitcoin: A Peer-to-Peer Electronic Cash System”这句话经哈希函数(SHA256)计算后的哈希值为:

    SHA256(Bitcoin: A Peer-to-Peer Electronic Cash System)=

    efb5c6729d8ce3e03fd03aec340540b24a788454d45e717089b1e59243e16f43

    2.3.2 性质2——单向性(反推不出明文)

    哈希函数的单向性是指:不论明文多么简单或者多复杂,找到其哈希值是非常容易的,只需要对该明文做哈希运算即可,但如果想从哈希值反推出对应的明文则是不可能的。也就是说,我们不能从任意一个哈希结果反推出其函数的输入值。这点类似于就算我们知道了“100个人中有40个穿了红色外套,另外60个戴了蓝色帽子这个结果信息之后,依然无法反推出这100个人分别叫什么名字”一样。

    说到底,哈希函数只是对明文的抽提和摘要,而不包括明文的具体信息,因此是无法从哈希值反推出明文内容的。哈希值的单向性为比特币内很多基本要素的安全不可逆提供了保障。

    2.3.3 性质3——高敏性(防篡改)

    对于哈希函数的明文来说,即便是产生了一点微小的变化,其新哈希值也会和原哈希值完全不同。同样,我们以中本聪的论文标题为例,仅将其中的“:”修改成“,”后,变为“Bitcoin, A

    Peer-to-Peer Electronic Cash System”,对这个明文求哈希值(SHA256)后得到:

    SHA256(Bitcoin, A Peer-to-Peer Electronic Cash System)=

    0e868099b04b14a4ce70f1ce5d5fc03efd071596ba8798036dc823e0abcb2257

    可以看出,尽管只是对原有明文做了极微小的改动,得到的这个新哈希值和2.1.1中的原哈希值也会完全不同。哈希函数的高敏性可以应用在对明文是否被篡改过的识别上,进而保护明文的初始性和真实性。在比特币中,对交易内容的哈希运算就是为了确保交易单上的重要内容不会在传播过程中被修改,或者说,只要有人修改了某个交易单上的内容,交易单的内容就和其哈希值对不上了,该交易单就会被作为无效交易单而抛弃,不会被录入。

    2.3.4 性质4——抗碰撞(很难多对一)

    不同的两个明文,经过相同哈希函数后产生的哈希值居然一模一样,这种现象称为哈希碰撞。

    从理论上来说,如果明文的字符量很大时(比如一整部书的内容),其字符变化的全部可能性肯定会远远多于其哈希值的全部可能性(毕竟哈希结果的位数是有限的),因此根据“抽屉原理”(抽屉原理:5个苹果放进4个抽屉,则一定至少有一个抽屉里装了两个以上的苹果),理论上是存哈希碰撞的可能性的。即两个完全不同的明文经过哈希运算后,其哈希值居然完全一样的情况是有可能出现的。不过,我们可以从另一个计算中得出这样的概率究竟有多低:

    以SHA256为例,其哈希值是一个256位的二进制数,因此其全部可能性有2256种,这个数字有多大呢,大概为1.16*1077,也就是说这个数写出来后,总共有78位那么长。我们再来看看整个宇宙中所有已知的普通物质的数量有多少,包括所有星系、黑洞、恒星、行星、卫星以及我们地球上所有的物质(生物、空气、水和岩石等……),组成所有这些人类已知物质的总原子数量,加起来大概为7.31*1079,这是个非常庞大的数字,大到已经很难在现实生活中给超过它的数字找到物理意义了。而哈希算法的可能性竟然和这个数字相差不多。另外,如果以目前运算速度已达到9.1亿亿次/秒的超级计算机神威.太湖之光为例,如果想要穷尽哈希运算的全部可能性,至少也要需要1052年的时间,也就是说,直至算到太阳系毁灭(大约还剩5*109年)也才刚刚开了个头。因此,对于人类现有计算能力来说,出现哈希碰撞的几率是非常非常非常小的,小到几乎不会发生。

    2.3.5 性质5——近似随机性(掷骰子)

    哈希函数的结果虽然只有唯一一个,但这个结果在计算之前是无法推测和估计出来的。这种对结果无法预先做出任何预先猜测的性质,让哈希函数在很多时候甚至被当成随机函数来使用。由于这种随机性从数学上来说,毕竟不是严格的随机性,因此称为伪随机性,或者近似随机性。

    在比特币的“工作量证明”(POW)机制中,就是通过不断的改变明文中的几个字符来检查哈希运算的结果是否达到了某种要求的。这一点很像掷骰子——虽然最终一定会停在一个点数上,但在投之前是无法知道的,只不过掷骰子结果的可能性只有六种,而哈希函数的结果可能性则有1077之多。比特币就是利用了这个特性来衡量工作量证明的,同时控制比特币产出的难度和速度。

    2.3.6 WHY SHA256?

    正是基于以上哈希函数这些独特的性质,在比特币世界中,哈希函数,尤其是SHA256函数被广泛应用到数据索引、签名验证、工作量证明等多个环节,可以说哈希函数是比特币世界中最重要的密码学原理之一。在众多哈希算法中,中本聪最终主要选择了SHA256,主要是因为在2008年SHA256被公认为当时最安全的哈希算法,即便经过十年时间,SHA256依然经受住了无数应用的考验,证明了其安全性。尽管后来出现了SHA-3,SCRYPT等其他算法,在目前人类的计算条件下,SHA256算法依然不可逆,具有很高的安全性。即便未来量子计算取得突破,在多次SHA256面前也依然是安全的。

    总之,由于比特币内的很多机制都是对哈希函数各种性质的实际应用,因此可以说,哈希函数对比特币系统至关重要,理解哈希函数对于理解比特币的基本原理十分关键。

    2.4 非对称加密

    2.4.1 什么是非对称加密

    自从人类掌握了信息通讯技术,为了保护信息安全,防止第三方看懂甚至篡改所传输的信息,我们就需要对信息进行加密。过去的加密方式一般采用对称加密的方式,简单的说,就是A向B发送的一段信息,其中加密和解密运算都选用了同一个秘钥(通常为一串字符),这样在不知道这个秘钥的情况下,任何人即便截获这段信息也完全看不懂,更无从篡改了。这种方式在一定程度上缓解了信息盗取的风险,但仍然不完美。这是因为,B想要看懂信息也需要知道秘钥是什么,因而秘钥也需要从A传输给B,在这个过程中依然存在被监听和盗取的风险。一旦秘钥被盗取,之前监听到的信息依然可以被破解。因此,采用对称加密还是无法保证信息传输的绝对安全传输。为了解决这个问题,1976年由密码学家Whitfield Diffie和Martin Hellman博士联名发表了论文”New directions in cryptography”,这一论文通常被认为是非对称密码的开端。

    与对称加密不同,非对称加密的秘钥不是单一的一个字符串,而是一个“秘钥对”,包含一对儿不同的秘钥,分别称为私有秘钥和公开秘钥。其中私有秘钥可以自行选取,而公开秘钥则是由私有秘钥计算产生的。一段信息如果用公开秘钥加密后只能用私有秘钥才能解开;反之,用私有秘钥加密的信息也只有公开秘钥才能进行验证。

    采用非对称加密后,如果A想要向B发送一个秘密信息,B就可以大大方方的先把自己的公开秘钥发给A作为加密秘钥,即使被别人截获也没关系(公开秘钥也解不开用自己加密了的信息)。然后,A就可以用B发来的公开秘钥将要发送的信息加密,再将加密后的信息直接发给B。在这个过程中,即便别人全程截获所有信息也不怕,因为B的公开秘钥只能加密不能解密,世界上能解密该加密信息的东西只有一个,就是B的私有秘钥,而这个私有秘钥由始至终只有B拥有,从没有向外有过任何透露。这样,对称加密技术时代存在的“秘钥传输不安全问题”就得到了圆满解决。

    2.4.2 非对称加密在比特币中是咋用的

    在比特币世界中,因为传输的不仅是信息,还包括价值(比特币),因此需要加密技术保障安全,同时比特币交易还有一个额外的好处,即:比特币中转账并不需要知晓并核对收款人的详细信息,来防止“千万别汇错了人”这件事,付款人只需要按双方约定,将比特币转账给一个特定的地址(实际上是收款人公钥哈希值)就可以了。但是这里会存在一个问题:由于比特币中的所有交易信息都是全网公开的,且不存在一个像支付宝这样的中心机构,谁都没有权利给任何人的账号余额上加钱或减钱。那么如何确认收款人已经收到钱了呢?又如何防止别人冒领的呢?

    比特币机制里设计了一个非常巧妙的方法:付款人在把钱转账给收款人地址之后,并不需要确认收款人是不是收到了,而是在转账的同时附加了一个测试题目及其解题操作方法(scriptPubKey),就算完事儿了。这么做的目的是在说:“请大家见证哈,我已经把钱转账给xxx(收款人)了,这笔钱已经不是我的了,但为了防止别人冒领,这个xxx想花这笔钱的时候还不能直接花,而是先必须按照我提出的操作方法完成测试,通过了才可以,否则他也无权花这笔钱。我出的那个测试题目其实人人都可以试哈,不过我猜你们通不过!”

    采用出测试题验证身份的这种方法听着不靠谱,但事实上付款人知道,只有拥有与他所转给的那个公钥哈希值所对应的私有秘钥的那个人才能通过测试,而那把私有秘钥始终安全的保存在收款人手里,其他人由于没有这把私钥,无论怎么试都通不过,因此这个方法很安全。

    在比特币中应用非对称加密原理主要为了让大家验证“交易信息加密用的那个私有秘钥和公开秘钥确实是一对儿”,也就是上一小节“反之”后的那部分。这里的秘钥对儿在比特币中实际上就是收款人的比特币私钥(以下简称私钥)和比特币公钥(以下简称公钥)。由于私钥和公钥是成对的,并且私钥永远自己保管,用私钥加密的信息只能用唯一对应的公钥解开,而且如果同时证明了这个公钥对应的人拥有这笔比特币的所有权,那么就证明这笔交易是合理合法的。其具体方式会在后续签名/验证、论文解析和流程推演环节中详细涉及。

    2.5 私钥、公钥、公钥哈希、地址、签名及验证

    2.5.1 一个小提示

    标题中的这些内容其实本质上都是一些二进制数值。和所有数值一样,在实际书写的时候选择的格式不一样,其表达形态就不同。比如用二进制表示时每个字符就是1个bit(位),用十六进制表示时,每个字符可以表示4个bit,而用标准字节表示数值长度的话,每个字节表示8个bit,每个十六进制字符占半个字节长度。以后面要介绍的公钥哈希为例,用二进制表示是160个字符(仅含0和1);十六进制表示的话当然就是40个字符(160/4=40,这里的字符仅由0-9、a、b、c、d、e、f这十六个组成);而换算为标准字节长度时就变成了20个字节(160/8=20,比特币中没有所谓的标准字符,一般只用标准字节来衡量某个数值的长度)。“字节数”和“字符个数”是两个不同的概念,后续介绍中,由于很多数值位数较多,容易弄混,给理解和学习带来一些干扰,可稍加留意。

    此外,比特币中的“私钥”和“地址”还会采用了一种BASE58格式(可以理解成一种58进制的表示方法)。与常用的字符类型相比,BASE58字符由1-9(不含0)、a-k、m-z(不含l)、A-H、J-N、P-Z(不含O和I)组成,且不含+和/等,共58个字符组成,也就是说,所有容易认错和隔断双击复制的字符都不含。不过“私钥”和“地址”等数值一般也不会直接转成BASE58格式,而是在转化前,还要再加上了一些额外数值(此时其二进制数值已经发生变化了)。以对“公钥哈希“进行BASE58运算后得到“地址”为例,公钥哈希本身20字节,转化前需要再加上1字节版本和4字节校验位共25字节,对这25字节数值BASE58运算,转化后得到的字符总数一般为27-34个,就是我们常说的比特币地址,后续会介绍到。

    尽管不同的表示方法下,同一个数值看起来非常不一样,但其实本质上他们很多都是同一个数,大小也完全相同,并且都可可逆的转换为同一个由0、1组成的二进制数值。在本文中,“公钥”、“公钥哈希”、“签名”一般为十六进制表示,“私钥”和“地址”一般以BASE58形式表示。

    2.5.2 私钥

    比特币私钥(简称私钥)就是一段256位的二进制数字,通常是随机产生的。这个数字在后续依照不同算法可以依次生成公钥、公钥哈希、地址、以及签名等其他重要内容,是用户花费其下比特币的唯一凭证,因此私钥是比特币用户最最重要的内容,需要严格保存防止泄露。

    私钥一般有三种表示方法:直接十六进制表示(64位)、BASE58非压缩(以5开头)和BASE58压缩(以K或L开头)。这些不同的表示方法本质上还是由那段256位的二进制码直接格式转化而成的,不过是对其附加上了一些附加变换和校验计算(BASE58),目的是为了便于肉眼识别,手动输入时不至于写错,同时万一输错了,系统也会发现(因为校验码会对不上)。其中BASE58压缩格式为目前主要的表示方式,比如:

    KyGBudocz4pvJBLboJPvBpyhrE8g8igsQWepftnLouzLXejnQR88就是一个BASE58压缩格式的私钥,其计算公式如下:

    私钥=BASE58(version+256位随机数+是否支持压缩)

    在比特币中,私钥的作用有两个:

    1、生成公钥;

    2、对任意一段信息(如某个交易的哈希值)进行签名,也就是进行非对称加密。(详见2.5.6 签名和验证)

    2.5.3 公钥

    比特币公钥(简称公钥)是由私钥生成的。其生成算法为椭圆曲线数字签名算法(SECP256K1,不懂这个算法对理解比特币基本原理影响不大,反正就是不可逆,很安全)。这个过程和哈希函数有些类似,也是单向的,即:私钥可以生成公钥,但反过来用公钥是无法推出私钥的。其计算公式如下:

    公钥=SECP256K1(私钥)

    与上述的私钥形式相对应,公钥也包括两种形式:压缩型和非压缩型(压缩型是比特币开发人员后来意识到的,根据椭圆曲线算法,原来的公钥值的一部分实际上是冗余的,因此可以通过压缩节省空间,进而减少交易信息长度,为了兼容旧的冗余版本,而重新引入了压缩型的公钥形式),二者可以随时相互转换。早期的公钥为非压缩型公钥,以“04”开头,长度为65字节(十六进制表示下是130个字符);目前新的比特币客户端均默认采用压缩型,其公钥字节长度为33字节(十六进制表示下是66位),以“02”或“03”开头。如:0324c073fa0616619b0b28b6933b08ef888492c18810774b1f340c0fe6b0bb3b75就是一个公钥。这里公钥主要是用十六进制表示的,不必采用BASE58编码主要是因为公钥很少需要用户直接辨认或操作,因此不必经过BASE58转化。

    在比特币中,公钥的作用主要有两个:

    1、 收款人使用某笔钱时,需要提供自己的公钥来证明之前别人给他的钱到底是不是给他的;

    2、验证私钥签名(加密)后的交易信息。(签名/验证功能)

    公钥也是比较重要的信息,尽管公开公钥不会造成用户的比特币被盗取,但别人就可以很方便的查到该用户以往的交易记录,容易造成用户隐私的泄露。也因此,才会出现后续的公钥哈希和地址。这里收款地址不直接使用公钥而使用了公钥的哈希值的目的主要是为了进一步保护收款人的公钥不被泄露。

    2.5.4 公钥哈希

    “公钥哈希”既是一个专有名词,也可以理解为是对公钥进行多重哈希计算后的得到的值。具体来说,它是对公钥先进行一次SHA256,然后再进行一次RIPEMD160,最终形成一个20字节的字符串,比如:“46af3fb481837fadbb421727f9959c2d32a36829”这段用十六进制表示下的字符,就是著名的“比特币披萨交易”中的收款人的公钥哈希,是由其公钥0434417dd8d89deaf0f6481c2c160d6de0921624ef7b956f38eef9ed4a64e36877be84b77cdee5a8d92b7d93694f89c3011bf1cbdf4fd7d8ca13b58a7bb4ab0804计算而来的。

    其具体计算公式如下:

    公钥哈希=HASH160(公钥)=RIPEMD160(SHA256(公钥))

    这个计算也是单向而不可逆的,即:将公钥经HASH160计算可以很轻易的得出公钥哈希,而从公钥哈希不论怎样都得不出公钥值。

    公钥哈希的作用主要就是代替公钥作为转账地址,从而可以尽可能的隐藏和保护公钥不被公开。

    2.5.5 地址

    地址和公钥哈希其实是一回事儿:就是在公钥哈希的基础上加上了版本号和校验码,从20字节变为了25字节。同时由于地址是需要用户常常输入的部分,因此还需要再经过一个BASE58转化,便于识别。地址和公钥哈希可以随时相互转化。其计算公式如下:

    地址=BASE58(version+公钥哈希+双SHA256校验)

    =BASE58(version+公钥哈希+GET_FOUR(SHA256(SHA256(公钥哈希))))

    如:17SkEw2md5avVNyYgj6RiXuQKNwkXaxFyQ就是2.3.4中的公钥哈希所对应的地址,二者可以相互转化。

    综上,可以看出,公钥、公钥哈希、地址都是由私钥经过某些运算生成的,它们彼此之间的转化关系如下图所示:

    2.5.6 签名和验证

    付款人在制作交易单时会在其中附上两样东西:

    一个是付款人对这个交易单上内容的签名,另一个就是自己公钥。签名就是加密,附上的公钥是解密钥匙,目的是为了让所有人都能很方便的帮他验证他签名的交易是否合法。因为只有被大家验证过的交易单才会被计入账簿,而交易只有被成功计入账簿,才意味着交易单上转账的金额正式完成。

    2.5.6.1 签名

    签名就是付款人用自己的私钥对交易内容进行确认并加密,签名只能由付款人自己来完成。在比特币中的签名过程实际上就是运行了一个签名函数(SIGN),这个函数的自变量有两个:一个是付款人的私钥,一个是交易内容的哈希值,公式为:

    签名=SIGN(私钥,交易内容的哈希值)

    签名的核心目的是为了明确两件事:

    1、内容——“我同意这个交易单上的内容,但仅限这上面的内容”——内容一旦有改动,这个交易单就作废;

    2、身份——“我是这个公钥的所有人,因为只有我签名的信息能用这个公钥解开”——确定签名人有权花这个公钥里的钱。

    2.5.6.2 验证

    比特币世界中的任何人都可以对当下任何交易单进行验证,验证的人越多越好。验证的内容包括主要包括两部分。第一部分:一个是验证某个公钥下是否有足够的钱;第二部分:另一个就是对交易内的签名进行。两部分分别是为了确认以下两件事:

    1、第一部分:“他有钱”——付款人提供的公钥和当初别人汇钱给他时写的那个公钥,二者对的上。也就是说,汇款人支付的这笔钱确实是之前别人给过他,并且已经成为其资产的,而不是凭空捏造出来的。也就是说,要验证的是付款人提供的公钥下余额是否足够。这一部分不是通过非对称加密来实现的,而是通过单纯的比对同一个UTXO在不同的两个交易中所对应的公钥哈希是不是同一个来实现的,这部分内容我们会在后续的UTXO、MerkleTree和SPV环节中有所涉及。

    2、第二部分:“他愿意”——这部分验证就是利用非对称加密的方法来实现的。付款人用私钥对交易进行签名(加密)就是表达愿意支付这部分钱。如果再能证明这个签名和有钱的那个公钥是一对儿,就说明公钥所有人和付款人是同一个人,而且他愿意做出这笔支付。对这部分来说,要验证的就是用提供的公钥能否解开签名内容。其验证方法与上一节中的签名是相互对应的,具体方式为:任何人都可以先对交易内容执行一次哈希运算得到一个值,用β表示;同时再根据非对称加密原理,利用交易单中付款人提交的公钥对这个签名进行解密,解密后得到付款人自己当初对该交易内容做过的一次哈希运算的值β’。大家来验证这两个值是否相等。如果:β=β’,则说明:

    1)  大家收到的交易单中的内容和当初付款人制作交易单时的内容完全一致,中间没有人动过手脚

    2)  交易单中包含的这个公钥和付款人的私钥是一对儿(因为用这个公钥能解开该签名),由于私钥别人不会有,所以公钥的主人也就是付款人。(比特币系统只认私钥不认人,因此私钥绝对不能丢)

    总结一下,这两个部分所要验证的逻辑就是,先看看付款人提供的公钥下是否有钱,再看看该公钥能否解转账人加密了的交易单。如果以上两部分都没问题,大家就认为付款人拥有这个公钥下的钱的支配权,同时也愿意把这部分钱花出去给另外一个人。这样,大家就会把付款人提交的这个交易单打包到新的区块里,永久记录在案,交易就完成了,这笔钱也成了收款人的了(但是他想花出去的时候,也得类似来这么一遍)。

    相关文章

      网友评论

          本文标题:搞懂区块链,你是不是先该看看中本聪的论文(02)

          本文链接:https://www.haomeiwen.com/subject/zwodaftx.html