查看原文
其他

一文看懂比特币钱包和交易

2017-08-20 段扬扬 扬帆沧海

想必很多人都听说过比特币钱包,在比特币世界里,要想交易就必须先拥有一个钱包。但是如果我告诉你比特币钱包只是包含了若干数字和字母等组合的数据串,不知道你会不会蒙圈,也许你会惊呼,难道有了这些数据串就能在玄乎的比特币世界里交易了?没错,就是这么玄乎。

不过等你看完了这篇文章,可能你就不会觉得玄乎了。为了表达的方便,现约定上文提到的数据串也叫字符串,字符可以简单理解为数字、字母、各种符号的统称,字符串就是一串字符组成的集合。

比特币钱包

我们平常见到的钱包,一般是指存储现金、银行卡的实物钱包,还有像支付宝钱包等第三方数字钱包,它们本质上存储的都是法币,也就是在社会上普遍流通,并被国家认可的货币,诸如人民币、美元等。

但是比特币钱包跟它们有本质的区别。比较官方的定义是:

比特币钱包指保存比特币地址和私钥的软件,可以用它来接受、发送、储存你的比特币。

这里的比特币地址其实就是一个字符串,用来告诉别人可以向这个地址转账交易,私钥就是用来标识你对交易的比特币的所有权,可以简单理解为交易密码,且私钥也是一个字符串。那这两个地址是如何产生的呢?

既然有私钥就会有公钥,这两个都是加密学上的概念,本文不打算讨论具体的技术细节,我们只需要知道私钥是你随机生成的一个字符串,根据私钥通过非对称加密方法可以得到一个唯一的公钥,如果已知公钥是无法反推出私钥的。私钥拥有绝对高的保密性,不能让任何人知道。

私钥和公钥有一个非常重要的特性,就是公钥加密过的数据只能通过私钥解密,而私钥加密过的数据也只能公钥解密,换句话说私钥加密过的数据即使是私钥也无法解密,公钥也是一样的道理。由于加密和解密需要两个不同的密钥,故被称为非对称加密。

公钥经过哈希计算就可以得到比特币地址了。这里又出现了一个概念:哈希计算(我内心其实是拒绝引用这些专有名词的,但是请相信我这个概念真的很重要,不得不提)。哈希计算可以简单理解为:任何长度的字符串经过哈希计算都可以得到一串固定长度的字符,也就是说任何的字符信息通过哈希计算,都可以用唯一的一个固定长度的字符串来一一对应。

以上就是私钥、公钥以及比特币地址的简单介绍,用一张简单的图表示就是:

也许你看完了上面的描述,还是一头雾水,私钥和公钥相互加解密在比特币交易中有什么用呢?别急,我们接下来聊聊比特币是如何交易的。

比特币的交易

要说想明白比特币是如何交易,就必须先了解比特币的网络是什么样的。

现有的绝大部分互联网应用都是服务器/客户端(C/S)模式,也就是一个统一的中心为所有的终端设备提供服务,比如说所有人的微信访问的都是同一个中心服务器,只不过这些服务器设备不一定存放在一起。

而比特币的网络是去中心化分布式结构,也叫P2P(Peer-to-Peer)结构,它是有很多的节点共同维护的,每个节点都和有限的相邻节点连接,不存在一个节点和所有节点相连,同步数据是靠每个节点不断向相邻节点扩散完成的。

C/S模式存在被攻击和数据被篡改的风险,比如说黑客一旦攻击了C/S模式下的服务器,所有的客户端就都不能访问了,而且一旦有人恶意篡改服务器的数据,那后果将是灾难性的。这就如同一支军队,一旦单向的指挥系统被破坏或者司令被擒获,整支部队可能就会迅速溃败。

但是P2P结构就不会有上述风险,因为即使一个节点被攻击,其他节点照样可以正常工作,而且每个节点都有一份数据备份,即便有人更改了一个节点的数据,也无济于事。这就如同多个人签署同一份合同,即便有人改了其中一份合同,那也不影响最终的结果。

