142

感性认识比特币 - 基于Wireshark分析Bitcoin Core协议消息序列

 6 years ago
source link: https://zhuanlan.zhihu.com/p/32267090?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

基于Wireshark分析Bitcoin Core协议消息序列

现在比特币价格十万CNY一个,每一个比特币都万分宝贵。从过往的经验我们知道,任何比特币交易所都是不值得信任,投资比特币一定要下载官方bitcoin core钱包,比特币地址一定要用自己的bitcoin core钱包生成,比特币地址和私钥等相关信息一定要用纸抄下来、用手机拍照、放到冰箱冷冻室里冷藏保存才足够安全可靠。(所谓“冷钱包”:P)

本文介绍一下对bitcoin core初次运行后所产生网络流量即bitcoin protocol的简单分析,老宋通过wireshark(winpcap)抓包,结合wireshark截图展示bitcoin protocol协议功能。希望为bitcoin小白级入门者提供一些对比特币的感性认识。

首先,作为bitcoin投资者,你需要到 https://bitcoin.org/ 官网下载正规的bitcoin core钱包。

v2-700a5ddb1a17893e9d8da67dcc9b45f5_720w.jpgv2-2e34692117a55fd7615dd5141447b0d4_720w.jpg

老宋在WinXP中下载了bitcoin core win32版本,解压后进入bin/目录,执行bitcoin-qt.exe程序,运行bitcoin core钱包。

v2-3aaadd11daf7f30f4c85ae5e36e44910_720w.jpg

现在是2017年12月22日,比特币系统已经运行了8年多了,每10分钟一个区块,整个区块链已经非常大了。钱包提示将会下载大概153GB的区块链数据文件,而老宋的WinXP默认目录所在磁盘只有17GB空闲空间,要求选择一个有足够空闲空间的路径。

v2-44cbf0a6813a6d10b9cb50ca8577533a_720w.jpg

钱包需要打开本地端口,与网络通信,WinXP会提示,应解除阻止。

v2-5b73652bf88f82b23d642c63ffc8b73d_720w.jpg

现在,钱包将从比特币网络同步整个区块链。请注意下图底部状态栏信息,钱包正在同步区块头,落后8年50周,因为比特币的中继节点通常在外国,所以同步的速度会非常慢,估计要几天甚至几周才能同步到最新的区块。

v2-1dd014a88174c1ac5376800cde75111f_720w.jpg

区块链将保存前边指定的路径中,如下C:\songke.online\bitcoin_core_data\是老宋指定的区块链路径,等几周之后,这个路径将会达到153GB左右。

v2-7852a9c6d80208227ce01d527ae1c3e8_720w.jpg

在运行bitcoin core钱包之前,已经运行了wireshark开始抓包,抓取几十MB网络流量后停止抓包,我们看看bitcoin protocol是什么样的。首先打开wireshark的流表,可以看到比特币虽然是P2P网络,但是并发流数并不像迅雷那么多,总共只有31个TCP流,端口都是8333。

v2-7825690237fb4379071a7cc4ed73ff49_720w.jpg

按流量排序一下,看到主要的流量都在同一条流中传输,我们下面只关注这一条流的内容。

v2-e6bd7f020dcaaa526de81d6f0c9159e0_720w.jpg

用wireshark打开这条流,我的wireshark是从百度软件下载的最新版本2.4.3,该版本已经支持较新的bitcoin protocol,看到wireshark可以识别出该流中的某些报文是Bitcoin协议,并且能解码出bitcoin消息的命令码,如version、verack、getaddr、ping等,但是因为wireshark支持的bitcoin protocol版本还是不及时,有些命令码不支持,就会显示[unknown command]。

bitcoin protocol的内容是明文的,如果中途路由器等设备想要阻断bitcoin protocol的话,至少目前是可以很容易阻断的。

这条流的网络侧IP地址89.75.73.11,我们到http://ipip.net查一下这个地址的GEO信息,是波兰的地址。

我们选中第一条version消息,从wireshark显示该报文的码流可以看出,命令码"version"在消息中是ASCII明文形态。

Wireshark支持对该version消息进行解码,解码树展开如下。钱包首先上来一定要发送version消息,对端(波兰)也会发version消息,双方将自己的版本信息告诉对方。其中可以看到UserAgent字段是/Satoshi:0.15.1/,0.15.1是bitcoin core钱包的版本号,Satoshi Nakamoto是比特币发明人中本聪的名字。

如果对方支持(兼容)相关版本的话,会回复verack消息。verack只是空消息。

钱包会发送getaddr消息,以向网络询问有哪些活跃的网络节点。网络对端会将其认为是活跃的节点的信息发送给钱包,通常3小时内有消息收发的节点算作活跃的。

下一条消息是钱包发出的sendheaders消息,但是很不幸wireshark不支持这个命令码,在列表中显示为[unknown command],但因为命令码是明文ASCII形式,所以在解码树中是可以看到命令码的内容的。sendheaders表示钱包支持最新的headers命令,后续对端可以通headers消息宣告新区块。

下一条消息是sendcmpct,wireshark仍然不支持。该消息用于钱包告知对端自己支持接收哪些后续消息,如cmpctblock或invs或headers。

再下一条还是sendcmpct消息,钱包发了两遍。

接下来是ping消息,钱包用来检测对端TCP连接是否OK,并期待对端响应pong消息,乒乓。

接下来是getheaders消息,该消息指示只下载区块的header,不需要下载交易内容。有很多交易与我们无关,因为有梅克尔树算法存在,所以我们只需要下载自己关心的交易,对于绝大多数不关心的交易所在的区块,只需要下载区块header即可。

接下来是feefilter,用于设置费率,避免无效消息的重放攻击。费率单位是每1000字节多少聪,聪是比特币最小单位即一亿分之一比特币。

从码流可以看到,费率是小字节序,即03e8,十进制为1000。也就是说每1000字节花费1000聪,按现在10万人民币一个币,1000聪是0.1分钱。就是说,每1000字节的交易要至少花费0.1分钱。

再往后就是几个pong消息,然后就是大量区块头数据、交易数据的下载了,这里不再赘述。

本文结合wireshark对bitcoin core伊始运行产生的bitcoin protocol消息码流进行简单的分析,让入门级读者稍微了解bitcoin core、bitcoin protocol相关知识。老宋在此希望读者能自己动手安装bitcoin core,弄懂bitcoin原理,从而更好的管理自己的私钥,管理自己的比特币资产。虽然bitcoin很复杂,但十万一枚毕竟不是小数目,为了捍卫自己的血汗钱,彻夜不眠去弄懂这些知识还是值得的。

Reference:

0. 老宋的独家号 ( http://songke.online )

1. Open source P2P money

2. Protocol documentation

3. bitcoin/bips

注:本文为老宋原创文章,欢迎随意转载,有任何疑问请至【知乎专栏-老宋的独家号】评论区讨论交流。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK