学习
实践
活动
专区
工具
TVP
写文章

区块链学习笔记之区块链初探:比特币交易结构及过程

由于比特币是区块链的第一个有效应用。所以学习区块链一定先从比特币入手。

比特币区块链,顾名思义就是由不同区块按照先后顺序链接起来的链条。

我们先来看一下比特币的区块数据结构。

比特币区块的数据结构

1.魔数,0xF9BEB4D9,是一个固定常数,用来分隔区块

2.区块大小:整个区块的大小

3.版本号:软件版本

4.父区块头哈希值:区块的这个位置总是指向前一区块的区块头哈希值,区块就是通过这种方式链接起来的

5. Merkle根哈希:本区块的交易的merkle根

6.时间戳:Unix时间戳

7.难度目标值=最大难度值/难度值

最大目标值是一个定值:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

难度值:系统每隔两周(即经过2016 个区块)会根据上一周期的挖矿时间来调整挖矿难度(通过调整限制数的大小),来调节生成区块的时间稳定在10分钟左右。为了避免震荡,每次调整的最大幅度为4倍。

8. 随机数Nounce:挖矿时矿工计算,满足SHA256(SHA256(version + prev_hash + merkle_root + ntime + nbits + x ))

区块体数据结构

区块体首先是交易数量,表示本区块有多少笔交易。

交易中存放的是货币所有权的流转信息,所有权登记在比特币地址上(Public Key)。这些信息是全网公开的,以明文形式存储(比特币系统里的所有数据都是明文的),只有当需要转移货币所有权时,才需要用私钥签名来验证。

lock_time是一个多意字段,表示在某个高度的Block之前或某个时间点之前该交易处于锁定态,无法收录进Block。

若该笔交易的所有输入交易的sequence字段,均为INT32最大值(0xffffffff),则忽略lock_time字段。否则,该交易在未达到Block高度或达到某个时刻之前,是不会被收录进Block中的。

一笔交易由1或多笔输入,1或2笔输出组成。输出分为支付和找零。如果没有找零那么只有一笔输出支付。矿工费=所有输入-(支付+找零),如果在交易的时候没有写找零,那么意味着除去支付部分全部是矿工费。当然,目前这些全部由钱包操作,不必担心不填写找零的问题。钱包会给我们默认一个矿工费或者让我们填写矿工费。

