阅读(2048) (0)

Moralis 用户余额和交易

2022-05-11 09:20:07 更新

同步和观看地址

定义

您可以获取所有历史交易并实时收听新交易。 它需要以下信息:

  • ChainId​(必填):要同步的链
  • Address​(必填):您将为此事件收听的地址。
  • Sync_historical​(可选):同步历史数据选项。 默认值true

image

image (1)

历史事件限额

如果创建的同步作业会导致检索更多历史事件,则​Sync_historical​选项将被禁用并且不会保存历史数据。可以联系支持人员升级您的帐户以启用保存它,无论如何,但在这样做之前要仔细考虑是否真的有必要。可以实时处理事件而无需将数据保存到数据库中。

监控经过身份验证的用户

Moralis 服务器为在某些时候通过您的应用程序进行身份验证的用户实时同步所有交易和余额。 您无需执行任何操作即可启用此功能,因为它在所有 Moralis 服务器中默认启用。

与往常一样,我们希望您专注于用户体验,并将同步区块链数据这一平凡而复杂的任务留给我们。

Moralis Server 将实时将数据插入和更新到您的数据库中,以便您通过简单的数据库查询即可获取用户的所有最新交易和余额。

监控非认证地址

默认情况下,​EthTransactions ​集合中只会出现注册用户的交易数据。 要观看特定地址(例如集中式交易所热钱包),请添加新的同步和观看地址插件,输入地址,然后单击“添加插件”按钮。

这将启动一个同步作业并向 ​WatchedXxxAddress ​集合添加一个条目,其中“​Xxx​”是此处定义的链名称之一。 一旦交易被同步,它们就可以像任何其他交易一样被查询,包括实时查询。

const web3 = new Moralis.Web3();
const binanceWallet = "0x...";

// create query
const query = new Moralis.Query("EthTransactions");
query.equalTo("to_address", binanceWallet);

// subscribe for real-time updates
const subscription = await query.subscribe();
subscription.on("create", function (data) {
  const amountEth = web3.utils.fromWei(data.attributes.value);
  console.log(`${amountEth} deposited to Binance`);
});

注意:在新的 Nitro 服务器上,订阅将更新而不是创建

注意:最新版本服务器的表名将是 ​_AddressSyncStatus ​而不是 ​WatchedXxxAddress

请记住,如果启用了 ​Sync_historical ​选项,则查看具有大量交易量的地址将导致存储大量数据。

历史交易限额

如果监视的地址会导致检索更多历史事务,则 ​Sync_historical ​选项将被禁用并且不会保存任何历史数据。 可以联系支持以升级您的帐户以启用保存它,但在这样做之前请仔细考虑是否真的有必要。 无需将数据保存到数据库即可实时处理新事务。 您也可以调用 ​Deep Index API​ 选择性地查询历史数据。

从代码中查看地址

Sync and Watch Address​ 插件在底层调用了一个名为 ​watchXxxAddress ​的云函数,其中“​Xxx​”是这里的链名。 这些云函数也可以直接从自己的代码中调用!

const results = await Moralis.Cloud.run("watchBscAddress", {
  address: "0x...",
});

默认情况下,只有使用此云功能被监视的地址所做的新交易才会被添加到数据库中。 如果您还想为要查看的地址添加历史数据,可以添加 ​sync_historical:true​:

const results = await Moralis.Cloud.run("watchBscAddress", {
  address: "0x...",
  sync_historical: true,
});

监视地址函数在开始作业时不返回任何值。 它们仍然是异步的! 一旦 ​promise返回同步的事务,它们应该在相应链的 ​XxxTransactions ​表中。

取消监视代码中的地址

当删除某个地址上的同步和监视地址插件时,该插件会在后台调用一个名为 ​unwatchXxxAddress ​的云函数,其中“​Xxx​”是这里的链名。 和代码看地址一样,这个云函数也可以直接从自己的代码中调用!

const results = await Moralis.Cloud.run("unwatchBscAddress", {
  address: "0x...",
});

未经确认的交易

测试网和主网上的交易可能需要一段时间才能得到确认。 当 Moralis 检测到处于未确认状态的新交易(或事件)时,这些交易将被放入交易表中,例如 ​EthTransactions​,并带有确认:​false​。 当交易被确认时,状态更新为已确认:​true​。

需要注意的是,不同的区块链会有不同的确认号来保证交易的有效性。 这意味着,为了让交易将其在 ​DB ​中的确认值更改为 ​true​,它需要一定数量的确认:

  • Ethereum​: 12
  • Polygon​: 100
  • BSC​: 18
  • Avalanche​: 100
  • Fantom​: 100

触发器的后果

这意味着,如果您在具有已确认属性(如 ​EthTransactions​)或任何“同步和观察合同事件”集合的集合上定义 ​afterSave ​触发器,则触发器可以被触发两次——一次为确认:false,再次为确认:true!

禁用用户历史同步

默认情况下,Moralis 将自动同步您用户过去的所有交易。 这是非常耗费资源的,CPU 和 RAM 可能是这里的瓶颈。 想象一下,你有 5000 个用户,他们都有 100 次交易的历史——突然你的服务器需要处理 500,000 个历史事件,这将很快消耗 CPU 和 RAM 资源,特别是如果你有很多新用户同时加入。

