EVM Geliştirme
QoreChain, QoreChain EVM Motoru üzerinde tam EVM uyumlu bir yürütme ortamı çalıştırır ve bu sayede tanıdık araçları kullanarak Solidity akıllı sözleşmelerini dağıtmanıza ve onlarla etkileşime geçmenize olanak tanır. EVM modülü, standart Ethereum geliştirme iş akışlarını destekleyen bir JSON-RPC arayüzünü 8545 portunda (WebSocket için 8546 portunda) sunar.
Aşağıdaki örnekler, 29 Haziran 2026'dan beri canlı olan ve v3.2.1 düğüm sürümünü (v3.2.0 yükseltmesinden gelen konsensüs kuralları) çalıştıran qorechain-vladi ana ağını (EVM zincir kimliği 9801) hedef almaktadır. qorechain-diana test ağı (v3.2.2) için EVM zincir kimliği 9800'ü kullanın. Kod örnekleri, kendi çalıştırdığınız bir düğüm için http://localhost:8545 adresini kullanır; herkese açık ana ağ uç noktası https://evm.qore.host, test ağı uç noktası ise https://evm-testnet.qore.host adresidir.
v3.2.0 yükseltmesinden itibaren (ana ağ yüksekliği 2.981.742, test ağı yüksekliği 5.920.000) EVM şeridi (lane), bir işlemi yalnızca (1) kayıtlı bir ML-DSA-87 kuantum-sonrası anahtarına ve (2) o işlem için hâlâ yer bulunan açık bir EVM yetkilendirme penceresine sahip bir hesaptan kabul eder. Sıradan araçlarla (MetaMask, ethers.js, Hardhat, Foundry) imzalarsınız, ancak kayıtlı bir anahtar ve açık bir pencere olmadan eth_sendRawTransaction reddedilir (codespace pqc, kod 26, 27 veya 28). Okumalar, eth_call ve gas tahmini bunların hiçbirine ihtiyaç duymaz. Aşağıdaki EVM yetkilendirme penceresi bölümüne ve İlk İşleminiz sayfasındaki adım adım anlatıma bakın.
JSON-RPC Uç Noktası
| Özellik | Değer |
|---|---|
| Varsayılan URL | http://localhost:8545 |
| WebSocket URL | ws://localhost:8546 |
| Desteklenen ad alanları | eth_, web3_, net_, txpool_ |
| Zincir kimliği (ana ağ) | 9801 (qorechain-vladi) |
| Zincir kimliği (test ağı) | 9800 (qorechain-diana) |
| Para birimi sembolü | QOR |
QoreChain'e özgü okumalar REST üzerinden (api.qore.host) sunulur; aşağıda açıklanan qor_ JSON-RPC ad alanı, herkese açık uç noktalarda ve varsayılan düğüm yapılandırmasında etkin değildir.
Cüzdan Yapılandırması (MetaMask)
QoreChain'i MetaMask'e özel bir ağ olarak ekleyin:
| Alan | Ana Ağ Değeri | Test Ağı Değeri |
|---|---|---|
| Ağ Adı | QoreChain (qorechain-vladi) | QoreChain Diana |
| RPC URL | https://evm.qore.host | https://evm-testnet.qore.host |
| Zincir Kimliği | 9801 | 9800 |
| Para Birimi Sembolü | QOR | QOR |
| Blok Gezgini URL'si | https://explore.qore.network | (isteğe bağlı) |
MetaMask'ten göndermek ayrıca hesapta kayıtlı bir PQC anahtarı ve açık bir EVM yetkilendirme penceresi gerektirir.
Hardhat
Hardhat'i kurun ve hardhat.config.js dosyanızı yapılandırın:
require("@nomicfoundation/hardhat-toolbox");
module.exports = {
solidity: "0.8.24",
networks: {
qorechain: {
url: "http://localhost:8545",
accounts: ["0xYOUR_PRIVATE_KEY_HEX"],
chainId: 9801, // mainnet qorechain-vladi (use 9800 for qorechain-diana testnet)
},
},
};
Bir sözleşmeyi dağıtın (dağıtımı yapan hesabın kayıtlı bir PQC anahtarına ve açık bir yetkilendirme penceresine ihtiyacı vardır; bir dağıtım, pencerede tek bir EVM işlemi olarak sayılır):
npx hardhat run scripts/deploy.js --network qorechain
QoreChain EVM'ye karşı testleri çalıştırın:
npx hardhat test --network qorechain
Foundry
Foundry ile bir sözleşme oluşturun ve dağıtın:
# Create a new project
forge init my-project && cd my-project
# Build
forge build
# Deploy
forge create --rpc-url http://localhost:8545 \
--private-key 0xYOUR_PRIVATE_KEY_HEX \
src/MyContract.sol:MyContract
# Interact
cast call <contract-address> "myFunction()" --rpc-url http://localhost:8545
cast send <contract-address> "setValue(uint256)" 42 \
--rpc-url http://localhost:8545 \
--private-key 0xYOUR_PRIVATE_KEY_HEX
Ethers.js
import { ethers } from "ethers";
// Connect to QoreChain EVM
const provider = new ethers.JsonRpcProvider("http://localhost:8545");
// Get chain info
const network = await provider.getNetwork();
console.log("Chain ID:", network.chainId); // 9801n on mainnet (9800n on testnet)
// Read balance
const balance = await provider.getBalance("0xYourAddress");
console.log("Balance:", ethers.formatEther(balance), "QOR");
// Send transaction
const wallet = new ethers.Wallet("0xYOUR_PRIVATE_KEY_HEX", provider);
const tx = await wallet.sendTransaction({
to: "0xRecipientAddress",
value: ethers.parseEther("1.0"),
});
await tx.wait();
Gas Modeli
QoreChain, EVM işlemleri için EIP-1559 dinamik taban ücreti modelini kullanır:
- Taban ücret, kullanım oranına göre blok başına ayarlanır
- Kullanıcılar
maxFeePerGasvemaxPriorityFeePerGasdeğerlerini belirleyebilir - Öncelik ücretleri blok önerene gider
Birim Köprüsü
Yerel QOR token'ının 6 ondalık basamağı vardır (uqor), EVM ise 18 ondalık basamak bekler. x/precisebank modülü bu dönüşümü sorunsuz şekilde yönetir:
| Bağlam | Birim | Ondalık | Örnek |
|---|---|---|---|
| Yerel zincir | uqor | 6 | 1000000 uqor = 1 QOR |
| EVM | wei | 18 | 1e18 wei = 1 QOR |
Bu dönüşüm şeffaftır — eth_getBalance ile bir bakiyeyi kontrol ettiğinizde yanıt 18 ondalıklı wei cinsinden gelir. Aynı hesap yerel banka modülü üzerinden sorgulandığında bakiye 6 ondalıklı uqor cinsinden görünür.
ERC-20 Token Çiftleri
x/erc20 modülü, yerel Cosmos SDK birimleri ile ERC-20 sözleşmeleri arasında token çiftleri sağlar:
- Yerel token'lar EVM sözleşmeleri içinde ERC-20 olarak kullanılabilir
- EVM üzerinde dağıtılan ERC-20 token'ları yerel birimlere dönüştürülebilir
- Dönüşüm çift yönlüdür ve protokol seviyesinde gerçekleştirilir
# Register a native ERC-20 contract as a token pair (permissioned: `permissionless_registration` is false)
qorechaind tx erc20 register-erc20 <contract-addr> --from mykey
# Convert native tokens to ERC-20
qorechaind tx erc20 convert-coin 1000000uqor --from mykey --gas 400000 --fees 40000uqor
# Convert ERC-20 back to native
qorechaind tx erc20 convert-erc20 <contract-addr> 1000000000000000000 --from mykey --gas 400000 --fees 40000uqor
Bunlar Cosmos şeridi işlemleridir: canlı ağlarda ayrıca hibrit kuantum-sonrası ortak imza (cosign) da gerekir (--generate-only ile oluşturun, ardından qorechaind tx pqc cosign çalıştırın; bkz. Kuantum Sonrası İmzalama). Token çiftleri izinli bir politika altında kaydedilir ve ana ağda henüz hiçbiri yoktur.
PQC ve EVM Uyumluluğu
EVM işlemleri klasik ECDSA (secp256k1) ile imzalanır; bu nedenle MetaMask, Hardhat, Foundry, ethers.js ve diğer standart araçlar bunları değişiklik yapılmadan oluşturur ve imzalar. v3.2.0 ile değişen şey kabul (admission) kuralıdır: bir işlem, yalnızca göndericisi kayıtlı bir kuantum-sonrası anahtara ve etkin bir yetkilendirme penceresine sahipse kabul edilir (sonraki bölüm). Bir anahtar kaydetmek ve pencere açmak Cosmos şeridi işlemleridir ve hibrit (ML-DSA-87 + secp256k1) imza gerektirir.
Sözleşmeler içinde kuantum-sonrası güvenlik için:
- PQC Verify precompile'ı (
0x0000...0A01), etkinleştirildiğinde Solidity'den zincir üzerinde ML-DSA-87 imzalarını doğrulayacaktır; ana ağda veya test ağında henüz etkin değildir. Bkz. EVM Precompile'ları: Ağ durumu. - EVM'den CosmWasm veya SVM'ye giden VM'ler arası mesajlar Cosmos şeridi işlemleridir ve diğerleri gibi hibrit imza taşır; mevcut kullanılabilirlikleri için bkz. VM'ler Arası Birlikte Çalışabilirlik.
EVM yetkilendirme penceresi
Kuantum-sonrası bir imza, bir Ethereum işlemiyle birlikte gidemez (MetaMask gibi cüzdanlar ikinci bir imza ekleyemez); bu yüzden işlemden önce gider. Hesap, Cosmos şeridi mesajı MsgOpenEVMWindow ile sınırlı bir pencere açar; ardından EVM şeridi yalnızca etkin bir pencerenin kapsadığı işlemleri kabul eder. Çalınmış klasik bir anahtar tek başına pencere açamaz, dolayısıyla yalnızca zaten açık olan bir pencerenin izin verdiği kadarını taşıyabilir.
| Sınır | Aralık | Anlamı |
|---|---|---|
blocks | 1 – 17.280 | Pencerenin ne kadar açık kalacağı; pencereyi açan bloktan itibaren blok sayısıyla ölçülür |
max-txs | 1 – 1.000 | Kaç EVM işlemini kabul edeceği |
max-value | 0'ın üzerinde, uqor cinsinden | Kabul ettiği toplam çıkış: aktarılan değer artı her işlemin ödeyebileceği azami ücret (gas limiti × gas başına azami ücret), uqor'a çevrilip yukarı yuvarlanır |
Hangi sınır önce tükenirse pencereyi o kapatır. Tüm alanlar zorunludur; bir pencere açmak mevcut pencerenin yerini alır; kabul edilip sonra başarısız olan bir işlem yine de yuvasını ve değer bütçesini kullanır; sözleşme dağıtımları diğer işlemler gibi sayılır. blocks bir süre değil, blok sayısıdır: 17.280 blok ana ağda yaklaşık 15 saat (blok başına yaklaşık 3,2 sn), test ağında ise yaklaşık 5 saattir (blok başına yaklaşık 1,0 sn).
Adımlar (tam anlatım İlk İşleminiz sayfasındadır):
-
ML-DSA-87 anahtarınızı bir kez kaydedin (
tx pqc register-key-v2veyaregister-key,--gas 600000 --fees 60000uqorile; bu tek işlem hibrit gereksiniminden muaftır, böylece yeni bir hesap kendini başlatabilir). Bkz. Kuantum Sonrası İmzalama. -
Bir pencere açın. Bu bir Cosmos şeridi işlemidir; bu yüzden imzasız üretin ve ML-DSA anahtarınızla ortak imzalayın (
max-value,uqorveyaqorkabul eder;1000qor1.000 QOR'dur):qorechaind tx pqc open-evm-window 7200 20 1000qor --from mykey \--chain-id qorechain-vladi --gas 400000 --fees 40000uqor --generate-only > w.jsonqorechaind tx pqc cosign w.json --from mykey --pqc-key mypqc --chain-id qorechain-vladi -
Geriye ne kaldığını kontrol edin:
qorechaind query pqc evm-window <address>veyaGET /qorechain/pqc/v1/evm_window/{address}(pencere yoksafound: falseyanıtı verir). -
EVM işlemlerinizi normal şekilde gönderin. Bir pencere açmak bir Cosmos şeridi işlemidir ve hesabın sıra numarasını (sequence) ilerletir; bu aynı zamanda hesabın EVM nonce'udur, bu yüzden nonce'u pencere açıldıktan sonra okuyun ve imzayı o zaman atın.
Bir pencereyi erkenden qorechaind tx pqc close-evm-window ile kapatın (aynı --generate-only ve cosign düzeni), örneğin klasik anahtarın açığa çıktığından şüphelenirseniz: pencerenin hâlâ kabul edeceği her şey bir sonraki bloktan itibaren reddedilir.
Ret (codespace pqc) | Anlamı |
|---|---|
| code 26 | Gönderici için açık pencere yok veya göndericinin kayıtlı bir PQC anahtarı yok |
| code 27 | Pencerenin süresi dolmuş veya tükenmiş (mesaj hangi sınırın aşıldığını gösterir) |
| code 28 | Pencere açılırken geçersiz sınırlar veya o anda kayıtlı anahtar yok |
TypeScript SDK ile (0.8.2 ve sonrası): openEvmWindowMsg, closeEvmWindowMsg, fetchEvmWindow({ rest, address }) ve classifyEvmWindowRejection(err) ("no-pqc-key" | "no-window" | "exhausted" | "invalid").
Özel qor_ Ad Alanı
QoreChain, zincire özgü sorgular için JSON-RPC'yi bir qor_ ad alanıyla genişletir:
Yayımlanmış hiçbir düğüm sürümü henüz qor_ ad alanını sunmuyor: herkese açık uç noktalardaki rpc_modules yalnızca eth, net, rpc, txpool ve web3'ü listeler ve aşağıdaki her yöntem; ana ağda, test ağında ve varsayılan yapılandırmayla (eth, net, web3, txpool) kendi çalıştırdığınız düğümlerde -32601 (yöntem bulunamadı) döndürür. Durum ve REST alternatifleri için (örneğin PQC anahtar durumu için GET /qorechain/pqc/v1/account/{address}) bkz. qor_ ad alanı.
| Yöntem | Açıklama |
|---|---|
qor_getPQCKeyStatus | Bir hesabın kayıtlı bir PQC genel anahtarı olup olmadığını kontrol eder |
qor_getAIStats | Yapay zeka motoru istatistiklerini alır (anomali sayıları, risk dağılımı) |
qor_getCrossVMMessage | Bir VM'ler arası mesajın durumunu kimliğine göre sorgular |
qor_getPoolClassification | Doğrulayıcı havuzu sınıflandırmasını alır (RPoS/DPoS/PoS) |
qor_getReputationScore | Bir doğrulayıcının itibar puanını sorgular |
qor_getAbstractAccount | Soyut hesap yapılandırmasını alır |
curl ile örnek:
curl -X POST http://localhost:8545 \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "qor_getPQCKeyStatus",
"params": ["0xYourAddress"],
"id": 1
}'
Sonraki Adımlar
- EVM Precompile'ları — Ayrılmış precompile arayüzleri için başvuru (herkese açık ağlarda henüz etkin değil)
- VM'ler Arası Birlikte Çalışabilirlik — VM'ler arası çağrılar ve mevcut kullanılabilirlikleri
- Hesap Soyutlaması — Bağlı cüzdan doğrulayıcıları ve harcama kuralları (modül şu anda devre dışı)