diff --git "a/Hash\350\277\220\347\256\227.md" "b/Hash\350\277\220\347\256\227.md" new file mode 100644 index 0000000..0d9af69 --- /dev/null +++ "b/Hash\350\277\220\347\256\227.md" @@ -0,0 +1,41 @@ +比特币脚本支持多种哈希运算。比特币脚本是一种基于堆栈的编程语言,它提供了一些操作码(opcode)用于处理哈希运算。以下是比特币脚本中常用的哈希运算指令: + +1. **`OP_HASH160`** + - 计算数据的 **`RIPEMD-160(SHA-256(data))`**。也就是先对数据执行 SHA-256,然后将结果作为输入执行 RIPEMD-160。这个操作通常用于生成比特币地址(P2PKH 和 P2SH 地址)。 + - **堆栈操作**:` -> ` + +2. **`OP_SHA256`** + - 计算数据的 **SHA-256** 哈希。SHA-256 是一种广泛使用的哈希算法,它输出 256 位(32 字节)的哈希值。 + - **堆栈操作**:` -> ` + +3. **`OP_SHA1`** + - 计算数据的 **SHA-1** 哈希。虽然 SHA-1 在某些场景下已被认为不再足够安全,但它仍然可以用于一些特定用途。 + - **堆栈操作**:` -> ` + +4. **`OP_RIPEMD160`** + - 计算数据的 **RIPEMD-160** 哈希。RIPEMD-160 是一种输出 160 位(20 字节)哈希值的算法,比特币地址格式(例如 P2PKH 地址)依赖此算法。 + - **堆栈操作**:` -> ` + +### 示例:比特币支付脚本中使用哈希运算 + +以下是一个常见的 Pay-to-PubKey-Hash(P2PKH)交易脚本,它使用了 `OP_HASH160` 指令: + +#### 锁定脚本(ScriptPubKey) +```bash +OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG +``` + +1. `OP_DUP`:复制堆栈上的公钥。 +2. `OP_HASH160`:对公钥进行 SHA-256 和 RIPEMD-160 的双重哈希运算,生成公钥哈希(`PubKeyHash`)。 +3. `OP_EQUALVERIFY`:验证计算出的哈希值是否等于给定的 `PubKeyHash`。 +4. `OP_CHECKSIG`:验证签名是否有效。 + +#### 解锁脚本(ScriptSig) +```bash + +``` + +解锁脚本提供了签名和公钥,脚本会先验证公钥对应的哈希是否匹配,然后验证签名的合法性。 + +### 总结 +比特币脚本支持多种哈希运算,主要用于验证数据的完整性和确保交易的正确性。最常见的哈希运算是 `OP_HASH160`,用于生成比特币地址,并在 P2PKH 和 P2SH 类型的交易中应用。