区块链之区块结构-学习笔记

目录

一、区块结构

二、区块头

三、区块体

四、交易类型

(1)生产交易

(2)通用地址交易

(3)合成地址交易


一、区块结构

        数据区块是区块链的基本元素。比特币系统的每个数据区块主要由区块头(Block Header)和区块体(Block Body)两部分组成,其中区块头记录当前区块的元数据,而区块体则存储封装到该区块的实际交易数据。

比特币系统的区块结构
数据项数据说明大小
Block Size区块大小4字节
Block Header区块头80字节
Transaction Counter交易数量1~9字节
Transactions交易列表可变

 

下图是:比特币系统的区块结构图

二、区块头

比特币系统区块头的数据项及说明:

比特币系统区块头的数据项及说明
数据项说明更新时间大小
Version版本号,表示本区块遵守的验证规则版本升级时4字节
Pre-block引用区块链中夫区块的哈希值创建一个新区块时32字节
Bits压缩格式的当前目标哈希值当挖矿难度调整时4字节
Nonce32位数字(从0开始)共识过程中实时更新4字节
Kerkle-root基于一个区块中所有交易的哈希值交易列表发生变化时32字节
Timestamp该区块产生的近似时间,精确到秒的Unix时间戳构建区块时4字节

三、区块体

数据项数据描述大小
Version No版本号,目前为1,表示这笔交易参照的规则4字节
In-counter输入数量,正整数VI=VarInt1~9字节
list of inputs输入列表,每区块的第一个交易称为“Coinbase”交易<in-counter>许多输入
Out-counter输出数量,正整数VI=VarInt1~9字节
list of outputs输出列表,每区块第一个交易的输出是给矿工的奖励<out-counter>许多输出
lock_time

锁定时间,如果非0并且序号小于0XFFFFFFFF,则是指块序号;

如果交易已经终止,则是指时间戳

 

        交易主要可以分成三部分:元数据、一系列的输入和一系列的输出。除了第一笔Coinbase交易是矿工的挖矿收入之外,其他每一笔交易都有一个或多个输入,以及一个或多个输出。Coinbase交易没有输入,只有输出。

(1)元数据

        主要存储一些内部处理的信息,包含版本号、这笔交易的规模,输入的数量、输出的数量、交易锁定时间,以及作为该交易独一无二的ID的哈希值。其他区块可以通过哈希指针指向这个ID。

(2)交易输入

        每笔交易的所有输入排成一个序列,每个输入的格式相同,当交易被序列化以便在网络上传播时,输入将被编码为字节流。

数据项描述大小
Previous Transaction hash指向交易包含的未花费的UTXO的哈希指针32字节
Previous Txout-index未花费的UTXO的索引号,第一个是04bytes
Txin-script length解锁脚本长度1~9字节(可变整数)
Txin-script/scriptSig一个达到UTXO锁定脚本中的条件的脚本变长
sequence_no目前未被使用的交易替换功能,通常设成0xFFFFFFFF4字节

(3)交易输出

        每个输出的内容分成两部分,一部分是特定数量的比特币,以“聪”为单位(最小的比特币单位),另一部分是锁定脚本,即提出支付输出所必须满足的条件以“锁住”这笔总额。

数据项描述大小
Value用“聪”表示的比特币值8字节
Txout-script length锁定脚本长度1~9字节(可变整数)
Txout-script/scriptPubKey定义了支付输出所需条件的脚本变长

四、交易类型

(1)生产交易

        每个区块的第一笔交易都是生产新币的交易。该交易没有输入地址,仅有一个输出地址,其作用是将系统新生成的加密货币奖励给创造当前区块的矿工。

(2)通用地址交易

        这是区块链系统中最常见的交易,由N个输入和M个输出构成,其中N>0,M>0。根据N和M的不同取值,可以进一步细分为一对一转账交易、一对多分散交易、多对一聚合交易和多对多转账交易。

