多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
本文提出了一种完全通过点对点技术实现的电子现金系统,它使得在线支付能够直接由一方发起并支付给另外一方,中间不需要通过任何的金融机构 ## 参考资料 精通比特币 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/