本文提出了一种完全通过点对点技术实现的电子现金系统,它使得在线支付能够直接由一方发起并支付给另外一方,中间不需要通过任何的金融机构
## 参考资料
精通比特币
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 资料、工具推荐和扩展阅读
- 结论
- 附录