إنتقل إلى المحتوى الرئيسي

دليل EVM

@qorechain/evm هو محوّل رقيق وآمن من حيث الأنواع فوق viem لمحرّك EVM في QoreChain. إنّه لا يعيد تنفيذ عميل EVM — فـ viem اعتمادية نظيرة. إنّه يضيف مصنع عميل مدركًا للسلسلة (مع كشف تلقائي لمعرّف سلسلة EVM)، ومساعدات ERC-20، وأغلفة نشر/استدعاء العقود، وارتباطات مُصنّفة لما قبل التجميع (precompiles) في EVM الخاص بـ QoreChain.

npm i @qorechain/evm viem

إنشاء عميل

تُرجع createEvmClient حزمة عميل مدعومة بـ viem. تكشف تلقائيًا معرّف سلسلة EVM عبر eth_chainId ما لم تمرّر chainId.

import { createEvmClient } from "@qorechain/evm";

const client = await createEvmClient({
endpoints: { evmRpc: "https://evm.testnet.example" },
});

console.log(await client.getChainId());
// client.publicClient — a viem PublicClient for reads

يمكنك أيضًا تمرير rpcUrl مباشرةً (متعارض تبادليًا مع endpoints)، و wsUrl / endpoints.evmWs لـ WebSocket، وchainId صريح، وdecimals (القيمة الافتراضية 18، وهي اصطلاح EVM لـ QOR — متمايز عن أساس Cosmos لـ uqor البالغ 10^6).

اشتقّ حساب توقيع EVM من مفتاح خاص:

import { evmAccountFromPrivateKey } from "@qorechain/evm";

const account = evmAccountFromPrivateKey("0x...");

مساعدات ERC-20

يغلّف فضاء الأسماء erc20 (والدوال الفردية) استدعاءات ERC-20 القياسية. تأخذ عمليات القراءة عميل viem العام؛ وتأخذ عمليات الكتابة عميل محفظة.

import { erc20 } from "@qorechain/evm";

const bal = await erc20.balanceOf(client.publicClient, token, account);
const meta = await erc20.metadata(client.publicClient, token); // Erc20Metadata
const allowed = await erc20.allowance(client.publicClient, token, owner, spender);

// writes (need a wallet client)
// await erc20.transfer(walletClient, token, to, amount);
// await erc20.approve(walletClient, token, spender, amount);

يُصدَّر الـ ABI الخام باسم ERC20_ABI إن كنت تفضّل استدعاء viem مباشرةً.

العقود

أغلفة نشر واستدعاء عامة:

import { deployContract, readContract, writeContract } from "@qorechain/evm";

// const address = await deployContract(walletClient, { abi, bytecode, args });
// const value = await readContract(client.publicClient, { address, abi, functionName, args });
// const hash = await writeContract(walletClient, { address, abi, functionName, args });

ما قبل التجميع (Precompiles)

تكشف QoreChain عن مكوّنات ما قبل التجميع القابلة للاستدعاء كعقود على عناوين ثابتة. يوفّر فضاء الأسماء precompiles ارتباطات مُصنّفة، وتُصدَّر العناوين وملفّات ABI.

ما قبل التجميعالدالةالعنوان
جسر عبر-الأجهزة-الافتراضية (Cross-VM Bridge)(توجيه الجسر)0x0000000000000000000000000000000000000901
التحقق من PQCpqcVerify0x0000000000000000000000000000000000000A01
حالة مفتاح PQCpqcKeyStatus0x0000000000000000000000000000000000000A02
درجة مخاطر QCAIaiRiskScore0x0000000000000000000000000000000000000B01
فحص شذوذ QCAIaiAnomalyCheck0x0000000000000000000000000000000000000B02
معاملات الإجماعrlConsensusParams0x0000000000000000000000000000000000000C01
import { precompiles, PRECOMPILE_ADDRESSES } from "@qorechain/evm";

// Read live consensus parameters.
const params = await precompiles.rlConsensusParams(client.publicClient);

// Check whether an address has a registered PQC key.
const status = await precompiles.pqcKeyStatus(client.publicClient, account);

// QCAI helpers.
const score = await precompiles.aiRiskScore(client.publicClient, /* args */);
const anomaly = await precompiles.aiAnomalyCheck(client.publicClient, /* args */);

console.log(PRECOMPILE_ADDRESSES.crossVmBridge);

تُصدَّر ملفّات ABI لما قبل التجميع باسم IQORE_PQC_ABI وIQORE_AI_ABI و IQORE_CONSENSUS_ABI.

على عقدة لا تتوفّر فيها مكوّنات ما قبل التجميع الخاصة بـ QoreChain، تُطلِق هذه الاستدعاءات خطأ "feature not present". عالج ذلك لكلّ استدعاء على حدة إن كنت تستهدف عُقدًا غير متجانسة.

انظر مثال evm-precompile للحصول على نسخة قابلة للتشغيل.