Hyperledger Fabric 2.0, не удается получить доступ к Fabtokens пользователей, использующих Node.js SDK

Я пытаюсь выдать несколько Fabtoken пользователям, а затем использовать их в различных сценариях, таких как передача, погашение и т. д. Я следую документации Node SDK здесь: https://fabric-sdk-node.github.io/master/tutorial-fabtoken.html

Вот как они выполняют операции Fabtoken:

// create a TokenClient instance from client
const tokenclient = client.newTokenClient(mychannel);

// create a transaction ID for "issuer"
const txId = client.newTransactionID();

// create two parameters for issue, one for user1 and one for user2
const param1 = {
    owner: user1.getIdentity().serialize(),
    type: 'USD',
    quantity: '500',
};
const param2 = {
    owner: user2.getIdentity().serialize(),
    type: 'EURO',
    quantity: '300',
};

// create the token request for issue
const issueRequest = {
    params: [param1, param2],
    txId: txId,
};

// issuer calls issue method to issue tokens to user1 and user2
const result = await tokenClient.issue(issueRequest);

А затем используйте другой tokenClient для перечисления токенов пользователя 1:

const user1Tokenclient = client1.newTokenClient(mychannel);

// user1 lists tokens
const mytokens = await user1TokenClient.list();

// iterate the tokens to get token id, type, and quantity for each token
for (const token of tokens) {
    // get token.id, token.type, and token.quantity
    // token.id will be used for transfer and redeem
}

Это упоминается на странице класса клиента Node SDK здесь: https://fabric-sdk-node.github.io/master/Client.html, что переключение пользовательских контекстов с одним и тем же экземпляром клиента является антишаблоном и не рекомендуется, поскольку экземпляры клиента сохраняют состояние.

Как они предлагают, я создаю экземпляры своих клиентов с разными пользовательскими контекстами. Вот как я создаю своих клиентов, устанавливаю их пользовательский контекст и создаю свои экземпляры tokenClient:

const adminClient = new Fabric_Client();
const admin = await adminClient.createUser(user_opts);
adminClient.setUserContext(admin, true);
let adminConfig = {
    admin: admin,
    adminClient: adminClient,
    adminTokenClient: adminClient.newTokenClient(channel)
}

const server = await serverClient.createUser(server_opts); 
serverClient.setUserContext(server, true);
let serverConfig = {
    server: server,
    serverClient: serverClient,
    serverTokenClient: serverClient.newTokenClient(channel)
}

Позже я использую эти объекты config для выдачи токенов разным пользователям. Как я выпускаю токены для моей учетной записи сервера из моей учетной записи эмитента (администратора):

const txId = adminConfig.adminClient.newTransactionID();
let issueQuery = {
    tokenClient: adminConfig.adminTokenClient,
    txId: txId,
    channel: channel,
    params: []
}

for(let i=0; i < 3; ++i) {
    let param = {
        owner: serverConfig.server.getIdentity().serialize(),
        type: 'test',
        quantity: '1'
    }
    issueQuery.params.push(param);
}
let issueTx = await waitForIssue(issueQuery);

Это успешно выдает три токена на сервер, как и ожидалось. Проблема в том, что когда я пытаюсь получить доступ к токенам моего сервера, как в примере, который они предоставляют, используя аналогичный код:

let server_tokens = await serverConfig.serverTokenClient.list();
for (let server_token of server_tokens) {
    console.log(server_token.id);
}

Результат просто пустой, и я не получаю никаких сообщений об ошибках. Однако, когда я проверяю транзакцию с помощью queryTransaction(txId) для транзакции выпуска токена, которую я генерирую, я вижу, что владельцем выпущенных токенов в этой транзакции является сервер, и поэтому я могу быть уверен, что смогу успешно выдать токены серверу. Есть ли другой способ проверить токены моего сервера? Или мне не следует использовать разные клиентские и пользовательские контексты для каждого пользователя, как они предлагают? Потому что раньше я мог видеть токены сервера, когда использовал один клиент и один пользовательский контекст для выдачи и перечисления токенов. Но этот подход вызвал у меня проблемы, когда я пытался асинхронно передать свои токены.


person flopoe    schedule 23.09.2019    source источник


Ответы (1)


Насколько я знаю, FabTokens удалены из основной ветки Fabric 2.0, как описано в этих ссылках:

https://gerrit.hyperledger.org/r/c/fabric/+/32979

https://lists.hyperledger.org/g/fabric/topic/fabtoken/34150195?p=,,,20,0,0,0::recentpostdate%2Fsticky,,,20,2,0,34150195

Я ожидаю, что учебник и информация в документах Fabric будут удалены со временем.

person R Thatcher    schedule 23.09.2019
comment
Я видел это, но недавно скачал Fabric 2.0, поэтому у меня есть TokenClient в моем текущем Node SDK. Он работает нормально, но есть проблемы, с которыми я застрял, и они не работают, как описано в их примерах Fabtoken. - person flopoe; 23.09.2019