python区块链简单模拟【04】
区块链网络是去中心化的,区块链不是基于一个中心节点产生的,而是由很多去中心化的节点一起参与维护的 我们要实现一个简单地去中心化网络,该模拟实验,多个节点可以运行在同一个计算机上,只是每个节点使用了不同的本地端口号,每个节点都是使用一个独立的线程运行,相当于一个独立的节点。
正确,区块链网络是一种去中心化的网络。它由多个节点组成,而不是由一个中心化的机构或实体控制。每个节点都有一个完整的副本区块链的拷贝,并且通过共识机制来达成对区块链上交易的一致认同。由于去中心化的特性,区块链网络具有更高的安全性和抗攻击能力,同时没有单点故障的风险。
# 导入椭圆曲线算法
from ecdsa import SigningKey, SECP256k1, VerifyingKey, BadSignatureError
import binascii
import base64
from hashlib import sha256
class Wallet:
"""
钱包
"""
def __init__(self):
"""
钱包初始化时基于椭圆曲线生成一个唯一的秘钥对,代表区块链上一个唯一的账户
"""
self._private_key = SigningKey.generate(curve=SECP256k1)
self._public_key = self._private_key.get_verifying_key()
@property
def address(self):
"""
这里通过公钥生成地址
"""
h = sha256(self._public_key.to_pem())
return base64.b64encode(h.digest())
@property
def pubkey(self):
"""
返回公钥字符串
"""
return self._public_key.to_pem()
def sign(self, message):
"""
生成数字签名
"""
h = sha256(message.encode('utf8'))
return binascii.hexlify(self._private_key.sign(h.digest()))
def verify_sign(pubkey, message, signature):
"""
验证签名
"""
verifier = VerifyingKey.from_pem(pubkey)
h = sha256(message.encode('utf8'))
return verifier.verify(binascii.unhexlify(signature), h.digest())
import json
class Transaction:
"""
交易的结构
"""
def __init__(self, sender, recipient, amount):
"""
初始化交易,设置交易的发送方、接收方和交易数量
"""
if isinstance(sender, bytes):
sender = sender.decode('utf-8')
self.sender = sender # 发送方
if isinstance(recipient, bytes):
recipient = recipient.decode('utf-8')
self.recipient = recipient # 接收方
self.amount = amount # 交易数量
def set_sign(self, signature, pubkey):
"""
为了便于验证这个交易的可靠性,需要发送方输入他的公钥和签名
"""
self.signature = signature # 签名
self.pubkey = pubkey # 发送方公钥
def __repr__(self):
"""
交易大致可分为两种,一是挖矿所得,而是转账交易
挖矿所得无发送方,以此进行区分显示不同内容
"""
if self.sender:
s = "从 %s 转至 %s %d个加密货币" % (self.sender, self.recipient, self.amount)
else:
s = "%s 挖矿获取%d个加密货币" % (self.recipient, self.amount)
return s
class TransactionEncoder(json.JSONEncoder):
"""
定义Json的编码类,用来序列化Transaction
"""
def default(self, obj):
if isinstance(obj, Transaction):
return obj.__dict__
else:
return json.JSONEncoder.default(self, obj)
import hashlib
from datetime import datetime
class Block:
"""
区块结构
prev_hash: 父区块哈希值
transactions: 交易对
timestamp: 区块创建时间
hash: 区块哈希值
Nonce: 随机数
"""
def __init__(self, transactions, prev_hash):
# 将传入的父哈希值和数据保存到类变量中
self.prev_hash = prev_hash
self.transactions = transactions
# 获取当前时间
self.timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 设置Nonce和哈希的初始值为None
self.nonce = None
self.hash = None
def __repr__(self):
return "区块内容:%s\n哈希值: %s" % (json.dumps(self.transactions), self.hash)
DIFFICULTY = 5
class ProofOfWork:
"""
工作量证明
"""
def __init__(self, block, miner, difficult=5):
self.block = block
# 定义工作量难度,默认为5,表示有效的哈希值以5个“0”开头
self.difficulty = DIFFICULTY
self.miner = miner
# 添加挖矿奖励
self.reward_amount = 1
def mine(self):
"""
挖矿函数
"""
i = 0
prefix = '0' * self.difficulty
# 添加奖励
t = Transaction(
sender="",
recipient=self.miner.address,
amount=self.reward_amount,
)
sig = self.miner.sign(json.dumps(t, cls=TransactionEncoder))
t.set_sign(sig, self.miner.pubkey)
self.block.transactions.append(t)
while True:
message = hashlib.sha256()
message.update(str(self.block.prev_hash).encode('utf-8'))
# 更新区块中的交易数据
# message.update(str(self.block.data).encode('utf-8'))
message.update(str(self.block.transactions).encode('utf-8'))
message.update(str(self.block.timestamp).encode('utf-8'))
message.update(str(i).encode("utf-8"))
digest = message.hexdigest()
if digest.startswith(prefix):
self.block.nonce = i
self.block.hash = digest
return self.block
i += 1
class BlockChain:
"""
区块链结构体
blocks: 包含的区块列表
"""
def __init__(self):
self.blocks = []
def add_block(self, block):
"""
添加区块
"""
self.blocks.append(block)
区块链网络是一种分布式网络结构,通过区块链技术实现数据的存储、交换和共享。区块链网络由多个节点组成,每个节点都有一个副本的区块链账本。这些节点通过共识算法一致地更新和维护账本,确保账本的一致性和安全性。
区块链网络具有去中心化的特点,没有中心化的控制机构,所有节点平等地参与网络的维护和运行。这样的设计使得区块链网络具有高度的抗攻击性和鲁棒性,同时也降低了网络的单点故障的风险。
区块链网络可以用于各种场景,如数字货币、供应链管理、投票系统等。通过区块链技术,可以实现透明、安全、高效的数据交换和管理。同时,区块链网络也提供了智能合约功能,使得交易可以在不需要信任第三方的情况下进行。
总的来说,区块链网络是一种新兴的网络结构,具有去中心化、安全性高等优点,可以应用于各种领域,正在改变传统的中心化网络模式。
区块链网络是由多个节点组成的分布式计算网络,用于支持区块链技术的实施和应用。在区块链网络中,每个节点都拥有一个完整的副本,可以对交易进行验证和记录,并且通过共识算法来保证数据的一致性和安全性。区块链网络的特点包括去中心化、透明和不可篡改等。通过区块链网络,可以实现去中心化的数字货币交易、智能合约执行、资产管理等应用。
在区块链的去中心化网络中,参与者享有一些权利和承担一些义务。以下是一些常见的权利和义务:
权利:
- 决策权:参与者有权参与网络的决策过程,包括投票、提案和讨论等。
- 透明度:参与者有权获得网络中的所有交易和数据的透明和可验证性。
- 数据保护:参与者有权保护自己的个人数据免受未经授权的访问和滥用。
- 数据所有权:参与者有权拥有和控制他们自己的数据,并可以自由地分享或转移。
义务:
- 守规矩:参与者需要遵守网络的规则和协议,确保网络的正常运行和安全性。
- 贡献资源:参与者需要为网络提供计算能力、存储空间或其他资源,以支持网络的运行和安全性。
- 信息验证:参与者需要对网络中的交易和数据进行验证,以确保其准确性和安全性。
- 支持共识:参与者需要参与共识算法,并按照共识协议行动,以保持网络的一致性和完整性。
这些权利和义务有助于确保参与者之间的平等和公正,同时也保证了区块链网络的安全性和可靠性。在区块链的去中心化网络中,参与者享有一些权利和承担一些义务。以下是一些常见的权利和义务:
权利:
- 决策权:参与者有权参与网络的决策过程,包括投票、提案和讨论等。
- 透明度:参与者有权获得网络中的所有交易和数据的透明和可验证性。
- 数据保护:参与者有权保护自己的个人数据免受未经授权的访问和滥用。
- 数据所有权:参与者有权拥有和控制他们自己的数据,并可以自由地分享或转移。
义务:
- 守规矩:参与者需要遵守网络的规则和协议,确保网络的正常运行和安全性。
- 贡献资源:参与者需要为网络提供计算能力、存储空间或其他资源,以支持网络的运行和安全性。
- 信息验证:参与者需要对网络中的交易和数据进行验证,以确保其准确性和安全性。
- 支持共识:参与者需要参与共识算法,并按照共识协议行动,以保持网络的一致性和完整性。
这些权利和义务有助于确保参与者之间的平等和公正,同时也保证了区块链网络的安全性和可靠性。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!