在区块链网络当中,所有的数据都以区块的形式记录在各个节点上。而每个区块又以单独的文件保存在节点本地磁盘上,在比特币(Linux系统)中所有的区块信息都保存在~/.bitcoin/blocks/目录下面,并以blk***.dat文件名标示,如下图所示:

区块结构

根据https://en.bitcoin.it/wiki/Block所描述的,区块的结构如下:

Field 描述 大小
Magic no ”魔法数“,常数0xD9B4BEF9 4 bytes
Blocksize 区块大小 4 bytes
Blockheader 区块头 80 bytes
Transaction counter 交易数量,正整数 1 - 9 bytes
transactions 交易列表 -many transactions

首先是一个“魔法数”,根据描述这是个常数占4个字节,然后是4个字节的区块大小,然后是区块头80字节,然后是1-9字节的交易数量,最后是所有的交易。但是在实际的比特币代码当中却并不是这么定义的,

class CBlock : public CBlockHeader
{
public:// network and diskstd::vector<CTransactionRef> vtx;// memory onlymutable bool fChecked;// ...CBlockHeader GetBlockHeader() const{CBlockHeader block;block.nVersion       = nVersion;block.hashPrevBlock  = hashPrevBlock;block.hashMerkleRoot = hashMerkleRoot;block.nTime          = nTime;block.nBits          = nBits;block.nNonce         = nNonce;return block;}std::string ToString() const;
};

可以发现,实际上只定义了区块头和所有的交易,或许是不同版本的差异,但是看github上过去版本的bitcoin代码中也都没有定义上述表格中的变量,所以个人认为实际的结构应该是代码中定义的。

再来看看区块头部的结构,https://en.bitcoin.it/wiki/Block_hashing_algorithm

Field 目的 更新时间 大小 (Bytes)
Version 区块版本号 升级软件并指定新版本号时 4
hashPrevBlock 前一个区块的256-bit 哈希值 产生新的区块 32
hashMerkleRoot Merkle树根的256-bit 哈希值 收到了新的交易 32
Time 从 1970-01-01 00:00 UTC到现在为止的时间间隔,单位为秒 每几秒 4
Bits 当前POW的目标哈希值的压缩形式 难度调整时 4
Nonce 32-bit 随机数 尝试新的hash时 4

每个区块头都包含前一个区块的哈希值,所以所有的区块就像链表一样连成了一条链,链的头部就是创世块(Genesis Block)。所有的交易都以Merkle tree的形式进行索引,并在block header中保存Merkle tree的树根,如果当前交易数量是奇数的话,那么最后一个交易将会被计算两次哈希值。当前POW的难度以压缩的形式保存在4个字节的Bits中,最后通过mining找到的随机数记录在最后的Nonce中。

交易结构

关于比特币交易,更好的参考是比特币官方文档https://en.bitcoin.it/wiki/Transaction,解释的很详细。

交易是在区块链网络中传输的最基本的数据结构,所有有效的交易最终都会被打包进区块中并保存在区块链上,比特币中交易的数据结构如下,

Field 描述 大小
Version no 版本号,当前为1 4 bytes
In-counter 输入交易数量,正整数 1 - 9 bytes
list of inputs 输入列表,每个区块中第一个交易被称为“Coinbase” -many inputs
Out-counter 输出交易数量,正整数 1 - 9 bytes
list of outputs 输出列表,每个区块中第一个输出交易是给矿工的奖励 -many outputs
lock_time 锁定时间,如果非0并且小于0xFFFFFFFF,那么就是指块序号;如果交易已经终结,那么就是指时间戳 4 bytes

一个简单的交易输入如下:

Input:
Previous tx: f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd04470b9a6
Index: 0
scriptSig: 304502206e21798a42fae0e854281abd38bacd1aeed3ee3738d9e1446618c4571d10
90db022100e2ac980643b0b82c0e88ffdfec6b64e3e6ba35e7ba5fdd7d5d6cc8d25c6b241501

