如果您開始收到 Cloudflare 錯誤,例如 Cloudflare 錯誤 1020 - 很可能您被我們的濫用預(yù)防系統(tǒng)標記,并且 Cloudflare 代表我們阻止了您的訪問。
您可能還會看到其他錯誤消息。
以下是您被暫時禁止的幾種情況。
所有 Moralis 計劃對您每月可以提出的請求數(shù)量都有很大的限制。 您有多少包含的請求取決于您擁有的計劃,請查看定價頁面了解更多詳細信息。
在大多數(shù)情況下,對 Speedy Nodes 或 Web3 API 的一次請求計為對您的每月配額或允許的速率限制的一次請求。
但是,一些 Speedy Node 方法和 API 請求的計算量非常大,因此算作多個請求。
通過給予一些繁重的要求更高的權(quán)重,我們確保您只為使用的東西付費,而不是多花一分錢 - 期間! 通過這種方式,您可以獲得大多數(shù)用例的廉價請求,同時我們可以通過權(quán)衡計算成本高昂的端點來保護我們的系統(tǒng)免受濫用。
有關(guān)加權(quán)的 Speedy Node 方法和 API 端點的詳細信息,請參閱下表。
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 |
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
}
]
您需要了解兩種不同類型的速率限制。
第一種速率限制是保護您的 Moralis 服務(wù)器免受來自客戶端的垃圾郵件請求。
如您所知 - 任何人都可以使用 Moralis SDK 并使用您的服務(wù)器調(diào)用 Web3 API。
您的服務(wù)器具有內(nèi)置的速率限制,您可以對其進行調(diào)整,以指示不同類型的用戶在受到速率限制之前可以執(zhí)行多少請求。 您可以完全控制這些速率限制,并且可以使用 Cloud Code 中的幾行代碼對其進行調(diào)整。
如果您的客戶超出您設(shè)置的允許速率限制,他們將看到以下錯誤:
這可以使用 ?Moralis.settings.setAPIRateLimit
? 進行調(diào)整。
何時可能發(fā)生此錯誤:
想象一下使用您的網(wǎng)站的特定用戶試圖在同一分鐘內(nèi)發(fā)出大量請求。 您的服務(wù)器將保護自己并拒絕用戶。 只有特定用戶會受到影響。
解決此錯誤的方法是調(diào)整您的設(shè)置,如上所述。
當您的用戶從 SDK 調(diào)用 Web3 API 時,他們可能不受您的服務(wù)器的速率限制(上述情況),但由于您的計劃,他們可能會受到速率限制。
何時可能發(fā)生此錯誤:
您有許多用戶并沒有單獨提出太多請求,但他們共同提出的請求超出了您的計劃允許的范圍。 例如 - 您的計劃允許每分鐘 1000 個請求。 您有 100 個用戶每分鐘執(zhí)行 15 個請求。
解決此錯誤的方法是升級您的 Moralis 計劃。
當您從自己的非 Moralis 后端調(diào)用 Web3 API 時,您可能會受到 Web3 API 的限制。
在這種情況下,您將收到錯誤 429:超出速率限制。
要查看的最重要的值是 ?x-rate-limit-limit
? 和 ?x-rate-limit-throttle-limit
?。
第一個告訴您每分鐘允許執(zhí)行多少個請求,第二個告訴您每秒可以執(zhí)行多少個請求。
一些繁重的請求算作多個請求。
為了不受到速率限制,請注意 ?x-rate-limit-used
? 和 ?x-rate-throttle-used
?。
解決此錯誤的方法是升級您的 Moralis 計劃。
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();
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)
更多建議: