Skip to main content
ArcBlock Community

问题反馈:Dapp的服务端和客户端开发需求

shenxiuqiang
Support
chain-and-bridgediscussionqa

您好,

在开发我们的Dapp时,遇到了一些需要改进的查询功能,希望能够得到社区的支持与帮助。

我们的Dapp分为服务端和客户端。服务端在部署和运行时需要获取NFT,这些NFT中包含了Dapp运行时所需的信息,例如服务地址、质押的token数量以及解除质押的周期。

具体需求如下:

  1. 服务启动与停止:
  • 在服务启动时,需要质押一个NFT和一定数量的token。
  • 在服务停止前,需要先解除质押并取回NFT和token,才能停止服务。
  • 如果在未解除质押的情况下停止服务,质押的token将会被罚没,并分配给质押周期内的用户。
  1. 客户端功能:
  • 客户端需要查询这些NFT以获取所有的服务节点,并选择一个服务节点进行使用。
  • 为此,需要查询出所有质押状态的NFT。

目前,我们通过listAssets(factoryAddress: "")可以查询出所有NFT,但还需要遍历每个NFT的质押状态,这不仅影响性能,而且涉及到分页处理更加复杂。因此,希望能够增加更多的查询方法,可以直接查询出质押状态的NFT。

请问ArcBlock client是否支持更多的自定义查询功能,以便更高效地满足我们的需求?

非常感谢!

5 replies

shenxiuqiang2 years ago

想到解决方案是质押到一个地址,从这个地址查询NFT

shenxiuqiang2 years ago

https://beta.abtnetwork.io/explorer/txs/0733A9B311794A8224069EA614CEBD5E3B5A8532C3BAFCF641BAB8C8E97B91A8

image.png

不知如何质押到一个地址

javascriptCopy
import GraphQLClient from '@ocap/client';
import { fromSecretKey } from "@ocap/wallet";
import { toStakeAddress } from '@arcblock/did-util';

const privateKey = '0x4d484c7abbcd9e8962302f0ce1190c877a6360c0c22686d2a70e069a6ed5a10b';
const wallet = fromSecretKey(privateKey, 'eth');
console.log(wallet.address);//0xEdE20DD2c45922805D6A7a2F6dDB56786e577192

const alice = {
    secretKey : "0x2873aee5c2a9fc77f69828386f1222a2b5488e6efb8de5633a84e02643a47a3988e667960eea7cf31ad31a726e1d04e1aa36614eb3833b164f9234ee9e6a9cbb",
    publicKey : "0x88e667960eea7cf31ad31a726e1d04e1aa36614eb3833b164f9234ee9e6a9cbb"
}
const aliceWallet = fromSecretKey(alice.secretKey);
console.log(aliceWallet.address);
const stakeAddress = toStakeAddress( aliceWallet.address, aliceWallet.address);
console.log(stakeAddress);//zrjsMgpLFUBNHpnigEzLQxQck1ZSUmNQWxSc

const client = new GraphQLClient("https://beta.abtnetwork.io/api/");
await client.getContext();
const token = {
    address: 'z35n6UoHSi9MED4uaQy6ozFgKPaZj2UKrurBG',
    value: '1'
};
const assetAddress = 'zjdk8V4xD7H3EF9MZdPxusUHCQhvggwYjSL2';

const stakeAssetAddress = await client.stake({
    assets: [assetAddress],
    tokens: [token],
    to: stakeAddress,
    locked: false,
    message:'stake-test',
    wallet
});
console.log(stakeAssetAddress);
shenxiuqiang2 years ago

知道错误原因了:应该是 to: aliceWallet.address

const stakeAssetAddress = await client.stake({ assets: [assetAddress], tokens: [token], to: aliceWallet.address, locked: false, message:'stake-test', wallet });

shenxiuqiang2 years ago

当asset解除质押后,listStates还是会查询出这条记录,无法把revokedAssets过滤掉:

javascriptCopy
[
  {
    address: 'zrjpAYz6ghb7RwofMmNH2YdbXh1SpRZTaWa8',
    assets: [],
    genesisTime: '2024-07-06T13:49:39.152Z',
    message: 'stake-test',
    nonce: '',
    receiver: 'z1X4FdLzQXJpeg1eDsFFBvGzXR61UBr6LHP',
    renaissanceTime: '2024-07-06T14:10:32.147Z',
    revocable: true,
    revokedAssets: [ 'zjdtpyFA6ezQVCE3kyUnKLASw7o4shy5eknH' ],
    revokeWaitingPeriod: 0,
    sender: '0xEdE20DD2c45922805D6A7a2F6dDB56786e577192',
    slashers: [
      'z1X4FdLzQXJpeg1eDsFFBvGzXR61UBr6LHP',
      'z1aKBcP2UhpLh1gRv8msPiLsjYiYZN4FnSj'
    ],
    data: null,
    revokedTokens: [ [Object] ],
    tokens: [ [Object] ]
  }
]
shenxiuqiang2 years ago(edited)

现在仍然不知如何查询出,处于质押状态的某类NFT,通过这个方法实现去中心化的服务注册中心。

Reply