首先是前一笔交易的哈希值(Previous tx),然后是花费的是第几个输出(Index),最后是解锁脚本(scriptSig),其中解锁脚本=签名+公钥,只有提供正确的解锁脚本,才能花费对应的交易。

一个简单的输出如下:

Output:
Value: 5000000000
scriptPubKey: OP_DUP OP_HASH160 404371705fa9bd789a2fcd52d2c580b65d35549d
OP_EQUALVERIFY OP_CHECKSIG

首先是输出金额(Value),然后是锁定脚本,锁定脚本包括脚本系统中的一系列操作符。

交易类型

比特币目前提供了两种不同的交易类型,如下所示。通过这两者类型的交易可以组合出更加复杂的交易,称之为合约。

(1)Pay-to-PubkeyHash

scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
scriptSig: <sig> <pubKey>

这个也是最常见的交易,目标地址就是比特币地址,花费时需要提供签名和公钥。

(2)Pay-to-Script-Hash(P2SH)

scriptPubKey: OP_HASH160 <scriptHash> OP_EQUAL
scriptSig: ..signatures... <serialized script>

在P2SH中,目标地址由脚本哈希取代,解锁脚本中才包含签名和脚本内容。下面有两种类型的交易的对比,首先是普通的多签名脚本,解锁脚本中只需要5个公钥中任意两个私钥的签名即可。

Locking Script 2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 OP_CHECKMULTISIG
Unlocking Script Sig1 Sig2

然后是P2SH脚本,

Redeem Script 2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 OP_CHECKMULTISIG
Locking Script OP_HASH160 <20-byte hash of redeem script> OP_EQUAL
Unlocking Script Sig1 Sig2 redeem script

可以看出锁定脚本中只需要包括Redeem Script的哈希即可,而不用包含长长的一串公钥信息,具体的脚本内容由解锁脚本提供,相当于是将交易的大部分内容交给了交易花费者去处理,从而减少了网络传输的数据。根据《Master Bitcoin》所述,与直接使⽤复杂脚本以锁定输出的⽅式相⽐,P2SH具有以下特点:

  • 在交易输出中,复杂脚本由简短电⼦指纹取代,使得交易代码变短。
  • 脚本能被编译为地址,⽀付指令的发出者和⽀付者的⽐特币钱包不需要复杂⼯序就可以执⾏P2SH。
  • P2SH将构建脚本的重担转移⾄接收⽅,⽽⾮发送⽅。
  • P2SH将⻓脚本数据存储的负担从输出⽅(存储于UTXO集,影响内存)转移⾄输⼊⽅(仅存储于区块链)。
  • P2SH将⻓脚本数据存储的重担从当前(⽀付时)转移⾄未来(花费时)。
  • P2SH将⻓脚本的交易费成本从发送⽅转移⾄接收⽅,接收⽅在使⽤该笔资⾦时必须含有赎回脚本。

