Hyperledger Fabric 2.0,Can';t使用Node.js SDK访问用户的令牌

Hyperledger Fabric 2.0,Can';t使用Node.js SDK访问用户的令牌,node.js,hyperledger-fabric,hyperledger,hyperledger-fabric-sdk-js,Node.js,Hyperledger Fabric,Hyperledger,Hyperledger Fabric Sdk Js,我正在尝试向用户发行一些FabToken,然后在各种场景中使用它们,如转账、兑换等。我在这里遵循Node SDK文档: 这是他们执行Fabtoken操作的方式: // create a TokenClient instance from client const tokenclient = client.newTokenClient(mychannel); // create a transaction ID for "issuer" const txId = client.newTransa

我正在尝试向用户发行一些FabToken,然后在各种场景中使用它们,如转账、兑换等。我在这里遵循Node SDK文档:

这是他们执行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);
然后使用不同的令牌客户端列出用户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
}
节点SDK的客户机类页面中提到:使用相同的客户机实例切换用户上下文是一种反模式,不推荐使用,因为客户机实例是有状态的

正如他们所建议的,我使用不同的用户上下文创建我的客户机实例。这就是我创建客户机、设置其用户上下文和创建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
对象向不同的用户发出一些令牌。如何从我的颁发者(管理员)帐户向我的服务器帐户颁发令牌:


结果是空的,我没有收到任何错误消息。但是,当我使用
queryTransaction(txId)
为生成的令牌发行事务检查事务时,我可以看到该事务中已发行令牌的所有者是服务器,因此我可以确保我可以成功地将令牌发行到服务器。有没有其他方法可以检查我的服务器的令牌?或者我不应该按照每个用户的建议使用不同的客户端和用户上下文吗?因为之前,当我使用单客户机和单用户上下文发布和列出令牌时,我能够看到服务器的令牌。但当我尝试异步传输令牌时,这种方法给我带来了问题。

据我所知,FabToken现在已从Fabric 2.0的主分支中删除,如以下链接所述:


我希望教程和Fabric文档中的信息会在适当的时候被删除。

我看到了这一点,但我不久前下载了Fabric 2.0,因此我在当前的节点SDK中有TokenClient。它可以很好地工作,但是我遇到了一些问题,这些问题并不像Fabtoken示例中所解释的那样有效。
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);
}