如果您知道不需要所有用户的所有历史记录,则应在服务器设置中禁用历史同步。 见下图。

screenaaa

通过 API 获取历史数据

请记住,禁用历史同步仅意味着您的数据库不会被历史事件填充。

您仍然可以使用 Web3 API 函数获取所有历史数据。 Web3 API 完全独立于数据库的内容。

因此,请查看 Web3 API 的功能,如果 Web3 API 中的历史端点足以满足您的用例,那么您应该禁用服务器中的历史同步,因为您不会使用它。

什么时候不应该禁用历史同步?

如果您需要运行 Web3 API 不提供的某些特定查询,您需要启用历史同步,以便您可以使用 Moralis 提供的数据库查询对历史数据运行自定义查询。

智能合约历史事件仍然有效

请记住,此设置只会禁用自动获取用户历史记录。 如果您添加了智能合约事件 - 它们仍会获取历史记录并将该信息放入您的数据库,因为它们独立于此设置工作。

优化示例

在本节中,我们将给出具体的优化示例,可以为您节省大量 CPU 和 RAM 使用率。

仅与您的合同相关的历史和活动

假设你有一个 ​NFT ​合约,你只关心与该合约相关的用户历史和用户实时交易。

在这种情况下,您应该按照上面的说明禁用历史同步,而只需为您的 ​NFT ​代币合约添加智能合约事件同步。 这样,您将只保留历史记录并查看智能合约的实时交易,而不是其他任何东西。

集合模式

Moralis Server 将获得来自或向任何经过身份验证的用户地址(包括链接地址)或监视地址进行的所有价值转移、代币转移 (ERC20) 和 ​NFT转移(​ERC721​、​ERC1155​)。 在创建用户(或查看地址)后,Moralis 服务器将为 Moralis 服务器同步的每个区块链填充以下集合。 这些名称将以它们来自的链作为前缀。

  • xxxTransactions
  • xxxTokenTransfers
  • xxxTokenBalances
  • xxxNFTTransfers
  • xxxNFTOwners

这些集合可以在“​Moralis Dashboard​”中查看。

链前缀

 Chain  Prefix
 Ethereum Mainnet, Ropsten, Georli, Kovan, Local Devchain  ​Eth
 Binance Smart Chain Mainnet, Testnet  ​Bsc
 Polygon (Matic) Mainnet, Mumbai Testnet  ​Matic
 Elrond  ​Erd

交易

在该链上与用户或受监视地址之间的所有交易不包括智能合约内的内部转账,例如代币转账。

{
    "objectId": String,
    "block_hash": String,
    "gas_price": Number,
    "block_timestamp": Date,
    "receipt_cumulative_gas_used": Number,
    "ACL": ACL,
    "receipt_gas_used": Number,
    "input": String,
    "receipt_contract_address": String,
    "hash": String,
    "updatedAt": Date,
    "nonce": Number,
    "to_address": String,
    "transaction_index": Number,
    "value": String,
    "gas": Number,
    "receipt_status": Number,
    "createdAt": Date,
    "block_number": Number,
    "from_address": String,
    "confirmed": Boolean,
}

代币转移

用户地址和监视地址的所有 ERC20 代币转移事件都将在此处找到。

{
    "objectId": String,
    "block_hash": String,
    "block_timestamp": Date,
    "ACL": ACL,
    "updatedAt": Date,
    "token_address": String,
    "transaction_hash": String,
    "to_address": String,
    "transaction_index": Number,
    "value": String,
    "log_index": Number,
    "createdAt": Date,
    "block_number": Number,
    "from_address": String,
    "confirmed": Boolean,
}

代币余额

用户和观察地址代币余额的摘要。 这将在进行新交易时实时更新。

{
  "objectId": String,
  "decimals": String,
  "contract_type": String,
  "ACL": ACL,
  "name": String,
  "updatedAt": Date,
  "token_address": String,
  "address": String,
  "symbol": String,
  "createdAt": Date,
  "block_number": Number,
  "balance": String,
}

NFT转账

转移用户和观察地址的 ​NFT​(​ERC721 ​和 ​ERC1155 ​代币)事件。

{
  "objectId": String,
  "block_hash": String,
  "token_id": String,
  "block_timestamp": Date,
  "contract_type": String,
  "ACL": ACL,
  "updatedAt": Date,
  "token_address": String,
  "transaction_hash": String,
  "to_address": String,
  "transaction_index": Number,
  "log_index": Number,
  "amount": String,
  "createdAt": Date,
  "block_number": Number,
  "transaction_type": String,
  "from_address": String,
  "confirmed": Boolean,
}

NFTO所有者

用户和观察地址的 ​NFT ​余额(​ERC721 ​和 ​ERC1155 ​代币)摘要。

{
  "objectId": String,
  "token_id": String,
  "owner_of": String,
  "token_uri": String,
  "contract_type": String,
  "ACL": ACL,
  "name": String,
  "updatedAt": Date,
  "token_address": String,
  "amount": Sring,
  "symbol": String,
  "createdAt": Date,
  "block_number": Number,
}