gpt4 book ai didi

python - 如何同步区 block 链中的所有节点

转载 作者:行者123 更新时间:2023-12-03 11:52:47 25 4
gpt4 key购买 nike

我在这里尝试做的有两个部分 - 1. 创建区块链结构和 2. 启用 3 个节点之间的 P2P 通信。第 1 部分可以轻松完成,因为有多个关于如何编写区块链结构的在线资源。这是我为第 1 部分所做的:

# Creating "getdata" request payload
def create_payload_getdata(tx_id):
count = 1
type = 1
hash = bytearray.fromhex(tx_id)
payload = struct.pack("<bb32s", count, type, hash)
return payload

# Print req/res data
def print_response(command, req_data, res_data):
print("")
print("Command: "+command)
print("Request:")
print(binascii.hexlify(req_data))
print("Response")
print(binascii.hexlify(res_data))

if __name__ == '__main__':
# magic value for the main network
magic_value = 0xd9b4bef9
tx_id = "fc57704eff327aecfadb2cf3774edc919ba69aba624b836461ce2be9c00a0c20"
peer_ip_address = '104.199.184.15'
peer_tcp_port = 8333
buffer_size = 1024

# Create Request Objects
ver_payload = create_payload_ver(peer_ip_address)
ver_msg = create_message(magic_value, 'version', ver_payload)
ver_ack_msg = create_message_verack()
get_data_payload = create_payload_getdata(tx_id)
get_data_msg = create_message(magic_value, "getdata", get_data_payload)

# Establish TCP connection
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((peer_ip_address, peer_tcp_port))

# Send message "version"
s.send(ver_msg)
res_data = s.recv(buffer_size)
print_response("version", ver_msg, res_data);

# Send msg "verack"
s.send(ver_ack_msg)
res_data = s.recv(buffer_size)
print_response("verack", ver_ack_msg, res_data)

# Send msg "getdata"
s.send(get_data_msg)
res_data = s.recv(buffer_size)
print_response("getdata", get_data_msg, res_data)

s.close()

但是,对于第 2 部分,当区块链发生变化(即向区块链添加一个区块)时,我不确定如何让所有 3 个节点同步它们自己的区块链。所有 3 个节点都可以用作客户端和服务器,但不能同时用作客户端和服务器。例如,在下图中,节点 1 是客户端,节点 2 是服务器。节点 3 不会参与交易,但一旦节点 1 和节点 2 之间的交易完成,它将更新自己的区块链。

enter image description here

关于如何在 3 个节点之间同步区块链的简单代码片段,甚至是指向在 Python 中实现套接字的区块链同步的链接都会很有帮助。

最佳答案

好吧,比特币首先向对等方询问库存。这是一个哈希值和一个块的高度。对等方检查他们是否已经拥有这个块,并检查它是否与他们正在使用的检查点相同,如果他们还没有与这个 list 对应的块并且哈希值与他们的检查点相同,那么他们保存 list 。他们不断要求库存,直到他们拥有一直到链尖的库存。在这一点上,他们递归地询问与他们保存的库存相对应的每个块。一旦他们获得区块,他们就会对其进行验证并保存它——在他们进行时更新 UTXO 集和 txindex(如果已启用)。这称为 IBD,在节点离线时完成。当一个节点在线并且发现一个块时,发现该块的对等方将与它拥有的所有对等方“谣言”该块。基本上它将哈希和高度(是块的库存)发送到所有连接的对等方,如果对等方还没有那个块,那么它会请求块数据并获取块。然后所有的对等点都做同样的事情,他们将新块的 list 发送到所有连接的对等点(除了他们从中接收块的对等点)。

我不知道在 python 中有什么简单的同步代码(虽然谷歌搜索应该使用结果(搜索玩具加密货币 python),但它不在 python 中,而是适用于基于 DAG 的区块链,但我正在编写following 同步代码(它还没有完成,而且非常困惑。它是用 rust 编写的,并在 tcpstreams/sockets 之上使用我自制的 rust p2p lib 构建

TLDR;
新节点要求提供自他们拥有的最后一个区块以来的区块哈希列表,然后保存该列表并从对等方请求相应的区块。现有节点在听到新块时向连接的节点发送哈希和高度对,当节点收到此消息时,他们检查自己是否拥有该块 - 如果没有,则他们要求提供块数据,验证该块,保存它并制定它。然后他们向所有连接的节点发送相同的哈希和高度对。

我希望这有助于回答您的问题!

关于python - 如何同步区 block 链中的所有节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60911234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com