首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在比特币中使用套接字编程从比特币节点获取getaddr的响应?

如何在比特币中使用套接字编程从比特币节点获取getaddr的响应?
EN

Stack Overflow用户
提问于 2019-09-24 20:57:17
回答 1查看 310关注 0票数 0

我想要从现有节点获取比特币节点的列表,目的是获取当前运行比特币的节点的所有ip地址。我已经使用套接字编程连接到现有节点,并希望获得该节点中的地址列表。所以我写了一条消息来获取这个节点的地址。但是,套接字不使用地址列表进行响应

代码语言:javascript
复制
    import socket;
    import time;
    import hashlib;
    import struct;
    import random;

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
    HOST = "5.182.39.200";
    PORT = 8333;

    def create_version_message():
        version = struct.pack("i",70015);
        services = struct.pack("Q",0);
        timestamp = struct.pack("q",int(time.time()));
        addr_recv_services = struct.pack("Q",0);
        addr_recv_ip = struct.pack(">16s",bytes(HOST, 'utf-8'));
        addr_recv_port = struct.pack(">H",8333);
        addr_trans_services = struct.pack("Q",0);
        addr_trans_ip = struct.pack(">16s",bytes("127.0.0.1",'utf-8'));
        addr_trans_port = struct.pack(">H",8333);
        nonce = struct.pack("Q", random.getrandbits(64));
        user_agent_byes = struct.pack("B",0);
        start_height = struct.pack("i",596306);
        relay = struct.pack("?",False);
        payload = version + services + timestamp + addr_recv_services + addr_recv_ip + addr_recv_port + addr_trans_services + addr_trans_ip + addr_trans_port + nonce + user_agent_byes + start_height + relay;
        magic = bytes.fromhex("F9BEB4D9");
        command = b"version" + 5 * b"\00";
        length = struct.pack("I", len(payload));
        checksum = hashlib.sha256(hashlib.sha256(payload).digest()).digest()[:4];
        return magic + command + length + checksum + payload;

    def create_getaddr_message():
        magic = bytes.fromhex("F9BEB4D9");
        command = b"getaddr" + 5 * b"\00";
        payload = b"";
        length = struct.pack("I", len(payload));
        checksum = hashlib.sha256(hashlib.sha256(payload).digest()).digest()[:4];
        return magic + command + length + checksum + payload;

     sock.connect((HOST,PORT));
     sock.send(create_version_message());
     sock.recv(1024);
     time.sleep(5);
     sock.send(create_verack_message());
     time.sleep(5);
     sock.send(create_getaddr_message());
     sock.recv(1024);
EN

回答 1

Stack Overflow用户

发布于 2019-09-25 16:05:36

你必须遵循比特币协议。

  • 从远程发送版本message
  • receive版本消息
  • 从远程接收verac消息(您必须发出sock.recv两次)
  • 发送verac消息

在此连接建立之后,您可以递归地发送getaddr消息和处理结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58080849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档