Moralis 計費和費率限制

2022-05-13 11:21 更新

防止濫用

如果您開始收到 Cloudflare 錯誤,例如 Cloudflare 錯誤 1020 - 很可能您被我們的濫用預(yù)防系統(tǒng)標記,并且 Cloudflare 代表我們阻止了您的訪問。

您可能還會看到其他錯誤消息。

以下是您被暫時禁止的幾種情況。

  1. 如果您正在發(fā)送請求,盡管您的密鑰已經(jīng)受到速率限制,我們可能會暫時禁止您。 例如,假設(shè)您的計劃允許您每秒執(zhí)行 30 個請求。 如果您嘗試在同一秒內(nèi)發(fā)出 200 個請求 - 您很可能會被暫時禁止。
  2. 每個項目使用一個密鑰。 例如,如果您創(chuàng)建 100 個免費帳戶并使用這些帳戶的密鑰發(fā)送請求 - 與同一項目相關(guān)的所有帳戶都將被禁止。
  3. 如果您認為自己被錯誤地暫時禁止,請發(fā)送電子郵件至 hello@moralis.io,我們會盡快為您提供幫助。

如何避免被封號?

  1. 不要使用超過 1 個 Moralis 帳戶。
  2. 在您的應(yīng)用程序中實施速率限制邏輯,這樣您就不會嘗試執(zhí)行超出計劃允許的請求。
  3. 如果您有任何問題,請發(fā)送電子郵件至 hello@moralis.io。

請求權(quán)重

所有 Moralis 計劃對您每月可以提出的請求數(shù)量都有很大的限制。 您有多少包含的請求取決于您擁有的計劃,請查看定價頁面了解更多詳細信息。

在大多數(shù)情況下,對 Speedy Nodes 或 Web3 API 的一次請求計為對您的每月配額或允許的速率限制的一次請求。

但是,一些 Speedy Node 方法和 API 請求的計算量非常大,因此算作多個請求。

通過給予一些繁重的要求更高的權(quán)重,我們確保您只為使用的東西付費,而不是多花一分錢 - 期間! 通過這種方式,您可以獲得大多數(shù)用例的廉價請求,同時我們可以通過權(quán)衡計算成本高昂的端點來保護我們的系統(tǒng)免受濫用。

有關(guān)加權(quán)的 Speedy Node 方法和 API 端點的詳細信息,請參閱下表。

快速節(jié)點請求

Moralis Speedy 節(jié)點的請求限制為每批 50 個請求。

Method

Cost

eth_maxPriorityFeePerGas

1 request

eth_getTransactionReceipt

2 requests

eth_getUncleByBlockHashAndIndex

2 requests

eth_getUncleByBlockNumberAndIndex

2 requests

eth_getTransactionByBlockHashAndIndex

2 requests

eth_getTransactionByBlockNumberAndIndex

2 requests

eth_getUncleCountByBlockHash

2 requests

eth_getUncleCountByBlockNumber

2 requests

web3_clientVersion

2 requests

web3_sha3

2 requests

eth_getBlockByNumber

2 requests

eth_getStorageAt

2 requests

eth_getTransactionByHash

2 requests

trace_get

2 requests

eth_gasPrice

2 requests

eth_getBalance

2 requests

eth_getCode

2 requests

eth_getFilterChanges

2 requests

eth_newBlockFilter

2 requests

eth_newFilter

2 requests

eth_newPendingTransactionFilter

2 requests

eth_getBlockTransactionCountByHash

2 requests

eth_getBlockTransactionCountByNumber

2 requests

eth_getProof

2 requests

eth_getBlockByHash

2 requests

trace_block

3 requests

parity_getBlockReceipts

3 requests

eth_getTransactionCount

3 requests

eth_call

3 requests

trace_transaction

3 requests

eth_getFilterLogs

8 requests

eth_getLogs

8 requests

trace_call

8 requests

trace_callMany

8 requests

trace_rawTransaction

8 requests

trace_filter

8 requests

eth_estimateGas

9 requests

eth_sendRawTransaction

25 requests

debug_traceTransaction

31 requests

trace_replayTransaction

298 requests

trace_replayBlockTransactions

298 requests

API 請求

Path

Weight

/info/endpointWeights

0 request

/{address}

1 request

/{address}/balance

1 request

/erc20/metadata

1 request

/erc20/metadata/symbols

1 request

/erc20/{address}/allowance

1 request

/resolve/{domain}

1 request

/{pair_address}/reserves

1 request

/resolve/{address}/reverse

1 request

/web3/version

1 request

/{address}/events

2 requests

/{address}/erc20/transfers

2 requests

/erc20/{address}/transfers

2 requests

/block/{block_number_or_hash}/nft/transfers

2 requests

/nft/{address}/{token_id}

2 requests

/nft/{address}/{token_id}/transfers

2 requests

/{address}/logs

2 requests

/{address}/function

2 requests

/{address}

2 requests

/erc20/{address}/price

3 requests

/nft/{address}/trades

4 requests

/nft/{address}/lowestprice

4 requests

/{address}/erc20

5 requests

/block/{block_number_or_hash}

5 requests

/nft/search

5 requests

/{address}/nft

5 requests

/{address}/nft/transfers

5 requests

/{address}/nft/{token_address}

5 requests

/nft/{address}

5 requests

/nft/{address}/transfers

5 requests

/nft/{address}/owners

5 requests

/nft/{address}/metadata

5 requests

/nft/{address}/sync

5 requests

/nft/{address}/{token_id}/metadata/resync

5 requests

/nft/transfers

5 requests

/nft/{address}/{token_id}/owners

20 requests

注意:對于確切的速率限制值,可以使用端點 ?https://deep-index.moralis.io/api/v2/info/endpointWeights?。

注意:?/nft/{address}/{token_id}/metadata/resync? 的計費成本為 5,速率限制成本為 25,這意味著您可以使用免費套餐每秒調(diào)用一次,使用免費套餐每秒只能調(diào)用兩次 專業(yè)計劃

輸出示例:

[
  {
    "endpoint": "getBlock",
    "path": "/block/{block_number_or_hash}",
    "price": 1
  },
  {
    "endpoint": "getContractEvents",
    "path": "/{address}/events",
    "price": 2
  },
  {
    "endpoint": "getTransactions",
    "path": "/{address}",
    "price": 1
  },
 ...
  {
    "endpoint": "endpointWeights",
    "path": "/info/endpointWeights",
    "price": 0
  }
]

為什么我的費率有限?

您需要了解兩種不同類型的速率限制。

在 SDK 中使用 Moralis.Web3API 時的速率限制

錯誤 141 - 服務(wù)器和客戶端之間的速率限制

第一種速率限制是保護您的 Moralis 服務(wù)器免受來自客戶端的垃圾郵件請求。

如您所知 - 任何人都可以使用 Moralis SDK 并使用您的服務(wù)器調(diào)用 Web3 API。

您的服務(wù)器具有內(nèi)置的速率限制,您可以對其進行調(diào)整,以指示不同類型的用戶在受到速率限制之前可以執(zhí)行多少請求。 您可以完全控制這些速率限制,并且可以使用 Cloud Code 中的幾行代碼對其進行調(diào)整。

如果您的客戶超出您設(shè)置的允許速率限制,他們將看到以下錯誤:

錯誤 141:來自該特定客戶端的 Web3API 請求過多,客戶端需要等待才能發(fā)送更多請求。

這可以使用 ?Moralis.settings.setAPIRateLimit? 進行調(diào)整。

何時可能發(fā)生此錯誤:

想象一下使用您的網(wǎng)站的特定用戶試圖在同一分鐘內(nèi)發(fā)出大量請求。 您的服務(wù)器將保護自己并拒絕用戶。 只有特定用戶會受到影響。

解決此錯誤的方法是調(diào)整您的設(shè)置,如上所述。

錯誤 141 - Moralis 服務(wù)器和 Web3 API 之間的速率限制

當您的用戶從 SDK 調(diào)用 Web3 API 時,他們可能不受您的服務(wù)器的速率限制(上述情況),但由于您的計劃,他們可能會受到速率限制。

錯誤 141:此 Moralis 服務(wù)器由于計劃限制而受到速率限制。

何時可能發(fā)生此錯誤:

您有許多用戶并沒有單獨提出太多請求,但他們共同提出的請求超出了您的計劃允許的范圍。 例如 - 您的計劃允許每分鐘 1000 個請求。 您有 100 個用戶每分鐘執(zhí)行 15 個請求。

解決此錯誤的方法是升級您的 Moralis 計劃。

使用 HTTP 調(diào)用 Web3 API 時的速率限制

錯誤 429 - 非 Moralis 服務(wù)器和 Web3 API 之間的速率限制

當您從自己的非 Moralis 后端調(diào)用 Web3 API 時,您可能會受到 Web3 API 的限制。

在這種情況下,您將收到錯誤 429:超出速率限制。

Screenshot 2021-12-15 at 15

要查看的最重要的值是 ?x-rate-limit-limit? 和 ?x-rate-limit-throttle-limit?。

第一個告訴您每分鐘允許執(zhí)行多少個請求,第二個告訴您每秒可以執(zhí)行多少個請求。

一些繁重的請求算作多個請求。

為了不受到速率限制,請注意 ?x-rate-limit-used? 和 ?x-rate-throttle-used?。

解決此錯誤的方法是升級您的 Moralis 計劃。

如何使用cursor(nodejs)的示例

const Moralis = require("moralis/node");
const serverUrl = "https://server_domain:2053/server";
const appId = "app id";
const contractAddress = "contract address";
async function getAllOwners() {
  await Moralis.start({ serverUrl: serverUrl, appId: appId });
  let cursor = null;
  let owners = {};
  do {
    const response = await Moralis.Web3API.token.getNFTOwners({
      address: contractAddress,
      chain: "eth",
      limit: 500,
      cursor: cursor,
    });
    console.log(
      `Got page ${response.page} of ${Math.ceil(
        response.total / response.page_size
      )}, ${response.total} total`
    );
    for (const owner of response.result) {
      owners[owner.owner_of] = {
        amount: owner.amount,
        owner: owner.owner_of,
        tokenId: owner.token_id,
        tokenAddress: owner.token_address,
      };
    }
    cursor = response.cursor;
  } while (cursor != "" && cursor != null);

  console.log("owners:", owners, "total owners:", Object.keys(owners).length);
}

getAllOwners();

如何使用cursor的示例(python)

import requests
import time


def get_nft_owners(offset, cursor):
    print("offset", offset)
    url = 'https://deep-index.moralis.io/api/v2/nft/<address_here>/owners?chain=polygon&format=decimal'
    if cursor:
      url = url + "&cursor=%s" % cursor

    print("api_url", url)
    headers = {
        "Content-Type": "application/json",
        "X-API-Key": "API_KEY_HERE"
    }
    statusResponse = requests.request("GET", url, headers=headers)
    data = statusResponse.json()
    print("HTTP headers:", statusResponse.headers)
    try:
        print("nr results", len(data['result']))
    except:
        print(repr(data))
        print("exiting")
        raise SystemExit

    cursor = data['cursor']
    print(data['page'], data['total'])
    return cursor


cursor = None
for j in range(0, 10):
    cursor = get_nft_owners(j*500, cursor)
    print()
    time.sleep(1.1)


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號