在上一节,我们看到了区块链如何用哈希、工作量证明和数字签名构建出一个不可篡改的全球账本。这一节,我们钻进这个账本内部,看看一笔交易到底长什么样,那个由一串字符组成的“钱包地址”又是怎么来的,以及你的私钥到底是怎么签下每一笔交易的。
从私钥到地址:一段哈希之旅
每个比特币用户都有一对密钥:私钥和公钥。私钥是一个256位的随机数,通常用64个十六进制字符表示。你可以把它想象成一张银行卡的密码,绝不能告诉任何人。公钥则由私钥通过椭圆曲线乘法生成(比特币用的是我们之前提过的 secp256k1 曲线)。
但比特币地址并不是直接使用公钥,而是把公钥经过两次哈希运算,得到一个更短、更安全的字符串。这个过程是:
公钥 → SHA-256 → RIPEMD-160 → 添加版本号 → Base58Check编码 → 地址 |
用比喻来说:公钥是你的真名,但为了隐私和便利,你给自己取了一个昵称(地址)。别人可以用这个昵称给你寄钱,但你不需要把真名告诉所有人。而且,哈希是单向的,从地址无法反推出公钥,更无法反推出私钥,这就多了一层安全防护。
比特币地址通常以“1”或“3”开头(如 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa),它就是一串看似随机的字符,却是你接收比特币的唯一标识。
交易是什么?
在比特币的世界里,没有“账户余额”这个传统概念。你的钱实际上是一堆“未花费的交易输出”(UTXO,Unspent Transaction Output)。每一笔交易都会消耗掉一些旧的UTXO,并创建出新的UTXO。
想象一下,你手里有几张不同面额的支票,每张支票都写着“凭此票可向某某兑付一定金额”。当你想支付给别人时,你拿出一张或几张支票,把它们“撕掉”(消耗),然后开出一张新的支票给收款人,可能还会给自己开一张找零的支票。这就是UTXO模型。
一笔比特币交易的结构大致如下:
- 交易ID:整个交易的哈希值,作为唯一标识。
- 输入列表:指明要花费哪些之前的UTXO,每个输入包含一个“引用”(指向之前某笔交易的某个输出)和一个“解锁脚本”(主要是你的数字签名和公钥)。
- 输出列表:指明新的UTXO给谁,每个输出包含“金额”和“锁定脚本”(通常就是收款人的地址,即“谁可以花这笔钱”)。
签名:证明“这钱是我的”
当你发起一笔交易时,你需要用私钥对交易内容进行数字签名。具体来说,签名的对象是整个交易(经过特殊处理,不包括输入脚本本身)。签名后,你把签名和公钥放入输入脚本中,广播到网络。
矿工收到交易后,会做两件事:
- 验证签名:用输入脚本中的公钥解密签名,得到交易哈希,再与交易本身重新计算的哈希比对。如果一致,说明这笔交易确实由私钥持有者授权。
- 检查UTXO:确认输入所引用的UTXO确实存在且未被花费过。
验证通过后,交易才会被放入候选区块,等待打包上链。
这个过程就像你写了一张支票,签上自己的名字(签名),然后别人拿着支票去银行,银行核对你的签名笔迹(验证签名),确认你的账户有足够余额(检查UTXO),然后才会把钱转给收款人。
交易示例:从A到B
假设爱丽丝想给鲍勃转0.5个比特币。她的钱包里有之前收到的一笔1个比特币的UTXO(来自某次交易)。她的交易会这样构造:
- 输入:引用那笔1 BTC的UTXO,并附上爱丽丝的签名和公钥。
- 输出1:给鲍勃的地址,金额0.5 BTC。
- 输出2:给爱丽丝自己的找零地址,金额0.49 BTC(减去0.01 BTC矿工费)。
当矿工打包这笔交易后,爱丽丝原来的1 BTC UTXO被标记为“已花费”,而鲍勃获得了0.5 BTC的新UTXO,爱丽丝自己也获得了0.49 BTC的新UTXO。她的“余额”从1 BTC变成了0.49 BTC(加上还未确认的找零),鲍勃则增加了0.5 BTC。
地址、签名、交易,三者缺一不可
- 地址让你能接收比特币,但它只是公钥的哈希,不暴露你的私密信息。
- 签名让你能花费比特币,证明你是地址的合法持有者。
- 交易记录了价值的转移,形成不可篡改的账本。
当你打开一个比特币钱包应用,它会自动为你生成私钥(严格保密)和地址,扫描区块链上的UTXO,计算出你的余额。当你发送比特币时,钱包帮你构造交易、签名,并广播出去。所有这一切的背后,都是密码学在默默运行:椭圆曲线用于生成密钥对,哈希用于地址和交易ID,数字签名用于授权。
比特币之所以被称为“密码学货币”,就是因为它的每一处核心机制都建立在密码学之上。没有哈希,就没有不可篡改的链;没有签名,就无法证明所有权;没有工作量证明,就无法达成去中心化的共识。
下一节,我们将走进智能合约的世界,看看区块链如何承载更复杂的逻辑,以及零知识证明如何让隐私与透明兼得。