手把手教你用Python开发区块链:代码实战教程

最近领导让我研究一下如何通过以太坊如何发布自己的币种,正好过节放假,先研究一下什么是区块链吧。先把区块链的工作原理搞清楚才不至于迷糊!

区块链是一种分布式账本技术,可以简单理解为一个由多个节点共同维护的“账本”。它的核心特点是去中心化、不可篡改和透明性。所有交易记录被打包成“区块”,并通过密码学技术(如哈希值)连接成“链”。每个区块包含上一个区块的哈希值,确保数据的完整性和不可篡改性。

区块链的特点包括:

  • 去中心化:没有单一的控制方,所有节点共同维护账本。
  • 透明性:所有交易记录公开透明,任何人都可以查看。
  • 安全性:通过加密技术和共识机制确保数据不可篡改。

它的用途非常广泛,适用于需要信任和透明的场景,比如金融交易、供应链管理、投票系统等。简单来说,区块链是一种让陌生人之间无需信任第三方也能安全合作的技术。

一、区块链是如何运行的?

1.1 运行流程

  • 交易: 分布式账本的参与者发生交易,导致账本状态的改变
  • 区块: 记录一段时间内发生的所有交易和状态结果,重新更新账本状态
  • 区块链:区块按时间顺序串联,账本状态变化的精确日志记录,最新区块代表账本的最新状态
    在这里插入图片描述

1.2 账号体系

  • 公钥: 区块链世界里的账号
  • 私钥: 区块链世界里的密码

传统账户体系中,账户名、密码与对应关系存储在中心化数据库里。验证时,通过比对数据库中的数据来验证中心化数据库有管理员作恶、被攻击盗取等风险。

区块链中随机机生成私钥,通过数学加密曲线生成公钥公钥与私钥存在数学关系,可以直接验证。
在这里插入图片描述

通常使用椭圆加密曲线函数:

1.3 记录者(矿工)操作流程

  • 收集交易:矿工从交易池收集交易,并组装成一个待验证的区块。
  • 寻找随机数:矿工通过不断调整区块头中的随机数(Nonce),计算出区块头的哈希值,试图使其小于网络难度目标。
  • 广播区块:一旦找到符合难度要求的随机数,矿工会计算出该区块的所有权和交易费,并广播到全网。
  • 验证区块:其他节点接受该区块,并进行验证,确保交易有效、没有双花等问题。
  • 达成共识:经过大多数节点验证没有问题后,该区块会被添加到区块链上,交易确认完成。
  • 获得奖励:根据该区块中交易数量和费用,系统会向找到该区块的矿工发送一定数量的加密货币作为挖矿奖励。

在这里插入图片描述

二、代码示例

2.1 准备工作

一般使用levelDBcouchDB存储区块数据,先安装couchDB

  • 下载地址:
    https://couchdb.apache.org/#download

安装好,我们可以通过浏览器操作数据库。

http://127.0.0.1:5984/_utils

在这里插入图片描述

2.2 安装python扩展包

# couchdb操作库
pip install couchdb
# 椭圆加密曲线算法库
pip install ecdsa
# 网络时间同步
pip install ntplib

2.3 支撑函数

由于区块链是分布式系统,用户来自世界各地,考虑各地时间不同。使用ntp实现
时间一致。

# utils/helpers.py

from datetime import datetime, timezone
import ntplib

# ntp协议获取服务时间
def get_ntp_time(server="pool.ntp.org", timeout=5) -> datetime:
    client = ntplib.NTPClient()
    response = client.request(server, version=3, timeout=timeout)

    # 转换 NTP 时间戳为 datetime 对象
    return datetime.fromtimestamp(response.tx_time, tz=timezone.utc)

2.4 核心层(core)

核心层主要是区块定义及区块链及交易数据。

区块定义

#core/block.py

import hashlib
import json
from typing import Dict, List


class Block:
    def __init__(
            self,
            index: int,
            timestamp: float,
            transactions: List[Dict],
            previous_hash: str,
            nonce: int = 0
    ):
        self.index = index
        self.timestamp = timestamp
        self.transactions = transactions
        self.previous_hash = previous_hash
        self.nonce = nonce
        self.hash = self.compute_hash()

    def compute_hash(self) -> str:
        block_data = {
   
            "index": self.index,
            "timestamp": self.timestamp,
            "transactions": self.transactions,
            "previous_hash": self.previous_hash,
            "nonce": self.nonce
        }
        return hashlib.sha256(
            json.dumps(block_data, sort_keys=True).encode()
        ).hexdigest(<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老朱2000

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值