Protocol

無法正確發送“版本”消息

  • January 2, 2017

幾天前,我發現了這篇關於使用原始比特幣協議的文章,現在我正在嘗試使用 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。我已修復它,因此您可以嘗試更新的程式碼。(我是這篇文章的作者。)

引用自:https://bitcoin.stackexchange.com/questions/50444