BTC交易数据 - VarInt

BTC交易数据 - VarInt

全名是 Variable-length Integer,是一种基于动态产犊表示整数的编码方式,常用于比特币协议中。

编码规则

  1. 如果需要表示的数值小于 253(16进制:0xfd),就用一个字节表示整数值。该字节的数值就是需要表示的值

BTC交易数据 - VarInt_第1张图片

  1. 如果需要表示的数值大于等于 253(16进制:0xfd)且 小于等于 65535(16进制:0xffff),使用三个字节表示整数值。编码时用第一个字节固定为 0xfd,后面两个字节使用小端模式表示值。

BTC交易数据 - VarInt_第2张图片

  1. 如果需要表示的数值大于 65535(16进制:0xfe)且 小于等于 0xffffffff(4,294,967,295),则使用五个字节表示,第一个字节为0xfe,后面四个字节为整数值的小端表示使用三个字节表示整数值。编码时第一个字节固定为 0xfe,后面四个字节使用小端模式表示值。

BTC交易数据 - VarInt_第3张图片

  1. 如果整数值大于 0xffffffff(4,294,967,295),则使用九个字节表示,第一个字节为0xff,后面八个字节为整数值的小端表示。

编解码脚本

源码地址

def encode_varint(value):
    if value < 0xfd:
        return bytes([value])
    elif value <= 0xffff:
        return b'\xfd' + value.to_bytes(2, 'little')
    elif value <= 0xffffffff:
        return b'\xfe' + value.to_bytes(4, 'little')
    else:
        return b'\xff' + value.to_bytes(8, 'little')


def decode_varint(data):
    first_byte = data[0]
    if first_byte < 0xfd:
        return first_byte, 1
    elif first_byte == 0xfd:
        return int.from_bytes(data[1:3], 'little'), 3
    elif first_byte == 0xfe:
        return int.from_bytes(data[1:5], 'little'), 5
    elif first_byte == 0xff:
        return int.from_bytes(data[1:9], 'little'), 9


# 示例
# 这里输入整数值
value = 100000
encoded_varint = encode_varint(value)
decoded_varint, length = decode_varint(encoded_varint)

print("Original Value:", value)
print("Encoded VarInt:", "0x" + encoded_varint.hex())
print("Decoded VarInt:", decoded_varint)
print("Length:", length)
ecoded VarInt:", decoded_varint)
print("Length:", length)

关注我,关注我的专栏,一起探索Web3的世界

你可能感兴趣的:(一步步了解Web3,深入了解BTC,区块链,web3)