IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 区块链 -> 区块链技术核心原理实现 -> 正文阅读

[区块链]区块链技术核心原理实现

1. 确定区块结构

一个区块包括区块的索引、时间戳、交易信息和上一个交易的 hash 值以及工作量证明:

block = {
	# 区块的索引
    'index': 0,  
    # 时间戳
    'timestamp': '时间戳',  
    # 交易信息:发送者、接收者和交易金额
    'transations': [  
        {
            'sender': '发送者',  
            'recipient': '接收者',  
            'amount': 0,  
        }
    ],
    # 工作量证明
    'proof': '', 
    # 上一个交易的hash值
    'previous_hash': '',
}
2. 实现区块类结构

由确定好的区块结构可以在类中简单实现:

class BlocakChain(object):
    def __init__(self): 
    	# 存放区块的链
        self.chain = [] 
        # 当前交易信息
        self.current_transaction = [] 

    def new_transaction(self):
    	"""
    	添加交易信息
    	"""
		pass
		
    def new_block(self):
    	"""
    	添加区块
    	"""
        pass
        
    @staticmethod
    def hash(self):
    	"""
    	计算区块的hash值
    	"""
        pass
        
    @property
    def last_block(self):
    	"""
    	获取区块链中最后一个区块
    	"""
        pass
3. 实现添加交易信息
class BlocakChain(object):
    def __init__(self):
        # 存放区块的链
        self.chain = []
        # 当前交易信息
        self.current_transaction = []

    def new_transaction(self, sender, recipient, amount) -> int:
        '''
        添加交易信息
        :param sender:发送者
        :param recipient:接收者
        :param amount:交易金额
        :return:区块的索引
        '''
        self.current_transaction.append(
            {
                'sender': sender,
                'recipient': recipient,
                'amount': amount,
            }
        )
        # 交易信息添加完成后更新索引
        return self.last_block['index'] + 1

    def new_block(self):
    	"""
    	添加区块
    	"""
        pass
        
    @staticmethod
    def hash(self):
    	"""
    	计算区块的hash值
    	"""
        pass
        
    @property
    def last_block(self):
		'''
        获取区块链中最后一个区块
        :return:最后一个区块
        '''
        return self.chain[-1]
4. 实现创建区块
import hashlib
import json
from time import time


class BlocakChain(object):
    def __init__(self):
        # 存放区块的链
        self.chain = []
        # 当前交易信息
        self.current_transaction = []
        # 创世区块
        self.new_block(proof=100, previous_hash=1)

    def new_transaction(self, sender, recipient, amount) -> int:
        '''
        添加交易信息
        :param sender:发送者
        :param recipient:接收者
        :param amount:交易金额
        :return:区块的索引
        '''
        self.current_transaction.append(
            {
                'sender': sender,
                'recipient': recipient,
                'amount': amount,
            }
        )
        # 交易信息添加完成后更新索引
        return self.last_block['index'] + 1

    def new_block(self, proof, previous_hash=None):
        '''
        创建区块
        :param proof:工作量证明
        :param previous_hash:上一个区块的hash值
        :return:None
        '''
        # 区块:区块的索引、时间戳、当前交易信息、工作量证明和上一个交易hash值
        block = {
            'index': len(self.chain) + 1,
            'timestamp': time(),
            'transactions': self.current_transaction,
            'proof': proof,
            'previous_hash': previous_hash or self.hash(self.last_block),
        }
        # 当前交易信息已经打包可以置为空
        self.current_transaction = []
        # 把区块添加到区块链里
        self.chain.append(block)

    @staticmethod
    def hash(self, block):
        '''
        计算区块的hash值
        :param block:区块
        :return:
        '''
        block_str = json.dumps(block, sort_keys=True).encode('utf-8')
        return hashlib.sha256(block_str).hexdigest()

    @property
    def last_block(self):
        '''
        获取区块链中最后一个区块
        :return:最后一个区块
        '''
        return self.chain[-1]
5. 实现工作量证明
import hashlib
import json
from time import time


class BlocakChain(object):
    def __init__(self):
        # 存放区块的链
        self.chain = []
        # 当前交易信息
        self.current_transaction = []
        # 创世区块
        self.new_block(proof=100, previous_hash=1)

    def new_transaction(self, sender, recipient, amount) -> int:
        '''
        添加交易信息
        :param sender:发送者
        :param recipient:接收者
        :param amount:交易金额
        :return:区块的索引
        '''
        self.current_transaction.append(
            {
                'sender': sender,
                'recipient': recipient,
                'amount': amount,
            }
        )
        # 交易信息添加完成后更新索引
        return self.last_block['index'] + 1

    def new_block(self, proof, previous_hash=None):
        '''
        创建区块
        :param proof:工作量证明
        :param previous_hash:上一个区块的hash值
        :return:None
        '''
        # 区块:区块的索引、时间戳、当前交易信息、工作量证明和上一个交易hash值
        block = {
            'index': len(self.chain) + 1,
            'timestamp': time(),
            'transactions': self.current_transaction,
            'proof': proof,
            'previous_hash': previous_hash or self.hash(self.last_block),
        }
        # 当前交易信息已经打包可以置为空
        self.current_transaction = []
        # 把区块添加到区块链中
        self.chain.append(block)

    @staticmethod
    def hash(self, block):
        '''
        计算区块的hash值
        :param block:区块
        :return:区块的hash值
        '''
        block_str = json.dumps(block, sort_keys=True).encode('utf-8')
        return hashlib.sha256(block_str).hexdigest()

    @property
    def last_block(self):
        '''
        获取区块链中最后一个区块
        :return:最后一个区块
        '''
        return self.chain[-1]

    def proof_of_work(self, last_proof: int) -> int:
        '''
        实现工作量证明:这里做个简化版,对两个值(上一个hash值last_proof和交易记录集proof)进行hash看是否能得到5个0开头hash值
        :param last_proof:上一个区块的Hash值
        :return:满足hash是5个0开头的那个值
        '''
        proof = 0
        init_time = time()
        # 不断验证直到最后得到6个0开头的hash值
        while self.verify_proof(last_proof, proof) is False:
            # 更新proof的值继续验证
            proof += 1
        print(proof)
        use_time = time() - init_time
        print('耗时:{:.2f}秒'.format(use_time))
        # 如果满足就返回这个proof
        return proof

    def verify_proof(self, last_proof, proof: int) -> bool:
        """
        验证
        :param last_proof: 上一个区块的Hash值
        :param proof:
        :return:
        """
        guess = f'{last_proof}{proof}'.encode()
        guess_hash = hashlib.sha256(guess).hexdigest()
        print(guess_hash)
        return guess_hash[0:5] == '00000'


bc = BlocakChain()
bc.proof_of_work(10000)

耗时2.87秒,最终找到了5个0开头的 hash 值:
在这里插入图片描述

6. 添加节点通信功能
7. 交易接口实现
8. 挖矿接口实现
9. 实现注册节点
10. 实现共识机制
  区块链 最新文章
盘点具备盈利潜力的几大加密板块,以及潜在
阅读笔记|让区块空间成为商品,打造Web3云
区块链1.0-比特币的数据结构
Team Finance被黑分析|黑客自建Token“瞒天
区块链≠绿色?波卡或成 Web3“生态环保”标
期货从入门到高深之手动交易系列D1课
以太坊基础---区块验证
进入以太坊合并的五个数字
经典同态加密算法Paillier解读 - 原理、实现
IPFS/Filecoin学习知识科普(四)
上一篇文章      下一篇文章      查看所有文章
加:2021-07-10 14:35:35  更:2021-07-10 14:37:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:57:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码