(3)合成地址交易

        合成地址交易是一类特殊交易,其接收地址不是通常意义的地址,而是一个以3开头的合成地址。合成地址一般是M of N的多重签名地址,其中1<=N<=3、1<=M<=N,通常选择N=3。合成地址的交易构造、签名和发送过程与普通交易类似,但其地址创建过程需要三对公钥和私钥,其中公钥用于创建地址、私钥用于签名。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下代码来在 Rust 中定义区块链的数据结构: ``` struct Block { // 区块头 header: BlockHeader, // 区块数据 data: Vec<u8>, // 当前区块的哈希 hash: Vec<u8>, } struct BlockHeader { // 前一个区块的哈希 prev_hash: Vec<u8>, // 当前区块的时间戳 timestamp: u64, // 其他区块头信息 ... } struct Blockchain { // 区块的 Vec blocks: Vec<Block>, } ``` 这里的 `BlockHeader` 结构体可以包含其他的区块头信息,如难度值、随机数等。 你也可以使用链表来存储区块,这样的话 `Blockchain` 结构体可以使用如下代码定义: ``` struct Blockchain { // 当前区块 current_block: Option<Box<Block>>, // 区块总数 block_count: u64, } struct Block { // 当前区块的数据 data: Vec<u8>, // 当前区块的哈希 hash: Vec<u8>, // 下一个区块的指针 next: Option<Box<Block>>, } ``` 这种方法的优点是可以轻松地在区块链的头部或尾部插入新的区块,但缺点是需要使用智能指针来管理内存,并且在访问链中间的区块时需要从头开始遍历整个链。 ### 回答2: 在Rust中,我们可以使用struct结构体来定义区块链的数据结构区块可以定义为一个拥有多个字段的结构体,其中包括前一个区块的哈希值(previous_hash)、当前区块的哈希值(block_hash)、时间戳(timestamp)、数据(data)等。 一个简单的区块结构体定义如下: ```rust pub struct Block { pub previous_hash: String, pub block_hash: String, pub timestamp: u64, pub data: String } ``` 接下来,我们可以使用Vec(向量)来表示整个链,将区块按顺序存储在Vec中。这样,每次添加新的区块时,我们可以将其追加到链的末尾。整个链的数据结构定义如下: ```rust pub struct Blockchain { pub chain: Vec<Block> } ``` 接着,我们可以实现新区块的创建和链的添加方法。以下是创建区块的函数示例: ```rust impl Block { pub fn new(previous_hash: String, data: String) -> Block { let timestamp = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); let block_hash = Self::generate_block_hash(&previous_hash, &data, timestamp); Block { previous_hash, block_hash, timestamp, data } } fn generate_block_hash(previous_hash: &str, data: &str, timestamp: u64) -> String { // 哈希生成逻辑 // ... } } ``` 以下是向链中添加新区块的函数示例: ```rust impl Blockchain { pub fn add_block(&mut self, block: Block) { self.chain.push(block); } } ``` 通过定义这样的数据结构和方法,我们可以在Rust中实现一个简单的区块链。当然,并非所有的细节都在这个简单的示例中覆盖到,但是这可以帮助您理解如何使用Rust来定义区块和链的数据结构。 ### 回答3: Rust是一种系统级编程语言,非常适合用于构建高性能的区块链数据结构。在Rust中,我们可以使用结构体和枚举类型来定义区块链的数据结构,包括区块和链。 首先,我们定义一个区块结构体,包含以下字段: - index:区块的索引,表示该区块在整个链中的位置; - timestamp:区块生成的时间戳; - data:区块中存储的数据; - previous_hash:前一个区块的哈希值; - hash:当前区块的哈希值。 接着,我们定义一个链的结构体,包含以下字段: - blocks:一个包含区块的向量,表示整个链中的所有区块。 为了方便操作区块链,我们还可以在链的结构体上实现一些方法,比如添加新区块、计算区块哈希值等。 在初始化链的时候,我们会创建一个创世区块,即第一个区块。创世区块的索引为0,前一个区块哈希值为空,数据可以是任意值,而哈希值通常是通过计算区块中的信息得到的。 添加新区块时,我们需要为其设定正确的索引、前一个区块哈希值和时间戳,然后计算当前区块的哈希值,并将区块添加到链的末尾。 定义区块链的数据结构区块链开发的基础,通过Rust强大的类型系统和所有权模型,我们可以确保数据的安全性和高效性。另外,Rust还提供了各种并发和异步编程特性,非常适合用于构建区块链的并发执行和共识算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值