【区块链开发指南】区块链基础之区块和交易相关推荐

  1. 《区块链开发指南》一一导读

    前 言 Preface 比特币于2009年诞生,在很长一段时间内,人们只知比特币,不知区块链.从2015年开始,区块链像狂风一样席卷全球,倍受金融界和科技界的关注:2015年年底,区块链技术逐渐得到国 ...

  2. 003《区块链开发指南》一一1.2 区块和区块链 转

    摘要:             本节书摘来自华章计算机<区块链开发指南>一书中的第1章,第1.2节,作者:申屠青春 主编 宋 波 张 鹏 汪晓明 季宙栋 左川民 编著更多章节内容可以访问云 ...

  3. 区块链开发指南_区块链开发权威指南

    区块链开发指南 by Haseeb Qureshi 由Haseeb Qureshi 区块链开发权威指南 (The authoritative guide to blockchain developme ...

  4. 【翻译】How To Become A Blockchain Developer: Crash Course! 区块链开发指南!

    为什么80%的码农都做不了架构师?>>>    In this guide, we are going to map out your journey for becoming a ...

  5. aelf区块链开发指南(一) | 如何将以太坊合约转为aelf合约?

    2021年12月12日,aelf元宇宙黑客马拉松正式开启,为帮助更多的开发者快速加入aelf生态,开发更多创新项目,aelf特别开放黑客马拉松开发指南系列课程. 在本期aelf区块链开发指南中,ael ...

  6. 《区块链开发指南》一一第1章 区块链基础

    第1章 区块链基础 区块链究竟是什么?狭义地说,区块链就是比特币的底层技术:不过,经过7年的发展,区块链已经不再"依附于"比特币,而是独立地发展成为了一种革命性的技术,比特币则是区 ...

  7. 区块链开发指南_区块链开发完全指南

    区块链将是技术的发展方向. 我认为未来将围绕区块链一新兴技术构建,这绝不是什么牵强附会.区块链最初被设计成一种公共的,无权限的技术,后来引入了另一种区块链,每种区块链都有自己独特的用例集.公共/无权限 ...

  8. python区块链开发_10个开源的Python区块链项目

    Python不是主流的区块链底层平台开发语言,但是在DApp开发.区块链仿真与数据分析.智能合约安全分析等领域,Python依然是不错的选择.本文介绍了10个最流行的Python区块链项并提供了相应的 ...

  9. 从0到1简易区块链开发手册V0.6-实现打印区块

    八. 打印区块 以上的转账交易中,我们共计创建了四个区块,其中一个区块为创世区块,另外三个区块都是对我们的交易进行打包后产生的新区块,本文将介绍如何将区块信息打印出来. 1.命令行代码 func (c ...

  10. SEER区块浏览器开发指南

    区块浏览器基本功能 区块链浏览器是浏览区块链信息的主要窗口,每一个区块所记载的内容都可以从区块链浏览器上进行查阅.用户可以使用区块链浏览器查询记录在区块中的交易信息,包括转账.预测.账户管理和社区治理 ...

最新文章

  1. leetcode算法题--斐波那契数列
  2. 【论文解读】CVPR 2021 妆容迁移 论文+ 代码 汇总,美得很美得很!
  3. Appium下载安装及环境配置
  4. 一只青蛙跳向三个台阶_在藏区流传的青蛙王子的故事
  5. 解决python中 .to_csv() 的乱码问题
  6. 中国及中国各省矢量地图数据下载
  7. DVR NVR CVR有什么区别
  8. 新萝卜家园 Ghost XP SP3 电脑城装机版 2011.06+
  9. 苹果手机怎么设置流量限制
  10. 书单 | 振聋发聩,撼世经典!总有那么一些书经得住时间的考验
  11. 软件工程北大慕课答案
  12. 利用python计算复合材料ABD矩阵以及压缩载荷的代码
  13. java模拟三人爬山_java笔记——模拟多人徒步爬山例子
  14. 网络分析仪测试线损_关于网络分析仪的测试(校准线损问题)
  15. 词云和穷爸爸、富爸爸
  16. 《代码整洁之道》阅读笔记——第12章:迭进
  17. byte数据类,list数据类
  18. ImmuCellAI | 免疫浸润计算工具 R包学习
  19. 八种基本数据类型的大小,以及他们的封装类
  20. PADS 免费视频教程

热门文章

  1. CocosCreator-精灵动态加载图片资源,实例化精灵
  2. 前缀和与差分——最大加权矩形
  3. 牛客OR36 链表的回文结构
  4. hp打印机计算机无法与设备建立,hp 程序无法安装解决方法,hp打印机安装教程 电脑维修技术网...
  5. jquery slideToggle() 效果
  6. 什么是用户故事地图?
  7. 图片转DATA:URI工具
  8. 自定义mui的索引列表indexedList(可用作通讯录)详细用法
  9. ajaxsubmit success 不执行和ajaxsubmit使用问题
  10. Windows10系统安装好用的截图软件--snipaste