区块的大小规定不能超过1M,它的结构分为两个部分,区块头和区块体
区块头共有80个字节,共分为6个部分:
- Version:4 Bytes,记录区块头的版本号,用于追踪软件/协议的更新
- PreBlockHash:32 Bytes,记录了上一个区块的Hash address
- MerkleRoot:32 Bytes,记录了该区块交易的merkle树根的哈希值
- Timestamp:4 Bytes,记录了该区块的创建时间戳
- DifficultyTarget:4 Bytes,记录了该区块POW的难度目标
- Nonce:4 Bytes,记录了用于证明POW的计算参数
区块体,共分为3个部分:
- NumTransactionsBytes:1 Byte,记录了交易数量占用的字节数
- NumTransactions:0-8 Bytes,记录了区块内的交易数量
- Transactions: X bytes,记录了区块内存储的多个交易
PS:区块的哈希是由区块头和Merkle根所共同hash的值,该值存放在下一块区块的头中
## 以下代码一个区块 存放的是一个data数据(正常的区块应该存放多条交易数据)
import hashlib as hasher
class Block:
def __init__(self, index, version, previous_hash, timestamp, data):
self.index = index
self.version = version
self.previous_hash = previous_hash
self.timestamp = timestamp
self.data = data
self.hash = self.hash_block()
def hash_block(self):
sha = hasher.sha256()
sha.update(str(self.index) + str(self.timestamp)
+ str(self.data) + str(self.previous_hash))
return sha.hexdigest()
import hashlib as hasher
class Block:
def __init__(self, index, version, previous_hash, timestamp, data):
self.index = index
self.version = version
self.previous_hash = previous_hash
self.timestamp = timestamp
self.data = data
self.hash = self.hash_block()
def hash_block(self):
sha = hasher.sha256()
sha.update( (str(self.index) + str(self.timestamp) + str(self.data) + str(self.previous_hash) ).encode("utf-8") )
return sha.hexdigest()
import datetime as date
def create_genesis_block():
# Manually construct a block with
# index zero and arbitrary previous hash
return Block(0, "v1.00", "0", date.datetime.now(), "Genesis Block")
def next_block(last_block, version):
this_index = last_block.index + 1
this_version = version
this_hash = last_block.hash
this_timestamp = date.datetime.now()
this_data = "Hey! I'm block " + str(this_index)
return Block(this_index, this_version, this_hash, this_timestamp, this_data)
# Create the blockchain and add the genesis block
blockchain = [create_genesis_block()]
previous_block = blockchain[0]
# How many blocks should we add to the chain
# after the genesis block
num_of_blocks_to_add = 20
# Add blocks to the chain
for i in range(0, num_of_blocks_to_add):
block_to_add = next_block(previous_block, "v1.00")
blockchain.append(block_to_add)
previous_block = block_to_add
# Tell everyone about it!
print("Block #{} has been added to the blockchain!".format(block_to_add.index) )
print("Hash: {}\n".format(block_to_add.hash) )