ユーザーにいくつかの 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同じクライアント インスタンスで userContexts を切り替えることはアンチパターンであり、クライアント インスタンスがステートフル。
彼らが示唆するように、私はさまざまなユーザー コンテキストでクライアント インスタンスを作成します。これは、クライアントを作成し、ユーザー コンテキストを設定し、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);
これにより、期待どおりに 3 つのトークンがサーバーに正常に発行されます。問題は、サーバーのトークンにアクセスしようとすると、同様のコードを使用して提供される例のようになることです。
let server_tokens = await serverConfig.serverTokenClient.list();
for (let server_token of server_tokens) {
console.log(server_token.id);
}
結果は空で、エラー メッセージは表示されません。ただし、queryTransaction(txId)
生成したトークン発行トランザクションを使用してトランザクションを確認すると、そのトランザクションで発行されたトークンの所有者がサーバーであることがわかり、サーバーにトークンを正常に発行できることを確認できます。サーバーのトークンを確認する他の方法はありますか? または、提案されているように、ユーザーごとに異なるクライアントとユーザー コンテキストを使用するべきではありませんか? 以前は、単一のクライアントと単一のユーザー コンテキストを使用してトークンを発行および一覧表示したときに、サーバーのトークンを確認できました。しかし、このアプローチでは、トークンを非同期で転送しようとしたときに問題が発生しました。