Как синхронизировать все узлы в блокчейне - PullRequest
4 голосов
/ 29 марта 2020

То, что я пытаюсь сделать здесь, состоит из двух частей: 1. Создать структуру цепочки блоков и 2. Включить связь P2P между 3 узлами. Часть 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()

Однако для второй части я не уверен, как заставить все 3 узла синхронизировать их собственную цепочку блоков, когда происходит изменение в цепочке блоков ( т.е. добавление блока в цепочку блоков). Все 3 узла могут служить как клиентом, так и сервером, но никогда одновременно не могут быть одновременно. Например, на рисунке ниже узел 1 является клиентом, а узел 2 - сервером. Узел 3 не будет участвовать в транзакции, но он обновит свою собственную цепочку блоков после завершения транзакции между Узлом 1 и Узлом 2.

enter image description here

Будет полезен простой фрагмент кода о том, как синхронизировать блокчейн между 3 узлами, или даже ссылка, указывающая на синхронизацию блокчейнов, реализующую сокеты в Python.

1 Ответ

2 голосов
/ 06 апреля 2020

Ну bitcoin начинает с того, что спрашивает сверстника о запасах. Это ха sh и высота блока. Пир проверяет, есть ли у него этот блок, и проверяет, совпадает ли он с контрольными точками, которые он использует, если у него еще нет блока, соответствующего этому инвентарю, и значение ha sh совпадает с их контрольными точками, то они сохраняют инвентарь. Они продолжают спрашивать запасы, пока у них не будет инвентаря вплоть до кончика цепи. В этот момент они рекурсивно запрашивают каждый блок, соответствующий запасам, которые они сохранили. Как только они получают блок, они проверяют его и сохраняют - обновляя набор UTXO и txindex (если он включен) как go. Это называется IBD и выполняется, когда узел находится в автономном режиме. Когда узел подключен к сети и найден блок, узел, который обнаружил этот блок, «расскажет» о блоке со всеми узлами, которые он имеет. По сути, он отправляет ha sh и высоту (да, инвентарь блока) всем своим подключенным одноранговым узлам. Если одноранговый узел еще не имеет этого блока, он запрашивает данные блока и получает блок. Затем все одноранговые узлы делают то же самое, они отправляют инвентарь нового блока всем своим подключенным одноранговым узлам (кроме одноранговых узлов, от которых они получили блок).

Я не знаю ни одного простого кода для синхронизации в python (хотя поиск в Google должен иметь результаты (поиск игрушечной криптовалюты python), он не в python и работает для Вместо этого я использую блокчейны, основанные на DAG, но я нахожусь в процессе написания следующего кода синхронизации (он еще не закончен и ужасно запутан). Он написан на ржавчине и использует мою самодельную сборку ржавчины p2p lib поверх tcpstreams / sockets

TLDR; Новые узлы запрашивают список хэшей блоков со времени последнего блока, который они имеют, затем сохраняют его и запрашивают соответствующий блок у однорангового узла. Существующие узлы отправляют ха sh и высота соединяются с подключенными узлами, когда они слышат о новом блоке, когда узел получает это, они проверяют, есть ли у него блок - если их нет, то они запрашивают данные блока, проверяют блок, сохраняют его и вводят в действие Затем они отправляют одну и ту же пару ha sh и высоту всем своим подключенным узлам.

Надеюсь, это поможет ответить на ваш вопрос!

...