可能有人会说了,我把这些节点的数据都改了不就成了,但是要知道比特币在全世界目前有至少5000多个节点,试问谁有如此大的能力,更改分布在全世界各地的所有节点。而且根据之前一篇介绍区块链的文章不懂技术?老司机带你轻松理解区块链知识可知,更改每一份数据代价也是非常大的,需要非常强大的计算机算力才行,看看世界各地那些大型的专业设备,就知道要付出的算力代价有多大了。

当有一笔交易在某个节点产生的时候,会迅速传播到与之相邻的节点。相邻的节点会验证这些交易信息是否有效,数据是否完整,是否有被篡改,如果验证一切正常的话,它会将其暂时保存起来,积累到一定数量后打包成一个区块(如果不理解区块的话,建议先阅读不懂技术?老司机带你轻松理解区块链知识)。同时它又会将其传播到与之相邻的节点,每个节点都会做相似的验证和保存过程,很快全网就都会收到这笔交易。

说了这么多,好像都是在说比特币的交易,但是这跟私钥、公钥以及地址有什么关系呢?别急,说完了交易过程,就可以解释这三个字符串到底有什么作用了。

交易签名和验证

为了方便理解私钥、公钥和地址这三个概念,也为了表述方便,这里假定一个虚拟的交易场景,A要给B转账1个比特币,接下来我们来分析一下具体的交易过程。

首先A的钱包软件会构建一个交易输出,里面会包含一段程序代码,这段代码说 “这个输出谁能拿出一个签名和B的公开地址匹配上,就支付给谁”。B的公开地址就是他的公钥的哈希值,也就是说A在转账的时候,用B的公钥对交易进行加密等操作,这样就保证了这笔交易只有B才能验证,那么比特币就可以安全地转到了B的钱包中了。

就如同A把钱通过银行卡转账给B,会指明B的银行卡地址,那么只有拥有这张银行卡密码的B才能确认这笔交易。对于其他人,包括A都不能取这笔钱。非对称加密的特性——公钥加密后只能私钥解密——决定了,一旦一笔交易产生,交易的发起者也不能篡改,因为他没有B的私钥,这样就可以保证比特币的交易不存在违约,或者一方不认帐的问题。

说到这里其实你应该已经明白私钥、公钥以及地址在交易中大致起的作用了,当然这个过程的签名和验证还是很复杂的,这里只是尽量简化了大部分的交易细节,只是希望让没有任何技术背景的同学能看懂。

还有一点需要补充的是,在比特币的世界里,任何的比特币都是以“未使用的交易输出”存在的。什么意思呢?就比如说别人给了你10元人民币,那么你的资产就是这10元,10元就是一个“未使用的交易输出”。如果你想再给其他人转账6元,那么就只能用这10元去转账,而不能事先将其拆成6元和4元。也就说比特币交易如果输入和输出不对等,只能通过找零的方式,而不能提前将输入拆成多份。



比特币的存在形式就是一系列的“未使用的交易输出”,不存在将一个“未使用的交易输出”再细分的行为,也就是说你不能将上面的10元钱分成10张一元钱。说得再直白一点就是,你的资产都体现在一笔笔的交易中,你如果想再进行交易,就只能用之前交易的账单直接去交易。

那你可能还有疑问了,第一笔交易是怎么产生的呀。其实答案也很简单,“中本聪”,也就是比特币的发明人,在进行第一笔交易的时候,允许没有输入,然后接下来的交易就必须有输入,才能输出。想想之前提到的创世区块,其实是一样的道理。

当然每一笔交易都会有交易费,这是为了奖励比特币网络中的矿工,至于什么是矿工以及挖矿是怎么一回事,下一篇文章我会详细介绍,欢迎你持续关注。

如果你觉得这篇文章对你有帮助,赏个咖啡钱吧,也欢迎你转发。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存