<aside> 💡 UTXO、Account、签名、重放攻击、Rollup、隐私
</aside>
区块链的tx分为两种模型,分别是比特币为代表的UTXO(Unspent Transaction Output)模型,和以太坊为代表的Account模型。前者适用于货币记账,后者适用于链上应用。
比特币的tx结构(Github)
const std::vector<CTxIn> vin;
const std::vector<CTxOut> vout;
const int32_t nVersion;
const uint32_t nLockTime;
一个tx包含一个或多个输入(Input)、一个或多个输出(Output)。以币安热钱包地址为例:
UXTO模型
支付流程:用户A支付金额n给用户B
m-n-fee
UTXO selection
UTXO模型的特点
隐私性强
比特币的多地址钱包
并发容易
结论
例子回顾:双花攻击(Double-spending Attack)
tx和state
以太坊的tx结构(Github)
From
可以从签名V,R,S
中算出来To
是目标地址Value
是转账金额Data
字段会在调用合约的时候用上,记录调用的method和输入的参数Gas
相关的字段是付给矿工的手续费Type hexutil.Uint64 `json:"type"`
// Common transaction fields:
Nonce *hexutil.Uint64 `json:"nonce"`
GasPrice *hexutil.Big `json:"gasPrice"`
MaxPriorityFeePerGas *hexutil.Big `json:"maxPriorityFeePerGas"`
MaxFeePerGas *hexutil.Big `json:"maxFeePerGas"`
Gas *hexutil.Uint64 `json:"gas"`
Value *hexutil.Big `json:"value"`
Data *hexutil.Bytes `json:"input"`
V *hexutil.Big `json:"v"`
R *hexutil.Big `json:"r"`
S *hexutil.Big `json:"s"`
To *common.Address `json:"to"`
记录State
key是地址:既可以是普通用户地址,又可以是合约地址
value的结构(Github)
Nonce uint64
Balance *big.Int
Root common.Hash // merkle root of the storage trie
CodeHash []byte
Nonce
:从0开始,每发出一个tx,记录进tx,然后加1;用来保证tx的顺序执行和签名的唯一性Balance
:该地址的余额Root
:合约的数据库的hashCodeHash
:合约的源码stateRoot
字段,用于验证State
stateRoot
验证通过tx花费的gas主要取决于:新增存储空间+验证所需计算
Account模型的特点(用富豪榜和Polygon的地址观察)
Nonce
串行的、顺序的,无法并发Balance
用完