3、区块链与所有权:分布式账本的核心特性
聊所有权凭证,绕不开区块链。说白了,区块链就是一个谁都不能篡改的账本。我2017年第一次接触比特币源码时,最震撼的就是这个设计——它让「信任」从人转移到了数学。
3.1 分布式账本的核心特性
区块链作为分布式账本,有四个特性我每天都在用:
- 去中心化:数据不存一家服务器上。我见过一个联盟链项目,甲方非要自己控制所有节点,结果被合作伙伴集体抵制——去中心化不是技术问题,是治理问题。
- 不可篡改:一旦上链,想改数据?你得控制51%的算力或节点。嗯,理论上可能,但成本高到不现实。
- 透明可追溯:每笔交易从哪来到哪去,链上清清楚楚。我做供应链溯源时,客户最看重的就是这条。
- 共识机制:大家怎么达成一致?PoW、PoS、PBFT……各有各的适用场景。
核心理解:区块链不是数据库的替代品,而是信任机器。它解决的是「我怎么相信你没骗我」的问题。
3.2 UTXO模型 vs 账户模型
这两个模型,是区块链世界的「底层哲学分歧」。我当年从以太坊转去研究比特币时,被UTXO绕晕过好一阵。
UTXO模型(比特币)
UTXO全称是「未花费交易输出」。你可以把它想象成现金:你有一张10块、一张5块,想买12块的东西,就得把两张都花出去,找回3块。
核心规则:
- 每笔交易有多个输入和输出
- 输入必须是之前某个交易的未花费输出
- 输入总额必须 ≥ 输出总额(差额是矿工费)
// 一个简化的UTXO交易结构
{
"inputs": [
{ "txid": "abc123", "vout": 0, "amount": 10.0 },
{ "txid": "def456", "vout": 1, "amount": 5.0 }
],
"outputs": [
{ "address": "1A1zP...", "amount": 12.0 },
{ "address": "1B2xQ...", "amount": 2.99 } // 找零
]
}
我的经验:UTXO模型做并行处理特别爽。每笔交易只依赖之前的UTXO,互不干扰。我做过一个高性能支付系统,用UTXO模型轻松做到每秒几千笔。
账户模型(以太坊)
账户模型更像银行账户:你有一个余额,转账时直接扣减,系统帮你记账。
// 以太坊账户状态
{
"nonce": 5, // 交易序号,防重放
"balance": "100.5", // 余额
"storageRoot": "...", // 合约存储
"codeHash": "..." // 合约代码
}
核心区别:
- UTXO:关注「钱从哪来」,每笔钱都有来源证明
- 账户模型:关注「谁有多少钱」,状态实时更新
| 对比维度 | UTXO模型 | 账户模型 |
|---|---|---|
| 类比 | 现金 | 银行账户 |
| 并发能力 | 强(可并行验证) | 弱(需串行处理) |
| 隐私性 | 较高(地址可复用) | 一般(余额公开) |
| 智能合约 | 难实现 | 天然支持 |
| 典型代表 | 比特币、Cardano | 以太坊、EOS |
避坑指南:我曾经在一个项目中试图在UTXO上跑复杂业务逻辑,结果代码写得像意大利面。后来老老实实换了账户模型——选模型就是选战场,别拿UTXO做它不擅长的事。
3.3 资产发行协议:ERC-20与ERC-721
有了账本,怎么在上面发行资产?以太坊给出了标准答案。
ERC-20:同质化代币
ERC-20定义了可互换代币的标准。你的USDT和我的USDT,一模一样,可以互换。
核心接口:
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
我部署过十几个ERC-20合约,最常踩的坑是精度问题。ERC-20用18位小数,但有些项目用6位(USDT)或8位。跨链桥接时精度不匹配,资金直接卡死。
我的习惯:写ERC-20合约时,我一定加一个_beforeTokenTransfer钩子。这样后续加黑名单、手续费等功能,不用动核心逻辑。
ERC-721:非同质化代币(NFT)
ERC-721代表独一无二的资产。每个token都有一个ID,不能互换。你想想看,你的房子和我的房子能互换吗?不能。
interface IERC721 {
function balanceOf(address owner) external view returns (uint256);
function ownerOf(uint256 tokenId) external view returns (address);
function transferFrom(address from, address to, uint256 tokenId) external;
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}
ERC-721有个「隐形炸弹」:safeTransferFrom会检查接收方是不是合约,如果是合约,必须实现onERC721Received接口。我见过有人用transferFrom直接转给合约,结果NFT永远锁死在里面。
| 特性 | ERC-20 | ERC-721 |
|---|---|---|
| 互换性 | 可互换 | 不可互换 |
| 唯一标识 | 无(靠余额) | tokenId |
| 典型用途 | 代币、稳定币 | 数字藏品、游戏道具 |
| 元数据 | 无标准 | ERC-721 Metadata扩展 |
3.4 核心逻辑关系图
下面这张图,是我给团队培训时必画的。它把本章三个知识点串起来了:
3.5 实战选择建议
你可能会问:那我到底该用哪个?
- 做支付、结算系统:UTXO模型更安全、可审计性更强。比特币这么多年没出过大问题,不是没道理的。
- 做DeFi、游戏、复杂业务:账户模型更灵活。以太坊的生态摆在那,工具链成熟。
- 发行代币:ERC-20是标配。但如果你要发的是「一个萝卜一个坑」的资产,比如房产证、学位证书,ERC-721更合适。
最后提醒一句:不管选哪个模型,审计一定要做。我见过太多项目,代码写得花里胡哨,结果一个整数溢出漏洞,几百万美元直接归零。安全不是功能,是底线。