Protocol
無法正確發送“版本”消息
幾天前,我發現了這篇關於使用原始比特幣協議的文章,現在我正在嘗試使用 Python 進行自己的交易。但是我已經堅持發送
version
消息了。我嘗試使用文章中的程式碼片段。根據它,下面的程式碼應該可以工作,但是 Wireshark 無法辨識任何東西並且沒有
verack
響應import msgUtils import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(("NODE_IP_ADDRESS", 8333)) # Shodan search 'port:8333' sock.send(msgUtils.getVersionMsg()) sock.recv(1000) # receive version sock.recv(1000) # receive verack
也許它不起作用,因為文章是在 2014 年寫的,現在它已經完全過時了?
好吧,可能有一個錯誤,這是一個基於此程式碼的工作版本:
import time import socket import struct import random def makeMessage(cmd, payload): magic = "F9BEB4D9".decode("hex") # Main network command = cmd + (12 - len(cmd)) * "\00" length = struct.pack("I", len(payload)) check = hashlib.sha256(hashlib.sha256(payload).digest()).digest()[:4] return magic + command + length + check + payload def versionMessage(): version = struct.pack("i", 60002) services = struct.pack("Q", 0) timestamp = struct.pack("q", time.time()) addr_recv = struct.pack("Q", 0) addr_recv += struct.pack(">16s", "127.0.0.1") addr_recv += struct.pack(">H", 8333) addr_from = struct.pack("Q", 0) addr_from += struct.pack(">16s", "127.0.0.1") addr_from += struct.pack(">H", 8333) nonce = struct.pack("Q", random.getrandbits(64)) user_agent_bytes = struct.pack("B", 0) height = struct.pack("i", 0) payload = version + services + timestamp + addr_recv + addr_from + nonce +user_agent_bytes + height return payload if __name__ == "__main__": sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(("93.170.187.9", 8333)) sock.send(makeMessage("version", versionMessage())) sock.recv(1024) # version sock.recv(1024) # verack
由於錯誤,msgUtils.py 程式碼不適用於 64 位 Python。我已修復它,因此您可以嘗試更新的程式碼。(我是這篇文章的作者。)