Как может быть цепной код, выполняемый параллельно?

Я изучаю Hyperledger Fabric около 1 года.

Но я до сих пор не могу сказать, как работает цепной код и как с ним обстоят дела, особенно с точки зрения его реализации и процесса.

Вот как я понимаю цепной код ниже.

Цепной код работает и изолирован от одноранговых узлов, как один из контейнеров Docker для его целостности в сети. Цепной код - это программа, которая определяет, как функции в транзакциях (например, AddTwoIntegerValues ​​()) должны обновлять бухгалтерскую книгу.

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

В таком случае я хотел бы спросить вас, как эти поддерживающие одноранговые узлы могут выполнять или получать доступ к контейнеру цепного кода параллельно? Я слышал, что "выполнение цепного кода" означает моделирование логического вычисления цепного кода. Но я не могу этого получить.

Другими словами, у меня вопрос: как они могут выполнить или получить к нему доступ одновременно? У них есть копии этого цепного кода? Как коллеги знают логику цепного кода? Не могли бы вы исправить меня или объяснить процесс кодирования, если я ошибаюсь?

Пожалуйста, скажите мне, если у вас есть идеи по поводу моего вопроса. Я с нетерпением жду вашего ответа!

1 ответ

Каждый узел имеет свой собственный контейнерный код для каждой версии данного кода. Когда цепной код установлен на одноранговом узле, пакет кода кода цепного кода записывается в файловую систему.

Позже, когда одноранговый узел получает запрос на вызов функции в коде цепочки (Init() или Invoke(), когда Init () запускается при создании экземпляра), узел проверяет, запущен ли уже цепной код, и если нет, Это:

  • Раскручивает контейнер для компиляции пакета кода с цепочечным кодом для создания двоичного кода с цепным кодом и затем уничтожает его
  • Вращает контейнер, который на самом деле запускает бинарный код с цепным кодом.

Код цепочки бинарный:

  • Соединяется с узлом через gRPC и регистрирует себя как имя, с которым он установлен.
  • Запускает бесконечный цикл, в котором он ожидает команды для имитации транзакций от партнера.

Всякий раз, когда партнер получает предложение от клиента, он:

  • Находит поток gRPC контейнера с цепочкой кодов и перенаправляет предложение от клиента в код цепочки.
  • Подготавливает карту чтения и записи ключа, что прокладка цепного кода будет запрашивать одноранговый узел во время его выполнения, который называется набором чтения-записи.

Затем прокладка цепного кода, работающая внутри контейнера, извлекает аргументы из предложения и запускает логику цепного кода (часть его двоичного кода).

Если логика цепочки кодов содержит операции доступа к данным, такие как GetState или PutState, она отправляет запрос одноранговому узлу вниз по тому же потоку gRPC, к которому он подключен, а затем одноранговый узел выполняет следующие действия:

  • Если операция с данными является операцией чтения, она добавляет к набору чтения-записи ключ и версию, считанную с ключа, и отправляет обратно ключ и значение в контейнер-прокладку цепного кода через поток gRPC.
  • Если операция с данными является операцией записи, она добавляет к набору для чтения-записи ключ, значение и версию, а затем отправляет обратно "OK" в цепочку кода (*).

(*) Лично я считаю, что этот шаг не нужен... он просто продлевает время выполнения

После того, как цепочка кодов завершает вычисление транзакции, она отправляет результат (то есть "OK") партнеру вместе с маркером, который обозначает, что транзакция завершила выполнение.

Поскольку записанные значения на самом деле не записываются в БД, а просто добавляются в карту в памяти, это называется "симуляцией транзакций". Затем одноранговый узел переходит к подписанию результатов моделирования транзакции (карты набора для чтения-записи и результата из прокладки цепного кода) и затем возвращает подписанное моделирование транзакции (также называемое "одобрение") обратно клиенту в качестве ответа.

In that case, I'd like to ask you how those endorsing peers can execute or access the chaincode container in parallel?

Вы можете сделать это параллельно, потому что, когда цепочка кода запускает транзакцию, она делает это в отдельной программе.

Другие вопросы по тегам