# 比特幣腳本語言
在比特幣中有一個*腳本(Script)*編程語言,它用于鎖定交易輸出;交易輸入提供了解鎖輸出的數據。這個語言非常簡單,用這個語言寫的代碼其實就是基于堆棧的一系列數據和操作符。
比特幣腳本語言一方面可以很好的解決多重簽名問題,另外一方面對于加密算法有很好的支持,此外,它已經具備一定的智能合約的能力。
比特幣腳本語言不是圖靈完備的語言。
# P2PKH
*Pay to Public Key Hash(P2PKH)*,這是比特幣最常用的一個腳本。它所做的事情就是向一個公鑰哈希支付,也就是說,用某一個公鑰鎖定一些幣。這是**比特幣支付的核心**:沒有賬戶,沒有資金轉移;只有一個腳本檢查提供的簽名和公鑰是否正確。
~~~
5 2 OP_ADD 7 OP_EQUAL
~~~
5, 2, 和 7 是數據,`OP_ADD`和`OP_EQUAL`是操作符。*腳本*代碼從左到右執行:將數據依次放入棧內,**當遇到操作符時,就從棧內取出數據,并將操作符作用于數據,然后將結果作為棧頂元素壓入棧。***腳本*的棧,實際上就是一個先進后出的內存存儲:棧里的第一個元素最后一個取出,后面的每一個元素都會放到前一個元素之上。
比特幣中腳本支付:
~~~
<signature> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
~~~
這個腳本實際存儲為兩個部分:
1. 第一個部分,`<signature> <pubkey>`,存儲在輸入的`ScriptSig`字段。
2. 第二部分,`OP_DUP OP_HASH160 <pubkeyHash> OP_EQUALVERYFY OP_CHECKSIG`存儲在輸出的`ScriptPubKey`里面。
| 步驟 | 棧 | 腳本 |
| --- | --- | --- |
| 1 | 空 | `<signature> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG` |
| 2 | `<signature>` | `<pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG` |
| 3 | `<signature> <pubkey>` | `OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG` |
| 4 | `<signature> <pubKey> <pubKey>` | `OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG` |
| 5 | `<signature> <pubKey> <pubKeyHash>` | `<pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG` |
| 6 | `<signature> <pubKey> <pubKeyHash> <pubKeyHash>` | `OP_EQUALVERIFY OP_CHECKSIG` |
| 7 | `<signature> <pubKey>` | `OP_CHECKSIG` |
| 8 | `true`或`false` | 空 |
`OP_DUP`對棧頂元素進行復制。`OP_HASH160`取棧頂元素,然后用`RIPEMD160`對它進行哈希,再將結果送回到棧上。`OP_EQUALVERIFY`將棧頂的兩個元素進行比較,如果它們不相等,終止腳本。`OP_CHECKSIG`通過對交易進行哈希,并使用`<signature>`和`pubKey`來驗證一筆交易的簽名。最后的操作符有點復雜:它生成了一個修剪后的交易副本,對它進行哈希(因為它是一個被簽名后的交易哈希),然后使用提供的`<signature>`和`pubKey`檢查簽名是否正確。
有了一個這樣的腳本語言,實際上也可以讓比特幣成為一個智能合約平臺:除了向一個單一的公鑰轉移資金,這個語言還使得一些其他的支付方案成為可能。
- 重要更新說明
- linechain發布
- linechain新版設計
- 引言一
- 引言二
- 引言三
- vs-code設置及開發環境設置
- BoltDB數據庫應用
- 關于Go語言、VS-code的一些Tips
- 區塊鏈的架構
- 網絡通信與區塊鏈
- 單元測試
- 比特幣腳本語言
- 關于區塊鏈的一些概念
- 區塊鏈組件
- 區塊鏈第一版:基本原型
- 區塊鏈第二版:增加工作量證明
- 區塊鏈第三版:持久化
- 區塊鏈第四版:交易
- 區塊鏈第五版:實現錢包
- 區塊鏈第六版:實現UTXO集
- 區塊鏈第七版:網絡
- 階段小結
- 區塊鏈第八版:P2P
- P2P網絡架構
- 區塊鏈網絡層
- P2P區塊鏈最簡體驗
- libp2p建立P2P網絡的關鍵概念
- 區塊鏈結構層設計與實現
- 用戶交互層設計與實現
- 網絡層設計與實現
- 建立節點發現機制
- 向區塊鏈網絡請求區塊信息
- 向區塊鏈網絡發布消息
- 運行區塊鏈
- LineChain
- 系統運行流程
- Multihash
- 區塊鏈網絡的節點發現機制深入探討
- DHT
- Bootstrap
- 連接到所有引導節點
- Advertise
- 搜索其它peers
- 連接到搜到的其它peers
- 區塊鏈網絡的消息訂發布-訂閱機制深入探討
- LineChain:適用于智能合約編程的腳本語言支持
- LineChain:解決分叉問題
- LineChain:多重簽名
- libp2p升級到v0.22版本
- 以太坊基礎
- 重溫以太坊的樹結構
- 世界狀態樹
- (智能合約)賬戶存儲樹
- 交易樹
- 交易收據樹
- 小結
- 以太坊的存儲結構
- 以太坊狀態數據庫
- MPT
- 以太坊POW共識算法
- 智能合約存儲
- Polygon Edge
- block結構
- transaction數據結構
- 數據結構小結
- 關于本區塊鏈的一些說明
- UML工具-PlantUML
- libp2p介紹
- JSON-RPC
- docker制作:啟動多個應用系統
- Dockerfile
- docker-entrypoint.sh
- supervisord.conf
- docker run
- nginx.conf
- docker基礎操作整理
- jupyter計算交互環境
- git技巧一
- git技巧二
- 使用github項目的最佳實踐
- windows下package管理工具