区块链深度学习系列|区块链进阶原理:转账
本系列内容包含: 基本概念及原理、密码学、共识算法、钱包及节点原理、挖矿原理及实现。
转账流程
大家都知道,我们日常使用银行卡进行转账的时候,一般需要填入户名、对方的账号、转账金额以及一些转账附言,接着输入密码以后,就把资金转到对方的账户了。
那这个流程背后的整个系统是如何运转的呢?
假如张三在招商银行开的户,他要将一笔资金转到李四在工商银行的开户行。
那么张三提交转账申请后,其转账卡所在招商银行支行,验证了用户名和密码以后,会将这笔交易提交给招商银行的总行,然后由招商银行的总行将这笔交易,发送给中国人民银行大额或小额的支付系统。
最后,这笔转账交易到达了李四开户的银行工商银行总行,并逐级向下,最终到达李四开户的网点支行。
区块链转账系统又是如何运转的呢?拿比特币系统来说,它是一种 点对点的电子现金系统 ,我们具体看一下整个过程是如何运转的,大家看一下比特币白皮书中的流程图。
假如张三需要向李四转10个比特币,
首先张三需要打开自己的数字货币钱包,然后扫描或者输入李四的钱包地址,接着张三填入需要转账的金额,以及选择对应的手续费之后(手续费高低对应转账速度),最后输入支付密码,点击发送,就完成了。
这整个过程和传统转账的交易是很类似的,都是需要输入对方的账户、转账金额以及支付密码,然后点击发送,最后资金到达对方账号或钱包,交易完成。
区别
两者之间关键是中间资金流转部分的区别。首先,张三的钱包通过其私钥对交易进行签名,钱包将签名的交易广播到所有这个钱包连接的比特币节点上。
第二步,这些节点,广播到比特币的其他节点,所有节点都将对这个交易的合法性进行验证。
第三步,如果这个交易是合法的,那么这个交易将会放到待打包的交易序列中,也可以称之为 内存池 或者 交易池 ,列表中的交易被称为 未确认交易 。
第四步,比特币矿工会从节点中获得待打包的交易,并开始构建下一个区块,也就是挖矿。
第五步,当矿工挖出一个符合要求的区块后,矿工会将这个区块第一时间广播给系统的所有节点。
第六步,所有节点对广播过来的区块进行验证。如果验证通过,将这个区块添加到本地的账本。
最后,李四的钱包连接到新的节点,新节点的区块中包含了张三的转账信息,这时李四就通过自己钱包就看到了这笔转账成功。
运转原理
请大家思考两个问题:1.为什么使用张三的私钥进行签名,就可以被全网的所有节点接?。
2.这笔交易中已经包含了张三签名,也就是别人都有了张三的签名,那是否后续别人也可以用这个签名仿张三的签名,把张三的资金偷走?例如模仿一张支票的签名来伪造其它支票。
这里就涉及到密码学中的一个 非对称加密 的相关知识,后续我们再详细讲解这部分的知识。今天主要简单介绍一下非对称加密算法在这里的用法。
大家常常听到的加密算法一般是对称加密,也就是通讯双方都具有双重的钥匙。
举个例子,对称加密就好比给一个门装上锁,只有有钥匙的人才能开门,但是所有人的钥匙都是一样的,这就是 对称加密 。
而非对称加密与对称加密最大的不同就是: 通讯双方不需要有相同的钥匙。
就好比甲用了钥匙A把门锁上,乙可以用钥匙B把门打开,这两把钥匙对应非对称加密中的 私钥 和 公钥 。
私钥和公钥是 一一对应的 ,由私钥可以产生公钥,但是由公钥不能反推回私钥。
非对称加密的流程。
1.发送方生成公钥和私钥;
2.使用私钥对数据进行签名;
3.得到签名后的密文;
4.将密文和公钥发送给接收方;
5.接收方通过公钥对密文进行解密。
6.证明密文是经过发送方的私钥签名的。
其实这里就解答了第一个问题,因为张三使用私钥对交易数据进行了签名,同时全网都可以有张三的公钥,通过公钥和签名就可以验证交易的合法性。
我们再来看一下第二个问题。
如果李四收到了张三转的10个比特币,他是否可以把这个交易继续广播到比特币网络中,从而不断的从张三的账户中转出10个比特币呢?
这个答案是: 肯定不行 。我们可以看一下交易结构。
在每个比特币交易结构中都包括: 输入(input) 以及 输出(output) 两部分。
输出中包括了收款方的信息,比如上面的数量和锁定脚本。锁定脚本指定了接收者的比特币地址,以及什么情况下,这个比特币可以被花费。
而上面的输入,包括了前序交易的ID,前序交易的序号决定了输入在交易中排第几,以此解锁脚本。
前去交易的这些信息被称为 UTXO(未花费交易) 。
由于每个 UTXO 只能被使用一次,所以即使张三需要继续给李四转10个比特币,由于前面的input已经变化了,所以签名内容也会完全不同。从而,即使相同的交易,也不能被重复的广播到比特币的网络中。
我们继续看一下 UTXO,有人可能会问,如果我这一个 UTXO 都用完了,后面我怎么转账呢?
其实我们日常生活中大家常用的,比如说银行、支付宝、微信这些,大家比较熟悉的是一个账户模型:我有一个账户,账户里有一个余额,我转出多少,账户就剩多少,每个人有一个或者多个账户。
这种模型是大家非常容易理解的,但是 UTXO 模型与账户模型有很大的不同。
个人理解 UTXO 模型更像是支票,就好比在比特币网络中是一张张比特币支票在不断的流转,当有一笔比特币转入的时候,就产生了一个新的 UTXO,当向外转账的时候,钱包将会选择一个足够金额的 UTXO 作为交易的输入。
然后将找零金额和找零地址,作为交易的输出,构建在这笔交易中,当这笔交易被比特币网络确认的时候,这个交易中使用的一个 UTXO 就失效了。
同时因为有一个作为找零的输出,所以这个钱包就得到了一个新的 UTXO,就相当于又得到了一个新的支票。
由于前面的 UTXO 已经失效了,所以说对应的签名肯定也是失效,因此也就不能被重复使用。
这里问大家一个问题:既然我知道了张三的地址和公钥,那为什么不能从这个地址和公钥反推回他的私钥呢?
假如李四有张三的地址和公钥以后,反推回张三的私钥,李四不就可以把张三的钱花掉了吗?是什么机制保证保证了这个不可逆呢?
请往下看
公、私钥的转换过程
私钥是通过椭圆曲线的算法得到了公钥,公钥经过多次的哈希运算,得到了这个公钥的哈希,之后再通过 Base58 的编码得到了地址。整个过程中,从私钥到公钥,以及公钥到哈希的过程信息多次被压缩,都是单向的,也都是不可逆的。所以说,通过公钥的哈希是无法得到公钥的,也同时无法得到私钥。
而私钥从何而来的呢?私钥其实就是一个随机数。这个随机数的范围是1~2的256次幂,范围大约是10的77次方。目前宇宙中可见的粒子大约是10的80次方。
拿比特币来说,比特币全网已经使用过的粒子,也就是全球的地址大约是2400万,也就是10的8次方。大家可以想象一下这两个空间之间数量级差了多少,所以说比特币地址的空间是非常非大的,发生碰撞或重名的机会微乎其微。
有的朋友也听说过一件事情,就是某一个人注册了一个新的数字货币钱包,但是这个钱包创建完成以后,他看到这个钱包有过交易记录。简单的说就是他创建的这个个钱包曾经被别人使用过。
那是到底什么情况会发生这种事情呢?
一种情况是真的发生了碰撞,就好像高能粒子对撞机,每几十亿次实验就会发生几个粒子的碰撞。虽然碰撞的概率非常小,但并不是不能发生。
另一种情况就是由于钱包开发者或供应方的原因,钱包的随机数生成模块有问题,导致了钱包的随机数空间非常小。这样会指数级的提高发生碰撞的概率。
(后面我们会在钱包的分类应用中详细的介绍这些知识。)
我们通过下面的图来总结一下:
首先是私钥产生一个随机数;这个随机数通过椭圆曲线的转换得到公钥;公钥经过 SHA-256 以及 RIPEMD-160转换得到公钥哈希;最后经过 Base58 编码得到比特币的地址。
大家可以看到从私钥-公钥-公钥哈希-地址这个流程,信息被多次压缩,除了最后一步 Base58 是可逆的以外,其余只要数据压缩,就会造成数据的丢失。所以说这个过程是绝对不可逆的,这也保证了数字货币的安全。
这里大家可以预先思考一个问题:既然从私钥到公钥是不可逆的,那为什么我们不使用公钥来做数字货币的接收地址,而必须把公钥转成公钥哈希,之后再经过 Base58 转换成接收地址呢?
我们将在下期进行解答
Dogecoin Price Tests Panic Zone At $0.21, Breakdown Could Lead To Price Crash
Dogecoin is currently showing signs of selling pressure after shedding much of the bullish momentum ...
Ethereum Faces Potential Pullback as Technical Signal Emerges
TD Sequential signals trend exhaustion near $2,500 as $ETH stalls after rally; resistance seen at $2...

XRP Primed for Epic $9 Price Explosion As Institutional Money Floods Back Heavily
XRP Primed for Epic $9 Price Explosion As Institutional Money Floods Back Heavily