交易分三种:挖矿(Generation TX)、合成地址交易(Script Hash TX)、普通交易(Pubkey Hash TX

Generation TX

这种交易的输入就是含有coinbase字段的交易。因为是挖矿所得,所以这种交易类型没有输入,输入的地方只有coinbase,coinbase可以由矿工填写自己想填写的信息,是挖出块的矿工的特权。著名的创世区块的coinbase就是中本聪填写的2009年2月3日泰晤士报的头版新闻标题。

输出数量就是矿工所得,地址是矿工的地址。

Script Hash TX

这种类型的交易比较少见,但是很有意义。该类交易的地址不是常用比特币地址,而是一个合成地址。这个合成地址以3开头。该地址可以由1-3个公钥合成计算得到。在花费该地址的币的时候同样需要对应的1-3个私钥签名。

Script Hash TX

这就是普通交易类型。由多笔交易输入,1-2笔交易输出(支付+找零)构成。

普通交易结构为

普通交易输入为

普通交易输出为

备注:1葱=1亿分之1比特币

私钥,公钥,地址

私钥是一个随机数,一串256位二进制数字。比特币软件采用操作系统底层随机数生成器来产生256个二进制数,生成私钥。私钥由个人保管,一定要保管好,有了私钥才能表示你拥有相应地址的比特币所有权,如果私钥丢失,那么比特币就永久躺在网络上,无法被花费。当然现在我们大家都有钱包,钱包也会在本地给我们保管私钥,但是一旦钱包卸载,那重新下载钱包的以后是需要导入你的私钥的。为了去中心化,钱包不会在服务器里保存我们的私钥。

公钥是由私钥通过椭圆曲线加密算法得到。其过程是不可逆的。也就是说由私钥可以得出公钥。但是有了公钥,无法得出私钥。

比特币地址是一个由数字和字母组成的字符串,由公钥通过一系列加密计算和编码得出。同样公钥得出地址是不可逆的。

在这里,一定会有人问:私钥既然是随机的,位数是固定的,那么有没有可能两个人的私钥是相同的,或者说某个人的私钥被破解了。我在这里说一下,如果私钥的产生是随机的,那么2的256次方是非常庞大的数字,大到比地球上的原子个数还多。所以随机产生2个相同私钥的概率要比在地球上找到2个完全相同的树叶还低得多,这完全可以看做概率是。

创建交易

假如Alice想转10个比特币给Bob。那么她必须在她的客户端(可以是钱包)进行操作。她必须保存好私钥,用私钥完成签名,然后提供签名+公钥。公钥用来对比上一笔转出中的公钥(地址),证明上一笔转出目标是Alice。也就是证明Alice拥有这笔比特币的所有权。但是这还不够,因为公钥是不保密的。所以还需要校验签名。签名是通过私钥签名的,私钥是绝对保密的。所以再完成公钥来校验签名,成功了。就表示这笔比特币属于Alice。

公钥是可以通过私钥加密计算得来的,而地址可以通过公钥采用Base58计算得来。地址只是为了方便使用。毕竟公钥是由私钥经过椭圆曲线算法得到的X和y坐标,每个坐标都是32位,不方便使用。所以公钥再经过Base58check算法得出地址

所以,准确的说,交易是发起人Alice解之前交易输出(UTXO:Unspent Transaction Outputs未花费的交易输出),然后支付给Bob,同样是给Bob出题。如果Bob想花这笔钱,他就需要解题(用私钥的签名和公钥来证明这笔BTC所有权是他的)。

假设Alice发送给Bob的10个BTC是这么构成的:其中3个是Tom发送给Alice,8个是Lucy发给Alice,那么Alice需要找零1个(现实中发送需要手续费,可能只找零0.99个,0.01作手续费)。

我们来看看比特币的厉害之处:解决双花(双重支付)问题。何为双重支付?顾名思义就是一笔钱花了两次。

两笔未花费交易输出UTXO1和UXTO2通过一次交易变成了UTXO3和UTXO4,UTXO1和UTXO2只要被用一次,就不存在“未花费”了。以后就不会再被引用。

所以,某个人拥有N个比特币,其实是这个人的比特币地址存在UXTO的求和。这个求和通常是由钱包来帮我们完成了。其实比特币不是我们想象中的币,而是一个一个的UTXO。这个设计很精妙,大家可以自行体会一下。

创建一笔交易,就是对“原始交易”进行打包,然后对原始交易进行签名。

交易的发送

交易的发送,首先是节点连接上P2P网络。然后通过比特币协议,将数据广播到网络中。

在比特币网络上传输的每个有效载荷都需要加上一个包头,其中包含了有效载荷的长度、校验和以及消息类型。

在谈交易被发送、处理、打包到区块之前,先看几个概念。

1.一些节点保有一份完整的、最新的区块链拷贝,这样的节点被称为“全节点”。全节点能够独立自主地校验所有交易,而不需借由任何外部参照。

2.还有一些节点只保留了区块链的一部分,它们通过一种名为“简易支付验证(SPV)”的方式来完成交易验证。这样的节点被称为“SPV节点”,又叫“轻节点”。

3. UTXO池可能会被安置在节点本地内存,或者作为一个包含索引的数据库表安置在永久性存储设备中。

4.交易池是存放没有验证的交易。存储在本地内存。

5.矿工,参与挖矿(贡献算力,计算符合挖矿难度目标的那个Nounce),矿工是节点。但是节点可以不是矿工(不参与挖矿),不参与挖矿的节点可以同步信息和验证信息。

交易被广播到网络中后,被节点接收放入交易池,然后矿工会把这笔交易和其他交易一起计算Merkle根值。交易在交易池中是由优先级的,优先级由UTXO的新旧程度、交易的字节数和交易的数量确定。具体来说,对于每一个输入(inputs)来讲,客户端会先将比特币的数量乘以这些UXTO在块中存在的时间(age,也就是这个UTXO后面有多少区块,区块越多表示年龄越大),然后将所有的乘积加起来除以此次交易的大小(以字节为单位)。

矿工计算Merkle根值,再计算符合难度目标的Nounce,(看之前介绍)。区块头中的数字,Merkle根可以通过修改basecoin的内容改变,时间戳也可以随着计算的时间改变,Nounce随机数是可以改变的,所以通过调整这三个参数确定Nounce。这个过程就叫工作量证明。最后打包区块。

这样一个新的区块就产生了。产生了新的区块后节点全网广播,别的节点验证,然后矿工放弃这些交易的计算。重新开始计算下一个区块Nounce。

如果这个区块后面又产生了N个区块,就称作该区块完成N个确认。完成的确认数越多,这个区块中的交易越安全。

另外补充点内容:

区块的hash值不在本区块中保存;交易的交易hash也就是TXID也不在区块中保存,比特币区块规定只有1M,能省就省了。这些hash都由节点来计算和保存作为一个索引。

说明:部分图片来自网络。如有侵权烦请告知。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180401G10BY600?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

关注

腾讯云开发者公众号
10元无门槛代金券
洞察腾讯核心技术
剖析业界实践案例
腾讯云开发者公众号二维码

扫码关注腾讯云开发者

领取腾讯云代金券