最近领导让我研究一下如何通过以太坊如何发布自己的币种,正好过节放假,先研究一下什么是区块链吧。先把区块链的工作原理搞清楚才不至于迷糊!
区块链是一种分布式账本技术,可以简单理解为一个由多个节点共同维护的“账本”。它的核心特点是去中心化、不可篡改和透明性。所有交易记录被打包成“区块”,并通过密码学技术(如哈希值)连接成“链”。每个区块包含上一个区块的哈希值,确保数据的完整性和不可篡改性。
区块链的特点包括:
- 去中心化:没有单一的控制方,所有节点共同维护账本。
- 透明性:所有交易记录公开透明,任何人都可以查看。
- 安全性:通过加密技术和共识机制确保数据不可篡改。
它的用途非常广泛,适用于需要信任和透明的场景,比如金融交易、供应链管理、投票系统等。简单来说,区块链是一种让陌生人之间无需信任第三方也能安全合作的技术。
一、区块链是如何运行的?
1.1 运行流程
- 交易: 分布式账本的参与者发生交易,导致账本状态的改变
- 区块: 记录一段时间内发生的所有交易和状态结果,重新更新账本状态
- 区块链:区块按时间顺序串联,账本状态变化的精确日志记录,最新区块代表账本的最新状态
1.2 账号体系
- 公钥: 区块链世界里的账号
- 私钥: 区块链世界里的密码
传统账户体系中,账户名、密码与对应关系存储在中心化数据库里。验证时,通过比对数据库中的数据来验证中心化数据库有管理员作恶、被攻击盗取等风险。
区块链中随机机生成私钥,通过数学加密曲线生成公钥公钥与私钥存在数学关系,可以直接验证。
通常使用椭圆加密曲线函数:
1.3 记录者(矿工)操作流程
- 收集交易:矿工从交易池收集交易,并组装成一个待验证的区块。
- 寻找随机数:矿工通过不断调整区块头中的随机数(Nonce),计算出区块头的哈希值,试图使其小于网络难度目标。
- 广播区块:一旦找到符合难度要求的随机数,矿工会计算出该区块的所有权和交易费,并广播到全网。
- 验证区块:其他节点接受该区块,并进行验证,确保交易有效、没有双花等问题。
- 达成共识:经过大多数节点验证没有问题后,该区块会被添加到区块链上,交易确认完成。
- 获得奖励:根据该区块中交易数量和费用,系统会向找到该区块的矿工发送一定数量的加密货币作为挖矿奖励。
二、代码示例
2.1 准备工作
一般使用levelDB
或couchDB
存储区块数据,先安装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(<