Как вставить документы в couchdb навалом по цепочке - PullRequest
0 голосов
/ 21 февраля 2019

Как вставить / записать документы в couchdb навалом по цепочке кодов?Кажется, что у библиотеки шимов цепочек кодов (https://godoc.org/github.com/hyperledger/fabric/core/chaincode/shim) такого API нет.

Для чтения документов, похоже, есть API с именем "GetQueryResult" (https://godoc.org/github.com/hyperledger/fabric/core/chaincode/shim#ChaincodeStub.GetQueryResult). Встроковый параметр "query", мы можем построить массовый запрос на получение.

Но для вставки / записи документов, есть ли какой-либо массовый API для кодирования цепочки? Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Когда выполняется цепной код, каждый PutState () добавляет ключ / значение к предлагаемому набору записи транзакции.Вы можете вызывать PutState () несколько раз в коде цепочки, и окончательный набор ключей / значений появится в предложенном наборе записи транзакции.Обратите внимание, что в CouchDB ничего не записывается во время выполнения цепного кода.

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

Если в блоке много обновлений ключ / значение, Fabricфактически сгруппирует их в пакеты по 1000 (настраивается с помощью свойства max.batUpdateSize core.yaml) при фиксации в CouchDB, чтобы избежать любых проблем с чрезмерно большими полезными нагрузками.Наконец, чтобы убедиться, что все записи отображаются в Fabric как атомарный коммит, Fabric записывает конечную точку сохранения для каждого блока в базу данных состояний CouchDB и записывает данные CouchDB на диск.Это гарантирует, что любые выполнения цепочечного кода получают согласованное представление данных о состоянии, и гарантирует, что Fabric может восстановиться после любого однорангового сбоя с полной целостностью данных.

0 голосов
/ 21 февраля 2019

Не уверен, если это отвечает на ваш вопрос, но по документу, допустим, вы имеете в виду файл PDF.Это имеет две функции: прочитать пару ключ-значение и написать одну.Здесь ничего особенного.

'use strict';
const { Contract } = require('fabric-contract-api');

Class SomeName extends Contract {

    async initLedger(ctx) { }

    async writeDocument(ctx, documentId, documentAsString) {
        await ctx.stub.putState(documentId, Buffer.from(documentAsString));
    };

    async getDocument(ctx, documentId) {
        const docAsBytes = await ctx.stub.getState(documentId);
        return carAsBytes.toString();
    };
}

Теперь идет код на стороне сервера

const { FileSystemWallet, Gateway } = require('fabric-network');

async main() {
    const walletPath = path.join(process.cwd(), 'wallet');
    const wallet = new FileSystemWallet(walletPath); // can be wherever your path is

    const gateway = new Gateway();
    await gateway.connect(ccp, { wallet, identity: 'user1', discovery: { enabled: false }  });
    const network = await gateway.getNetwork('mychannel');
    // Get the contract from the network.
    const contract = network.getContract('SomeName');

    // Now over here lets assume you get the PDF file from a POST request using Multer
    // We get the PDF file as a buffer, then convert to a string and send it
    let pdfFile = req.file;

    await contract.submitTransaction('writeDocument', req.file.buffer.toString('utf-8);
}

, и если вы хотите получить файл PDF

const getDocument = async (req, res, next) => {
    const walletPath = path.join(process.cwd(), 'wallet');
    const wallet = new FileSystemWallet(walletPath); // can be wherever your path is

    const gateway = new Gateway();
    await gateway.connect(ccp, { wallet, identity: 'user1', discovery: { enabled: false }  });
    const network = await gateway.getNetwork('mychannel');
    // Get the contract from the network.
    const contract = network.getContract('SomeName');
    const pdfAsString= await contract.evaluateTransaction('getDocument', req.body.documentId);
    // Now do whatever with this
};

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

0 голосов
/ 21 февраля 2019

Если вы имеете в виду, что хотите пакетировать несколько транзакций в одном пакете, делать это не рекомендуется, потому что если они обновляют одно и то же значение, то при просмотре истории окончательное изменение может отслеживаться только.Итак, лучше подавать отдельные транзакции.

...