ArcBlock / forge-js

:fire: JavaScript libraries to work with forge framework
https://forge-js.netlify.com/
Other
26 stars 2 forks source link

我在为用户创建资产时遇到问题 #476

Closed A-new-b closed 3 years ago

A-new-b commented 4 years ago

我在使用forgejs graphql-client时遇到问题,源代码如下

const GraphqlClient = require('@arcblock/graphql-client');
const { fromRandom } = require('@arcblock/forge-wallet');

const endpoint = process.env.FORGE_API_HOST || 'http://127.0.0.1:8210'; // testnet

const client = new GraphqlClient(`${endpoint}/api`);

(async () => {
try {
    const owner = fromRandom();
    console.log({ owner: owner.toAddress() });

    // 1. declare owner
    let hash = await client.declare({ moniker: 'owner', wallet: owner });
    console.log('declare.owner.result', hash);
    console.log('view owner account', `${endpoint}/node/explorer/accounts/${owner.toAddress()}`);

    // 2. create asset for owner
    let assetAddress;
    [hash, assetAddress] = await client.createAsset({
        moniker: 'asset',
        readonly: false, // if we want to update the asset, we should set this to false
        transferrable: false,
        data: {
            typeUrl: 'json',
            value: {
                key: 'value',
                sn: Math.random(),
            },
        },
        wallet: owner,
    });
    console.log('view asset state', `${endpoint}/node/explorer/assets/${assetAddress}`);
    console.log('create asset tx', `${endpoint}/node/explorer/txs/${hash}`);
} catch (err) {
    console.error(err);
    console.log(JSON.stringify(err.errors));
}
})();

这几乎与官方的例子https://github.com/ArcBlock/forge-js/blob/master/forge/graphql-client/examples/asset.js一样 但却报错

{ owner: 'z1UmpHFEqc8KyJ9TcmTTPQ2qi6fpMqLNgaW' }
declare.owner.result C75B0C3073B87CAD2FECE8900846EE2F609431BA12CB5C9B554DC808FAE952AF
view owner account http://127.0.0.1:8210/node/explorer/accounts/z1UmpHFEqc8KyJ9TcmTTPQ2qi6fpMqLNgaW
{ Error: invalid_sender_state: The sender of this transaction does not exist on this chain.
    at NativeGraphqlClient.client._createResponseError (/home/arcblock/community_server/node_modules/@arcblock/client-extension/lib/index.js:152:21)
    at Promise (/home/arcblock/community_server/node_modules/@arcblock/client-extension/lib/index.js:357:36)
    at processTicksAndRejections (internal/process/task_queues.js:86:5)
  code: 'invalid_sender_state',
  type: 'create_asset_tx',
  errors:
   [ { locations: [Array],
       message: 'invalid_sender_state',
       path: [Array] } ] }
[{"locations":[{"column":0,"line":2}],"message":"invalid_sender_state","path":["sendTx"]}]

这是我本地配置

arcblock@iZ2zegctxhllwiiq2srflhZ ~/community_server> forge chain:ls
All Chains:
┌────────────────────┬───────────────┬───────────────┐
│ Name               │ Version       │ Status        │
├────────────────────┼───────────────┼───────────────┤
│ beijing            │ v1.1.1-p0     │ running       │
│ shanghai           │ v1.1.1-p0     │ running       │
└────────────────────┴───────────────┴───────────────┘
arcblock@iZ2zegctxhllwiiq2srflhZ ~/community_server> forge --version
1.3.0

这个配置的搭建方法几乎和https://docs.arcblock.io/zh/handbook/11-forge-cli-in-production/deploy-multi-party-network一样 所以我想知道这大概是什么问题

wangshijun commented 4 years ago

@A-new-b 报错的关键信息是:invalid_sender_state: The sender of this transaction does not exist on this chain.

这个报错的意思是,这个 tx 的发送者在 chain state 里面没找到,虽然你发送了 declare 的交易,但是这个交易未打包之前,owner 的账户是尚未存在 chain state 里面的。这意味着下面两层含义:

我们在 @arcblock/tx-util 里面提供了验证交易或者账户状态的辅助方法:

const { verifyTxAsync, verifyAccountAsync, verifyAssetAsync } = require('@arcblock/tx-util');

const owner = fromRandom();
console.log({ owner: owner.toAddress() });
let hash = await client.declare({ moniker: 'owner', wallet: owner });

// 可以这样验证
await verifyAccountAsync({ address: owner.toAddress(), chainId: 'xxx', chainHost: '' });

// 也可以这样验证
await verifyTxAsync({ hash, chainId: 'xxx', chainHost: '' });

类似的,你创建完 Asset 之后,可以考虑使用 verifyAssetAsync,传入 asset address 即可

A-new-b commented 4 years ago

owner

我想问下chainId的和chainHost这两个参数该怎么获取,我在官网的教程中似乎找不到详细的方法

wangshijun commented 3 years ago

@A-new-b https://playground.network.arcblockio.cn/dashboard 以这个 playground 链为例:

image