本文提出了一種完全通過點對點技術實現的電子現金系統,它使得在線支付能夠直接由一方發起并支付給另外一方,中間不需要通過任何的金融機構
## 參考資料
精通比特幣
http://book.8btc.com/books/1/master_bitcoin/_book/
WebSocket API
wss://ws.bitstamp.net.
wss://ws.blockchain.info/inv
通過使用錢包的 RPC 接口,我們可以獲取很多信息,比如使用 bitcoind getblockhash 100 就是獲取區塊高度為 100 的區塊哈希值,但是有的時候錢包 RPC 需要運行在包含完整區塊的機器上,目前這些區塊(比特幣)已經達到 200G 多。
### 端口說明
| 端口 | 描述 | 用途 |
| ---- | ---- | -------- |
| 8332 | rpc | 接口調用 |
| 8333 | p2p | 節點通信 |
| 8334 | wss | 長連接 |
## 地址校驗
## 單位轉換
5種計價單位btc,cbtc,mbtc,ubtc/μbtc,satoshi, 其中satoshi是最小的單位
```sh
1比特幣(Bitcoins,BTC)
0.01比特分(Bitcent,cBTC)
0.001毫比特(Milli-Bitcoins,mBTC)
0.000001微比特(Micro-Bitcoins,μBTC或uBTC)
0.00000001聰(satoshi)(基本單位)
# 換算如下
= 1 bitcoin (BTC)
= 100 Bitcent (cBTC)
= 1000 millibitcoins (mBTC)
= 1 million microbitcoins (uBTC) 也就是100 0000
= 100 million Satoshi 也就是1億 (10000 0000)
```
## 啟動程序
```sh
# 到用戶目錄下
cd ~
# 創建目錄
mkdir .bitcoin
# 新建配置文件
vim .bitcoin/bitcoin.conf
# bitcoin.conf 文件內容
datadir=/data/btc_data
dbcache=10240
txindex=1
rpcuser=btc
rpcpassword=btc
daemon=1
server=1
rest=1
rpcbind=0.0.0.0:8332
rpcallowip=0.0.0.0/0
deprecatedrpc=accounts
# 保存文件
:wq
# 啟動命令
bitcoind -daemon
```
### CMD命令調用
```sh
# 獲取基本信息
bitcoin-cli -getinfo
# 通過賬戶獲取地址
bitcoin-cli getaddressesbyaccount testing
# 給錢包加密
bitcoin-cli encryptwallet "Hm_13159"
# 給錢包解鎖
bitcoin-cli walletpassphrase "Hm_13159" 60
# 給錢包上鎖
bitcoin-cli walletlock
# 給錢包換密碼
bitcoin-cli walletpassphrasechange "123" "456"
bitcoin-cli walletpassphrase "456" 60
# 導出錢包
bitcoin-cli dumpprivkey "xxxxxxxxxxxxxxxxxxxxxxxx"
xxxxxxxxxxxxxxxxxxxxxxxx
# 導入錢包
bitcoin-cli importprivkey "xxxxxxxxxxxxxxxxxxxxxxxx" "testing" true
# 獲取余額
bitcoin-cli getbalance "xxxxxxxxxxxxxxxxxxxxxxxx"
# 列出賬戶花費
bitcoin-cli listunspent 6 99999999 '''
[
"1EXiBj8pkxmsPb6dNAMLFcZYTRSNsUUesS"
]
'''
```
### RPC接口調用
```js
# RPC接口調用
[官方RPC參考](//bitcoincore.org/en/doc/0.17.0/rpc/blockchain/getblock/)
```
```sh
curl --user btc:btc2018 -H 'content-type:text/plain;' http://127.0.0.1:8332/ --data-binary '{"jsonrpc":"1.0","id":"1","method":"getblockhash","params":[1]}'
curl --user btc:btc2018 -H 'content-type:text/plain;' http://127.0.0.1:8332/ --data-binary '{"jsonrpc":"1.0","id":"1","method":"listaccounts","params":[1]}'
curl --user btc:btc2018 -H 'content-type:text/plain;' http://127.0.0.1:8332/ --data-binary '{"jsonrpc":"1.0","id":"1","method":" getnewaddress","params":[1]}'
```
## 瀏覽器
```js
# 區塊鏈瀏覽器
http://btc.com
Blockchain.info
blockexplorer.com
```
## 第三方接口
**比特幣**
[BTC](https://btc.com/api-doc)
[blockmeta](http:////blockmeta.com/docs)
[bitpay](https://insight.bitpay.com/)
[blockchain](http://blockchain.info/api/blockchain_api)
**以太坊**
[etherchain](https://etherchain.org/api)
[blockmeta](https://blockmeta.com/docs)
以下為一個請求比特幣地址信息示例:
```
curl https://chain.api.btc.com/v3/address/15urYnyeJe3gwbGJ74wcX89Tz7ZtsFDVew
RESPONSE:
{
"err_no": 0,
"data": {
"address": "15urYnyeJe3gwbGJ74wcX89Tz7ZtsFDVew",
"received": 13623974334090,
"sent": 13623874334090,
"balance": 100000000,
"tx_count": 6260,
"unconfirmed_tx_count": 0,
"unconfirmed_received": 0,
"unconfirmed_sent": 0,
"unspent_tx_count": 3,
"first_tx": "030b7d06d1dcec24d017249b6b87a457bd217150afbbe4351f8821870324d00b",
"last_tx": "04ffa9c3875b15ceb65c2dd4ee2654c5fb65374123692362e32fac566a6b16aa"
}
}
```
以下為一個請求以太坊地址信息示例:
```
curl https://etherchain.org/api/account/0xf90c9ac616ecfefb3860aaa5bc33caf9bc606441
RESPONSE:
{
"status": 1,
"data": [{
"address": "0xf90c9ac616ecfefb3860aaa5bc33caf9bc606441",
"balance": 8451311601385754000,
"nonce": null,
"code": "0x",
"name": null,
"storage": null,
"firstSeen": "2016-07-31T00:05:52.000Z"
}]
}
```
本地的比特幣客戶端全部的 RPC 請求方法可以在這里查看。
## 地址區別
以1, 3, bc1 開頭的比特幣地址的區別
- 1 開頭的,是 p2pkh 地址;
- 3開頭的,是p2sh地址(內部也需是segwit);
- bc1開頭的,是bech32編碼的地址,是專為segwit開發的地址格式。
```js
bc1開頭的原生SW地址又可以分兩種:P2WPKH和P2WSH。
P2WPKH比P2WSH要短一些。
P2WPKH的功能和1開頭的P2PKH地址類似,由單個私鑰控制。
P2WSH的功能和3開頭的P2SH地址類似,可以實現多重簽名和一些較復雜的合約,最常見的用途就是閃電網絡通道的開關。
3開頭的P2SH嵌套SW地址,其實也分為P2SH-P2WPKH和P2SH-P2WSH兩種,就是把原生的P2WPKH和P2WSH給“封裝”了一下,以達到兼容老版本錢包的目的
SegWit最主要的目的是修正延展性、sighash二次增長等問題。
不過開發者借此機會干了更多的事情,包括輕度擴容(相當于只給SW用戶擴容,所以SW手續費才便宜)、腳本版本控制(可以用來啟用新腳本操作碼)等等。
segwit 交易費的計算
SW交易的數據分兩部分:非見證部分和見證部分。非見證部分是轉賬的來源和去向。見證部分主要就是數字簽名和公鑰,以及少量腳本操作碼。見證部分字節數要打個折扣(除以4),非見證部分該怎么算還是怎么算。所以,SW交易的手續費比非SW交易更優惠。
```
### 附錄
- 比特幣官網:https://bitcoin.org/
- 比特幣源碼:https://github.com/bitcoin
- 比特幣API官方: https://bitcoin.org/en/developer-reference
- 比特幣瀏覽器1: https://btc.com
- 比特幣瀏覽器2: [https://www.blockchain.com](https://www.blockchain.com/)
- 比特幣瀏覽器3: https://blockexplorer.com/
- 比特幣瀏覽器4: https://insight.bitpay.com/
- 關于本書
- 引言
- 準備工作
- 安裝 Go語言開發環境
- 開始使用Go
- 創建一個Go模塊
- 第一章 手把手系列
- 1.1 教你搭建Nginx教程
- 1.2 教你搭建Jupyter教程
- 1.3 教你搭建Node教程
- 1.4 教你搭建Fabric教程
- 1.5 教你搭建Ethereum教程
- 1.6 教你搭建Bitcoin教程
- 1.7 教你搭建Systemd教程
- 第二章 架構師之路
- 2.1 微服務開發筆記
- 2.2 Docker開發筆記
- 2.3 ElasticSearch開發筆記
- 2.4 Linux開發筆記
- 2.5 Mysql開發筆記
- 2.6 Nginx開發筆記
- 2.7 Redis開發筆記
- 第三章 區塊鏈教程
- 3.1 Bitcoin開發筆記
- 3.2 Ethereum開發筆記
- 3.3 USDT開發筆記
- 第四章 網絡知識庫
- 4.1 比特幣白皮書
- 4.2 以太坊白皮書
- 第五章 技術博客園
- 5.1 Fabric架構詳解
- 5.2 技術開發指南
- 5.3 共識機制詳解
- 第六章 項目管理
- 6.1 項目運行環境
- 6.2 項目經理的角色
- 6.3 第6、7、8章框架
- 第七章 公務員考公
- 7.1 程序員成功上岸經歷
- 7.2 程序員備考的最佳實踐
- 7.3 程序員備考過程中會遇到哪些問題?
- 7.4 公考公平嗎,35歲再去考可以么?
- 7.5 資料、工具推薦和擴展閱讀
- 結論
- 附錄