| 110 | |
| 111 | |
| 112 | class msg_version(MsgSerializable): |
| 113 | command = b"version" |
| 114 | |
| 115 | def __init__(self, protover=PROTO_VERSION): |
| 116 | super(msg_version, self).__init__(protover) |
| 117 | self.nVersion = protover |
| 118 | self.nServices = 1 |
| 119 | self.nTime = int(time.time()) |
| 120 | self.addrTo = CAddress(PROTO_VERSION) |
| 121 | self.addrFrom = CAddress(PROTO_VERSION) |
| 122 | self.nNonce = random.getrandbits(64) |
| 123 | self.strSubVer = (b'/python-bitcoinlib:' + |
| 124 | bitcoin.__version__.encode('ascii') + b'/') |
| 125 | self.nStartingHeight = -1 |
| 126 | self.fRelay = True |
| 127 | |
| 128 | @classmethod |
| 129 | def msg_deser(cls, f, protover=PROTO_VERSION): |
| 130 | c = cls() |
| 131 | c.nVersion = struct.unpack(b"<i", ser_read(f, 4))[0] |
| 132 | if c.nVersion == 10300: |
| 133 | c.nVersion = 300 |
| 134 | c.nServices = struct.unpack(b"<Q", ser_read(f, 8))[0] |
| 135 | c.nTime = struct.unpack(b"<q", ser_read(f, 8))[0] |
| 136 | c.addrTo = CAddress.stream_deserialize(f, True) |
| 137 | if c.nVersion >= 106: |
| 138 | c.addrFrom = CAddress.stream_deserialize(f, True) |
| 139 | c.nNonce = struct.unpack(b"<Q", ser_read(f, 8))[0] |
| 140 | c.strSubVer = VarStringSerializer.stream_deserialize(f) |
| 141 | if c.nVersion >= 209: |
| 142 | c.nStartingHeight = struct.unpack(b"<i", ser_read(f,4))[0] |
| 143 | else: |
| 144 | c.nStartingHeight = None |
| 145 | else: |
| 146 | c.addrFrom = None |
| 147 | c.nNonce = None |
| 148 | c.strSubVer = None |
| 149 | c.nStartingHeight = None |
| 150 | if c.nVersion >= 70001: |
| 151 | c.fRelay = struct.unpack(b"<B", ser_read(f,1))[0] |
| 152 | else: |
| 153 | c.fRelay = True |
| 154 | return c |
| 155 | |
| 156 | def msg_ser(self, f): |
| 157 | f.write(struct.pack(b"<i", self.nVersion)) |
| 158 | f.write(struct.pack(b"<Q", self.nServices)) |
| 159 | f.write(struct.pack(b"<q", self.nTime)) |
| 160 | self.addrTo.stream_serialize(f, True) |
| 161 | self.addrFrom.stream_serialize(f, True) |
| 162 | f.write(struct.pack(b"<Q", self.nNonce)) |
| 163 | VarStringSerializer.stream_serialize(self.strSubVer, f) |
| 164 | f.write(struct.pack(b"<i", self.nStartingHeight)) |
| 165 | f.write(struct.pack(b"<B", self.fRelay)) |
| 166 | |
| 167 | def __repr__(self): |
| 168 | return "msg_version(nVersion=%i nServices=%i nTime=%s addrTo=%s addrFrom=%s nNonce=0x%016X strSubVer=%s nStartingHeight=%i fRelay=%r)" % (self.nVersion, self.nServices, time.ctime(self.nTime), repr(self.addrTo), repr(self.addrFrom), self.nNonce, self.strSubVer, self.nStartingHeight, self.fRelay) |
| 169 | |