تست بلاک‌چین و dApp فقط Unit Test یک Smart Contract یا اندازه‌گیری TPS نیست. محصول واقعی از Wallet/Signer، Frontend و Backend، RPC/Node، Mempool، Consensus/Finality، Contract و Proxy، Event indexer، Oracle/Bridge، پایگاه‌داده خارج زنجیره و Governance ساخته می‌شود. تراکنش ممکن است Signed ولی Broadcastنشده، Pending، Dropped، Replaced، Reverted، Included، Reorgشده یا Finalized باشد؛ اگر Oracle تست این حالت‌ها را یکی بداند، نتیجه سبز می‌تواند سیستم مالی نادرستی را پنهان کند.

این صفحه مالک چرخه تست سیستم‌های Blockchain/dApp است: Chain/Threat/Trust Contract → Transaction state → Contract invariants → Wallet/RPC/Indexer → Oracle/Bridge/Upgrade → Performance/Operations → Off-chain reconciliation. الگوهای عمومی سیستم توزیع‌شده در تست سیستم‌های توزیع‌شده، اصول امنیت در راهنمای تست امنیت و دفترکل/تراکنش مالی در تست فین‌تک مالکیت جدا دارند؛ اینجا همان مفاهیم را روی مرزهای Chain اعمال می‌کنیم.

پاسخ کوتاه: تست بلاک‌چین چیست؟

فرایند آزمون System و Protocol Contract یک برنامه مبتنی بر دفترکل توزیع‌شده است: آیا تراکنش، State transition، Event، امضا، مجوز، دارایی، Fee، Finality، Upgrade و هماهنگی On-chain/Off-chain طبق Specification و Threat model رفتار می‌کنند؟ «Blockchain» یک محصول واحد نیست؛ Public/Permissioned، Account/UTXO، L1/L2، EVM/non-EVM و Finality modelهای مختلف Oracle متفاوت دارند.

اصل QA: هش معتبر فقط می‌گوید Bytes مورد بررسی با Commitment برابرند؛ نمی‌گوید داده ابتدا درست، کامل، قانونی، مجاز یا متعلق به Run صحیح بوده است. Consensus نیز توافق Participantها بر State transition است، نه Oracle حقیقت جهان بیرون.

اول Chain Contract را بنویسید

Blockchain System Test Contract
network/protocol: chain ID, client(s), version/fork, L1/L2, consensus/finality
deployment: contract/proxy/implementation addresses + bytecode/source/compiler
assets/units: native/token, decimals, rounding, max/min, zero-address rules
actors/trust: user, signer, relayer, admin, guardian, oracle, bridge, validator
transaction states: created→signed→broadcast→pending→included→safe/finalized
replacement/reorg: nonce, fee bump, dropped, reverted, removed log, replay
contract invariants: supply/balance/authorization/state-machine/conservation
off-chain boundary: indexer, DB, queue, cache, ledger, notification, reconciliation
external dependencies: RPC, wallet, oracle, bridge, explorer, sequencer
upgrade/governance: proxy pattern, storage layout, timelock, quorum, pause/rollback
security/privacy: keys, signing intent, metadata, front-running/MEV assumptions
performance/cost: workload, gas/fee, block limit, rate/quota, finality latency
environment/data: local/fork/testnet, snapshot, funded accounts, reset and faucet
evidence: tx/receipt/log/block/state roots + app correlation + redaction
limits: exactly what local/fork/testnet cannot prove

مدل‌های Blockchain را قاطی نکنید

مدلسؤال ویژهچیزی که تعمیم نمی‌یابد
Public permissionless L1fee، mempool، reorg/finality، adversarial participantsGovernance و identity شبکه خصوصی
Permissioned DLTmembership، endorsement، channel/privacy، node policyGas/MEV/public validator assumptions
L2/Rollupsequencer، batch، proof/challenge، L1 settlement، withdrawalL1 finality مستقیم
Bridge/Cross-chainmessage identity، source/destination finality، replay، relayerAtomicity یک Chain
Account-based/EVMnonce، gas، contract call/storage/logUTXO selection/change rules
UTXOinput ownership، double-spend، change، scriptAccount nonce/storage semantics

معماری dApp را انتها‌به‌انتها ببینید

User intent
→ Frontend / wallet connect / chain selection
→ transaction construction / simulation / approval
→ signer / key / hardware / signature
→ RPC / relayer / bundler / mempool
→ block inclusion / execution / receipt / logs
→ safe/finalized or removed/reorged
→ indexer / queue / off-chain DB & ledger
→ notification / UI status / reconciliation
→ oracle / bridge / governance / upgrade paths

Unit contract می‌تواند Pass باشد ولی Frontend Address یا chain ID اشتباه امضا کند؛ Receipt موفق باشد ولی Indexer Event را دوبار مصرف کند؛ Contract Event درست باشد ولی Backend مقدار decimal را غلط تبدیل کند. هر Arrow یک Interface، identity و failure mode مستقل دارد.

چرخه تراکنش را State machine کنید

مستند رسمی Ethereum درباره Transactions تراکنش را Instruction امضاشده و مسیر آن را از Hash/Broadcast/Pool تا Inclusion و سپس Justified/Finalized شرح می‌دهد. این منبع برای Ethereum است و به همه Chainها تعمیم مستقیم ندارد؛ Stateها و Finality دقیق Network هدف را از Specification همان Protocol بگیرید.

StateOracleUI/Backend رفتار
Draft/Unsignedintent، recipient، amount، chain، calldataهیچ اثر مالی/ثبت نهایی
Signedsignature/signer/nonce/chain replay domainهنوز Broadcast تضمین نیست
BroadcastRPC accepted + local request identitySubmitted، نه Success
Pendingpool/nonce/status با timeoutRetry کور ممنوع
Replaced/Droppedsame nonce/new hash یا absence policyپیوند و resolution روشن
Included successreceipt status + block/hash + state/log effectsProvisional طبق risk/finality
Included revertreceipt failure/revert reason/zero intended effectFail؛ Fee ممکن است مصرف شود
Removed/Reorgedblock/log no longer canonical؛ removed eventCompensate/revert provisional state
Safe/FinalizedNetwork-specific tag/checkpointFinal business transition طبق Contract

Transaction identity فقط Hash نیست

برای EVM-style flow، Identity عملی شامل chainId + sender + nonce برای Intent/Replacement، txHash برای نسخه امضاشده، و blockHash + transactionIndex برای Inclusion است. Event identity معمولاً chainId + txHash + logIndex است، اما Reorg می‌تواند همان Logical event را در Block دیگری دوباره ظاهر کند. Correlation تجاری Order/Payment/Withdrawal را جدا نگه دارید.

JSON-RPC Latest، Safe و Finalized یکسان نیستند

Ethereum JSON-RPC API برای Queryهای State، Block tagهای latest، safe، finalized و pending را تفکیک می‌کند؛ Log حذف‌شده در Reorg نیز می‌تواند removed=true داشته باشد. Test double و Indexer شما باید این تفاوت را بسازند؛ Mockی که همه Queryها را یک State ثابت برمی‌گرداند، Reorg/Finality logic را آزمایش نمی‌کند.

Oracle چندلایه تراکنش

لایهEvidenceخطای قابل‌کشف
Intentuser-visible recipient/amount/unit/chain/actionblind signing و wrong chain
Envelopesender/nonce/fee/data/signature domainreplay/replacement/encoding
Receiptstatus، gas used، block/tx identityrevert یا wrong inclusion
Contract statestorage/view queries در block مشخصEvent درست، State غلط
Eventsaddress/topic/data/log index/removedmissing/duplicate/reorg
Asset invariantbalance/supply/conservation/roundingmint/burn/decimal loss
Off-chainDB/ledger/queue/indexer idempotencydouble credit/stale UI
Finalitycanonical safe/finalized checkpointpremature settlement
ReconciliationOn-chain vs business ledger and exceptionssilent divergence

آزمایش بازتولیدپذیر: Duplicate + Reorg + Finality

یک Fixture نویسنده‌ساخته و بدون Dependency با Node.js ۲۴.۱۸.۰ اجرا کردیم. Stream شامل Event با ۱۲۰ واحد ساختگی، Delivery تکراری همان Log، سپس removed=true در Reorg، Inclusion دوباره در Block جدید و Signal Finalized بود. مصرف‌کننده ساده هر Log غیرRemoved را نهایی شمرد؛ مصرف‌کننده دوم با Event identity، وضعیت Provisional/Removed/Finalized و Idempotency کار کرد.

eventCount = 6

NAIVE CONSUMER
credited = 360
reason = duplicate delivery + old inclusion + re-inclusion counted as final

REORG-AWARE CONSUMER
identity = 31337:0xaaa:0
old block 0xb100 → removed
new block 0xb102 → provisional → finalized
finalized = 120
provisional = 0

expected canonical finalized amount = 120

این برنامه Client اتریوم، شبیه‌سازی Consensus، Wallet، Contract، RPC Provider یا Trace واقعی Chain نیست. Hashها، Eventها، Finality signal و Token unitها کاملاً ساختگی‌اند و Fork، Validator، Fee، Signature، Nonce replacement، Bridge و Economic security را مدل نمی‌کنند. فقط مکانیک Delivery تکراری، State موقت، Reverse کردن Removed log و Finalization صریح را نشان می‌دهد.

Smart Contract را با Example تنها تست نکنید

راهنمای رسمی Ethereum برای تست Smart Contract ترکیب Unit، Integration، Static، Property/Fuzz، Manual review، Audit و Bug bounty را مطرح می‌کند و صریحاً غیاب Bug را تضمین‌شده نمی‌داند. Tool suite را با Contract/language/chain/version خود Tailor کنید؛ فهرست ابزار، Strategy نیست.

Techniqueسؤالمحدودیت
Unit/ExampleFunction/transition برای موارد مشخصPath/inputهای نانوشته
Integration/ForkCross-contract و State وابستگیFork، Production آینده/MEV/latency نیست
Property/FuzzInvariant زیر Sequence/Inputهای بسیارProperty/Generator ناقص
Stateful fuzzSequence role/action و interleavingState-space و shrink/replay
Static analysisPattern/pathهای مشکوکfalse positive/negative
Symbolic/FormalProperty روی Model/assumptionsSpecification gap و محیط بیرونی
Manual review/AuditDesign/context/attack pathsnapshot، scope و عدم تضمین
Bug bountyتنوع adversarial پس از آمادگیجایگزین tests/audit نیست

Invariant از Test case مهم‌تر است

  • جمع دارایی‌های حساب‌ها و escrow طبق Rule با supply/mint/burn سازگار است.
  • هیچ Actor بدون Role/Allowance/Signature مجاز State حساس را تغییر نمی‌دهد.
  • یک Logical intent بیش از یک Business effect ایجاد نمی‌کند.
  • Pause، limit و timelock فقط Actor/Scope/زمان تعریف‌شده را محدود می‌کنند.
  • Sequence نامعتبر State machine رد و State/asset حفظ می‌شود.
  • Rounding/decimals در مرز min/max/zero ارزش ایجاد یا نابود نمی‌کند.
  • Failure در External call اثر جزئی ناخواسته باقی نمی‌گذارد.
  • Upgrade، State موجود و Invariantها را حفظ یا Migration صریح دارد.
  • Eventهای لازم با State واقعی سازگارند؛ Event خود State نیست.
  • Reorg/duplicate/retry در Indexer و Business ledger اثر یکتا می‌سازد.

طراحی Generator، Shrink، Seed و Replay در راهنمای Property-Based Testing و سنجش قدرت Suite در راهنمای Mutation Testing تفصیل دارد.

Stateful Sequenceها را عمداً بسازید

Example stateful actions
deploy / initialize / pause / unpause
grant / revoke / renounce / rotate signer
deposit / approve / transfer / withdraw / cancel
repeat / reorder / front-run / same-block interleave
oracle update stale/future/outlier
bridge send / relay duplicate / relay late / source reorg
upgrade valid / invalid storage / rollback / emergency pause
RPC timeout / replacement / removed log / restart indexer

After every action:
assert authorization + state-machine + asset + event + off-chain invariants

Access Control را فقط با Happy path نسنجید

ProbeOracle
Unauthorized direct callRevert و صفر State/asset effect
Call through proxy/fallbackهمان authorization context مورد انتظار
Role grant/revoke/renounceevent + state + immediate/lag semantics
Multisig threshold/ordersigner set، quorum، duplicate signature، expiry
Timelockschedule→delay→execute/cancel و timestamp boundary
Pause/guardianscope دقیق؛ read/withdraw/emergency paths
Admin key rotationold key denied، new accepted، audit trace
Implementation direct initinitializer protection طبق pattern

Reentrancy یک Pattern است، نه کل امنیت

Reentrancy را با Receiver مخرب، callbackهای تو در تو، cross-function/cross-contract path و state-before-external-call بررسی کنید؛ سپس authorization، arithmetic/rounding، signature replay/malleability assumptions، delegatecall/proxy، denial of service، forced asset، oracle manipulation، front-running/MEV، flash-loan composability و economic invariants را بر اساس Threat model پوشش دهید. OWASP Smart Contract Security Testing Guide یک مرجع Methodology است؛ Checklist آن Certification یا غیاب Vulnerability نیست.

Compiler، Bytecode و Deployment identity

Contract deployment manifest
source commit + repository + reviewed tag
compiler name/version + optimizer/viaIR/settings
dependency/library versions + lockfile
ABI + creation/runtime bytecode hashes
network/chain ID + deployer + nonce + tx hash
contract/proxy/implementation/admin/beacon addresses
constructor/initializer args + salts/libraries
verified-source status (if applicable)
deployment block hash/number + finality state
roles/owners/limits/oracles/bridges/upgrade policy
artifact provenance + audit scope/report commit

«Source audited» کافی نیست اگر Bytecode دیگری Deploy شده، Compiler setting عوض شده یا Proxy به Implementation تازه اشاره می‌کند. Test report باید Code واقعی در Address و Block مشخص را به Source/Build متصل کند.

Upgradeability، Immutability را به Governance منتقل می‌کند

Proxy اجازه تغییر Logic پشت Address ثابت را می‌دهد؛ بنابراین سؤال از «کد تغییرناپذیر است؟» به «چه کسی، با چه Delay/Quorum و چه Compatibility می‌تواند Logic را عوض کند؟» منتقل می‌شود. راهنمای OpenZeppelin درباره Upgrade بر تست Implementation و تعامل از طریق Proxy و حفظ State بعد Upgrade تأکید می‌کند؛ آن را برای Pattern دقیق خود Tailor کنید.

Upgrade testEvidence/Oracle
Storage layout compatibilityslot/layout diff + state snapshot before/after
Initializer/reinitializerیک‌بار، نسخه درست، unauthorized denied
Proxy/implementation identityaddress/slot/event/code hash
Admin authorizationmultisig/timelock/role negative tests
Old state/new behaviorinvariants و historical positions
Pending operationsorders/withdrawals/votes across upgrade
Event/API compatibilityindexer/frontend old/new schemas
Rollback/emergencyامکان/محدودیت، state compatibility و decision rights

Wallet و Signing Intent را E2E تست کنید

  • Chain ID، account، recipient/contract، function، amount، decimals و fee برای کاربر روشن است.
  • Network switch/reject، disconnect، locked wallet، unsupported chain و stale session رفتار امن دارند.
  • User rejection هیچ Business state موفق ایجاد نمی‌کند.
  • Signature نوع درست، domain/nonce/expiry و replay protection دارد.
  • Blind/ambiguous calldata با simulation یا warning محدود می‌شود؛ UI نباید نتیجه را تضمین کند.
  • Replacement/cancel با همان Nonce و Hash تازه به Intent اصلی وصل می‌شود.
  • Multiple tabs/devices و concurrent nonce سبب double effect یا stuck state نمی‌شوند.
  • Hardware wallet/mobile deep link/QR truncation/RTL و Address copy/paste آزمایش می‌شوند.
  • Seed phrase/private key هرگز در Test log، screenshot، analytics یا support flow وارد نمی‌شود.
  • Frontend compromise/DNS/dependency threat جدا از Contract audit دیده می‌شود.

Nonce، Replacement و Retry

حالتریسکانتظار
دو Request هم‌زمانNonce collisionهماهنگی Signer/queue و identity
Fee پایینPending طولانیstatus/expiry/bump policy؛ بدون Resubmit کور
Speed upHash تازه، همان NonceReplacement linkage و یک effect
CancelRace با تراکنش اصلیفقط نتیجه Canonical، وضعیت صادقانه
RPC timeout پس از submitUnknown commitProbe by intent/sender+nonce/hash قبل Retry
Signer restartlocal nonce stalereconcile pending/latest policy
Chain reset/fork devnonce/state rewindenvironment identity و reset consumers

Event و Indexer را همان‌قدر جدی بگیرید که Contract را

Event ممکن است Duplicate، Late، Out-of-order یا Removed باشد؛ RPC range limit، pagination، provider inconsistency و indexer restart نیز Gap می‌سازند. Consumer باید checkpoint را با block hash نگه دارد، overlap/replay را idempotent مصرف کند، canonicality را بازبینی و Backfill را با Live stream هماهنگ کند.

Indexer correctness contract
scope = chainId + contract addresses + topics + deployment block
cursor = block number + block hash + log index
identity = chainId:txHash:logIndex (plus canonical block tracking)
read window = from/to with overlap and provider limit
states = provisional | finalized | removed | disputed
on reorg = rewind to common ancestor or bounded checkpoint
on restart = replay idempotently; no gap/double business effect
backfill/live handoff = explicit watermark
completeness = compare sampled/raw RPC range and state reconciliation
evidence = query/provider/version/timestamps/raw log hashes

RPC Provider را منبع حقیقت واحد فرض نکنید

Provider می‌تواند Lag، Rate limit، timeout، partial log range، archive limitation، wrong network، stale cache یا method difference داشته باشد. Chain ID/genesis/client sync head را در Health بسنجید؛ برای Critical query مقایسه چند endpoint یا local node تعریف کنید؛ disagreement را Unknown/Degraded نگه دارید و «اولین پاسخ ۲۰۰» را Truth ننامید.

Oracleها و Data feedها

Contract نمی‌تواند حقیقت بیرونی را از Consensus استخراج کند؛ Oracle یک Trust/dependency جدید است. Freshness، heartbeat، decimals، unit، source count/aggregation، outlier، zero/negative، future timestamp، stale-but-valid response، sequencer/down state، fallback و admin update را تست کنید. Manipulation resistance یک Claim اقتصادی/امنیتی مستقل است و با Mock price Pass نمی‌شود.

Oracle probeانتظار
Stale timestampreject/hold/fallback طبق max age
Decimal/unit mismatchnormalize درست یا fail closed
Outlier/zero/negativedomain guard و event
Future timestampclock/skew policy و reject
Feed unavailablepause/bounded operation؛ نه last value نامحدود
Admin/feed switchauthorization/timelock/event و new-feed qualification
Rapid oscillationbusiness/economic invariant و rate control
Source disagreementaggregation/uncertainty و alert

Bridge و Cross-chain message

Bridge را «Transfer اتمیک» فرض نکنید. Source initiation، source finality، message proof/attestation، relay، destination execution، retry و refund/escape هرکدام State دارند. Reorg در Source، Duplicate relay، wrong destination/chain/domain، replay، partial outage، fee change و delayed finality را Fault-inject کنید؛ Supply/conservation را روی هر دو Chain و pending escrow reconcile کنید.

Cross-chain identity
message_id + source_chain + source_tx/log + source_finality
+ bridge/version/domain + payload hash + nonce
+ relayer/attestation/proof identity
+ destination_chain + destination_tx/status/finality
+ asset/amount/decimals + escrow/mint/burn/release state
+ retry/refund/expiry and one-logical-effect invariant

Environment ladder: Local، Fork، Testnet، Mainnet

محیطخوب برایاثبات نمی‌کند
Pure model/unitمنطق و Invariant سریعEVM/client/RPC/network
Local single-node dev chainexecution، snapshot، time/block controlConsensus، public mempool، provider behavior
Local multi-client/networkclient/RPC/peer/interoperability/faultPublic economics/validator diversity
Mainnet fork localState/contract integration در block مشخصآینده Mainnet، MEV، real finality/latency
Public testnetwallet/RPC/deploy/operations sharedMainnet liquidity/load/fee/adversary parity
Shadow/read-only Mainnetreal data/RPC/indexer observationsafe write behavior یا counterfactual
Bounded Mainnet canaryreal end-to-end با limit و authorityغیاب Risk خارج bounds

Environment identity و Reset

Chain test environment manifest
chain ID + genesis hash + fork/source block hash
client name/version/config + protocol fork rules
node count/roles/keys + consensus/finality config
RPC methods/limits/archive mode + provider identity
block time/mining/time-travel/snapshot controls
deployed address/bytecode/proxy/roles/oracle/bridge set
funded accounts and synthetic asset balances
indexer/database/queue versions and cursor
fault controls: partition/restart/reorg/replacement/oracle/RPC
seed/snapshot/reset proof + no real key/asset/effect
created/expires owner + evidence retention

Fork testing؛ State واقعی، محیط واقعی نیست

Fork در Block مشخص، Balance/Code/Storage تاریخی را برای Integration فراهم می‌کند، اما Mempool، سایر کاربران، Oracle آینده، Validator/Sequencer، MEV، Public latency و Liquidity واقعی را بازسازی نمی‌کند. Block hash، RPC provider، archive completeness و impersonation را ثبت کنید؛ State fork بعد از Mutation دیگر History Mainnet نیست.

Gas، Fee و Performance را جدا کنید

سنجهمعنادام
Gas usedکار محاسباتی/Storage طبق execution rulesقیمت پولی نیست
Gas/fee priceقیمت واحد در بازار/Protocolبا Code quality یکی نیست
Total feegas × price و اجزای Protocolدر زمان/شبکه متغیر
Block inclusion latencysubmit تا inclusionFinality latency نیست
Finality latencyinclusion تا status نهایی موردنیازNetwork-specific
RPC latencyClient↔Provider responseChain throughput نیست
Indexer lagcanonical block تا searchable stateContract execution نیست
TPS/throughputworkload پذیرفته/نهایی در زمانبدون mix/state/validity بی‌معناست

Workload و Denominator برای Performance

Blockchain performance contract
network/client/protocol/chain state and block limits
transaction mix: read/write/functions/calldata/state warm-cold paths
actor/account/nonce strategy and signer throughput
submission rate vs accepted/included/finalized rates
success/revert/drop/replace/reorg counts
P50/P95/P99 submit→include→safe/finalized latency
gas used / fee assumptions / state growth / log volume
RPC rate limits/errors and indexer lag/backfill
node CPU/memory/disk/network/peer/DB metrics
duration/warmup/cooldown/repetitions/uncertainty
no universal TPS claim outside this contract

Front-running، Ordering و MEV assumptions

اگر Outcome به ترتیب تراکنش حساس است، حالت‌های same-block reorder، competing transaction، sandwich-like sequence، commit-reveal timing، deadline/slippage، nonce race و private/public submission را مدل کنید. Local miner با ترتیب دلخواه Scenario می‌سازد، اما ریسک اقتصادی واقعی یا محافظت قطعی را ثابت نمی‌کند. Property باید مستقل از ترتیب باشد یا Ordering assumption صریح و enforceشده داشته باشد.

Time و Block variables

  • مرز دقیق قبل/برابر/بعد Deadline و Timelock را تست کنید.
  • Timestamp را ساعت دیواری کاملاً دقیق فرض نکنید؛ Protocol assumption را بنویسید.
  • Block number را Proxy زمان ثابت بین Chain/L2ها ندانید.
  • Clock UI/Backend با Chain timestamp و timezone محلی جداست.
  • Delayed inclusion ممکن است Transaction معتبر را بعد Deadline Revert کند.
  • Time travel تست محلی باید Snapshot/Block identity و محدودیت را ثبت کند.
  • Oracle timestamp، signed message expiry و nonce domain را با هم Boundary test کنید.

Off-chain Reconciliation آخرین Oracle است، نه Event

dApp معمولاً سفارش، کاربر، گزارش، Fiat ledger یا notification خارج Chain دارد. Transaction موفق بدون ثبت Business effect، و DB موفق بدون Finality Chain هر دو ناقص‌اند. Reconciliation باید Positionها را بر اساس Block/checkpoint و Asset/Decimals مقایسه، Missing/Duplicate/Removed/Unknown را دسته‌بندی و مسیر Repair با Authority روشن داشته باشد. اصول DB/Migration/Integrity در راهنمای تست پایگاه داده تکمیل‌کننده است.

مغایرتProbeRepair ایمن
On-chain finalized، DB missingreplay raw canonical rangeidempotent backfill
DB effect، log removedcanonicality/checkpointcompensate/revert provisional
Duplicate DB effectevent/business identitydeduplicate با audit
Wrong decimals/unitraw amount/token metadata/versioncontrolled correction، نه overwrite خاموش
RPC disagreementmulti-endpoint/local nodehold Unknown تا resolution
Indexer gapblock/hash cursor continuityrewind/backfill bounded
Bridge pending too longsource/destination state/finalityprotocol-defined retry/refund/escalation

سناریوی ایرانی: تسویه Voucher آزمایشی، نه رمزارز واقعی

یک بازارگاه خیالی ایرانی برای محیط آزمایش از Voucher کاملاً ساختگی روی Chain محلی با Chain ID خیالی ۳۱۳۳۷ استفاده می‌کند. Voucher پول، رمزارز، دارایی قابل‌خرید یا توصیه سرمایه‌گذاری نیست. Backend پس از Finality آن را با Ledger سفارش Reconcile می‌کند؛ هیچ Mainnet، کیف پول شخصی، کلید واقعی یا انتقال مالی وجود ندارد. هدف صرفاً آزمون State/Indexer/Reconciliation است و هیچ ادعای حقوقی/رگولاتوری درباره ایران ندارد.

Fictional voucher settlement contract
business identity = tenant/order/settlement-attempt/idempotency
chain identity = chainId/contract/sender/nonce/txHash/logIndex/blockHash
amount = canonical IRR in business ledger; voucher test units mapped explicitly
display = labelled toman; Persian/Arabic/Latin digits; RTL/address handling
time = UTC business event + Asia/Tehran/Jalali display + chain block time
states = unsigned/signed/pending/replaced/reverted/included/removed/finalized
faults = RPC timeout-after-submit, duplicate log, reorg, indexer restart, stale oracle
oracle = Contract state + receipt/log + Order/Ledger/Outbox/Reconciliation
data = synthetic; no PAN/CVV2/OTP/token/seed/private key
effects = fake SMS/email/webhook; no real PSP/wallet/exchange/mainnet
prohibited = auto-trust, legal/compliance/investment/real-money claims

فارسی، RTL، Address و Amount

  • Address/Hash لاتین در RTL نباید visually reorder یا truncate خطرناک شود؛ copy value کامل و verification affordance بدهید.
  • Token/Voucher decimals را با Integer raw amount نگه دارید؛ Floating point ممنوع.
  • ریال/تومان از Token unit جدا و Conversion source/time/rounding آشکار است.
  • ارقام فارسی/عربی/لاتین و Unicode normalization فقط در Display/Input، نه Hash/Address canonical، آزموده شوند.
  • Explorer/Wallet deep link باید Chain/Address/Tx درست داشته باشد و Unknown network را باز نکند.
  • Warning/Confirmation با Screen reader، keyboard و رنگ مستقل قابل‌فهم باشد.
  • Finalized، Pending، Failed، Replaced و Reorged ترجمه‌های متمایز و غیرگمراه‌کننده دارند.

Key management و Test safety

  • Test mnemonic/keys فقط برای Network تست و با Label واضح؛ هرگز Reuse در Mainnet/Production.
  • CI log، Artifact، screenshot، crash report و analytics برای Secret scan آزموده شوند.
  • Faucet/funded accounts limit، expiry، rotation و abuse control دارند.
  • Signer service least privilege، chain/contract/function/value allowlist و audit دارد.
  • High-value/admin path با hardware/multisig/timelock fidelity مناسب آزمایش می‌شود.
  • Lost/compromised key drill، revoke/rotate/transfer authority و communication دارد.
  • Test environment از Mainnet RPC/write و real wallets به‌صورت Network/Policy مسدود است.

آیا Blockchain برای ثبت شواهد QA لازم است؟

معمولاً خیر. Signed manifest، immutable/object-lock storage، access log، append-only audit، artifact attestation و separation of duties اغلب ساده‌تر و کم‌هزینه‌ترند. Blockchain زمانی Candidate است که چند سازمان با Authority مشترک‌نداشته، قواعد Membership/Governance روشن و نیاز واقعی به replicated shared log دارند. حتی آن‌گاه فقط Commitment/Hash و Metadata حداقلی On-chain بگذارید؛ Evidence اصلی، PII، Secret و داده قابل‌حذف Off-chain بماند.

سؤال Build/Don’t-buildاگر پاسخ منفی است
چند Writer مستقل و کم‌اعتماد داریم؟DB/Audit log متمرکز کافی‌تر است
Consensus بر ترتیب/State مشترک لازم است؟Signed event stream/attestation
Governance، membership و dispute process داریم؟Ledger فقط اختلاف را دائمی می‌کند
Privacy/erasure/retention با replication سازگار است؟On-chain storage نامناسب
Oracle ورود داده قابل‌اعتماد است؟Hash، داده غلط را درست نمی‌کند
TCO/latency/operations/exit پذیرفته است؟راه‌حل ساده‌تر
Verifier Artifact اصلی را دارد؟Hash تنها Evidence را بازسازی نمی‌کند

Hash timestamped چه چیزی را ثابت می‌کند؟

می‌تواند پشتیبانی کندبه‌تنهایی ثابت نمی‌کند
Bytes ارائه‌شده با Commitment برابرندBytes هنگام Capture درست/کامل بودند
Commitment تا زمان مشخص وجود داشتهEvent واقعاً در همان زمان رخ داده
رکورد On-chain طبق Protocol تغییر نکردهStorage/Key/Client/Oracle خارج Chain امن بود
Signer/Account تراکنش را امضا کردهرضایت/Authority/قصد انسانی معتبر بوده
Participantها State را پذیرفته‌اندانطباق ISO/GDPR/قانون یا کیفیت محصول
ترتیب Ledger قابل‌بررسی استSingle source of truth جهان بیرون

Crowdsourced bug bounty را Contract خودکار داوری نمی‌کند

Validity، Severity، Duplicate، Scope، Safe harbor، Disclosure و Reproduction غالباً نیاز به Context انسانی دارند. Smart Contract فقط می‌تواند Escrow/Payment را پس از یک Oracle/Authority تصمیم‌گیر اجرا کند؛ خودش حقیقت Bug را از Report متن آزاد تشخیص نمی‌دهد. Payment واقعی، تحریم، مالیات، ارز، هویت و dispute نیز مسائل حقوقی/مالی جدا هستند. این مقاله توصیه ساخت پلتفرم Bounty یا پرداخت رمزارزی نیست.

Privacy و حق حذف؛ Public ledger انبار داده آزمایش نیست

PII، ایمیل، شماره موبایل، IP، شناسه دستگاه، سند، Screenshot، Log خام، Prompt، کلید، Seed، Token دسترسی و Evidence کامل را روی Chain عمومی ننویسید. Replication و Permanence با Data minimization، Retention و Erasure tension ایجاد می‌کند. Hashکردن داده کم‌آنتروپی مانند شماره موبایل، آن را لزوماً ناشناس نمی‌کند؛ مهاجم می‌تواند فضای کوچک ورودی را حدس بزند. Salt/Keyed commitment نیز باید Threat model، custody و rotation داشته باشد.

ریسکتست لازمکنترل ترجیحی
Linkability تراکنش‌هاآیا Address، زمان و Amount کاربر را قابل‌پیوند می‌کند؟Pseudonymous را Anonymous ننامید؛ Metadata را کم کنید
Low-entropy hashDictionary attack با داده مصنوعیداده را On-chain نگذارید؛ keyed commitment محدود
Deletion requestحذف Off-chain و باقی‌ماندن Commitment چه افشا می‌کند؟Retention map و tombstone بدون PII
Event leakageABI/Eventها Secret یا Business detail نشت می‌دهند؟Minimal event schema
Explorer/indexer copiesداده در Replicaها و cacheها چقدر ماندگار است؟فرض کنید Public data قابل‌پس‌گرفتن نیست
Test data reuseآیا Production snapshot/real wallet وارد Test شده؟Synthetic data و egress guard

ارزیابی حریم خصوصی و قوانین محل فعالیت باید توسط نقش‌های مسئول انجام شود؛ این متن نظر حقوقی نیست. تست فقط نشان می‌دهد Control طراحی‌شده در Scenario مشخص چگونه رفتار کرده است.

Compliance؛ Ledger یک جزء Evidence است، نه گواهی انطباق

رکورد On-chain نه ISO، نه Privacy law، نه Financial regulation و نه Audit readiness را خودکار تأمین می‌کند. Auditor هنوز باید Scope، Control objective، مالک، approval، population، sampling، exception و remediation را ببیند. برای ارائه خوانا و قابل‌ردیابی نتایج، الگوی داشبورد و شواهد نتایج تست را نیز در نظر بگیرید؛ Hash جای Evidence package را نمی‌گیرد.

Minimum evidence manifest
system/release/environment/chain/client/compiler/proxy identities
requirement-risk-control-test-case mapping + owner/approver
synthetic input fixture and deterministic seed
transaction hash + chainId + blockHash + logIndex + finality policy
raw receipt/log/trace when permitted + canonicality verification time
contract address/bytecode/ABI/storage layout/role/oracle/bridge versions
expected/actual/oracle/verdict + uncertainty and known limitations
artifact digest/signature/storage URI/retention/access log
exceptions/reruns/manual interventions/remediation links
privacy classification/redaction/deletion and independent review

Monitoring؛ Finalized سبز به‌تنهایی کافی نیست

سطحSignalهای کلیدیهشدار معنادار
Chain/Nodehead/safe/finalized، sync، peers، client/version، reorg depthFinality lag یا اختلاف canonical head
RPClatency/error/rate limit، method coverage، endpoint disagreementQuorum read اختلاف دارد یا archive query ناقص است
Transactionpending age، replacement، drop، revert reason، inclusion/finalityAge نسبت به SLO، نه هر Pending کوتاه
Contractpaused، role/admin change، upgrade، invariant sentinelتغییر Authority یا Implementation خارج Change window
Oracle/Bridgefreshness، deviation، signer/source quorum، queue/backlogStale/disagree/pending beyond protocol timeout
Indexercursor، block/hash continuity، removed logs، lag/backfillGap، duplicate effect یا cursor روی Fork قدیمی
Off-chainreconciliation mismatch، outbox/queue، business statusFinalized effect بدون DB یا DB effect بدون canonical log
Signer/Keyavailability، deny/audit، nonce، rotation/expiryPolicy violation یا unexplained signing burst
Cost/Capacitygas/fee، state/log growth، disk/CPU/networkBudget burn یا headroom کمتر از Release contract

Dashboard باید Network و Finality policy را روی هر عدد نمایش دهد. «موفقیت ۹۹٪» بدون Denominator، status boundary و بازه زمانی قابل‌تفسیر نیست. Synthetic probe هم باید با Account/Amount علامت‌گذاری‌شده اجرا شود تا به‌اشتباه Business transaction حساب نشود.

Runbook رخداد Blockchain/dApp

  1. Declare و Scope: Chain، Contract، Proxy implementation، Wallet/RPC، Oracle/Bridge، Indexer و Business effect آسیب‌دیده را مشخص کنید.
  2. حفظ شواهد: head/safe/finalized، block/hash، receipt/log/trace، removed flag، RPC responses، deployment/role/oracle/admin state، cursor و Timeline را Append-only ثبت کنید.
  3. Contain: اگر اختیار و Runbook تأییدشده وجود دارد، UI write یا Route معیوب را محدود کنید؛ Pause/Key revoke/Provider switch خودشان ریسک و approval دارند.
  4. Classify: Chain/consensus، RPC/provider، contract، upgrade، signer/key، wallet، oracle، bridge، indexer، backend یا presentation را با Probe مستقل تفکیک کنید.
  5. Canonical reconcile: Range محدود را از checkpoint معتبر replay و provisional/removed/finalized را جدا کنید؛ داده Unknown را Success/Failure حدس نزنید.
  6. Recover: مسیر repair، compensation، retry، upgrade یا rollback فقط با governance، idempotency و dry run اجرا شود.
  7. Verify: Invariantها، access، transaction lifecycle، reorg، reconciliation و monitoring را در محیط متناظر دوباره آزمایش کنید.
  8. Communicate: Network/asset/status/impact و uncertainty را بدون وعده Finality یا Recovery نادرست بیان کنید.
  9. Learn: Detection gap، authority، blast radius، test escape، زمان بازیابی و Action owner/due date را ثبت کنید.

Rollback در Blockchain معادل پاک‌کردن History نیست. Upgrade یا قرارداد جایگزین ممکن است رفتار آینده را عوض کند، اما Effect گذشته، دارایی، Event و Replicaهای Off-chain نیازمند Migration/Compensation صریح‌اند.

Release Gate؛ چه چیزی باید مانع انتشار شود؟

Gateشاهد عبورنمونه Stop condition
Identity/Buildsource→compiler→bytecode→address/proxy traceablebytecode یا storage layout نامعلوم
Invariant/Stateexample + property/fuzz/stateful suitesنقض conservation/authorization
Security/Accessthreat tests، static/dynamic/manual reviewcritical open finding یا admin bypass
Transactionrevert/drop/replace/reorg/finality pathsSuccess UI قبل از policy finality
Wallet/Intentchain/domain/function/value simulationsigning ambiguity یا wrong-chain path
RPC/Indexerprovider fault + rewind/replay/idempotencyduplicate business effect یا gap repair نامشخص
Oracle/Bridgestale/deviation/quorum/pause/recoveryfail-open ناخواسته یا double completion
Upgrade/Governancestorage/access/timelock/migration rehearsalstate corruption یا unowned emergency action
Reconciliationzero unexplained mismatch در bounded rangefinalized vs ledger discrepancy بی‌مالک
Performance/Costworkload-defined tail latency/gas/headroomSLO یا cost budget نقض‌شده
Operationsalert، runbook، drill، key recovery و exitcritical alert بی‌مالک یا recovery آزموده‌نشده
Evidence/Privacymanifest، retention، redaction، approvalssecret/PII در Chain یا artifact عمومی

Gate باید Risk-based، از پیش توافق‌شده و دارای Exception owner/expiry باشد. Audit یا Formal verification ارزشمند است اما اثبات نبود همه خطاها نیست؛ برای مرزبندی Proof و implementation، راهنمای روش‌های رسمی در تست نرم‌افزار را ببینید.

نقش‌ها و Decision rightها

نقشمالک تصمیمشاهد لازم
Product/BusinessState و Finality قابل‌قبول برای اثر کسب‌وکارstate model، compensation و user wording
Protocol/Contract engineerInvariant، ABI/Event، upgrade/storagespec، deployment manifest و migration
QA/Test architectRisk model، environment، oracle و coveragetraceability، test result و limitations
SecurityThreat، finding severity و key/signing controlsreview، retest و accepted residual risk
Platform/SRENode/RPC/indexer، SLO، alert و recoverytelemetry، capacity، drill و runbook
Data/BackendIndexer cursor، schema و reconciliationcontinuity، idempotency و mismatch report
Governance/Operationsadmin، pause، upgrade، oracle/bridge و incident actionmultisig/timelock/approval audit
Privacy/Compliance/Legaldata classification، retention و jurisdictional assessmentreview و exception؛ نه صرفاً Chain record
Release ownerGo/No-go و exception expiryGate summary و sign-offهای مستقل

یک نفر نباید هم Contract را Deploy کند، هم Oracle تست را تعریف کند و هم نتیجه را بدون Review تأیید کند. برای Emergency action نیز نام فرد کافی نیست: Threshold، جانشین، زمان پاسخ، Scope اختیار و مسیر Audit باید قبل از Incident تمرین شوند.

برنامه ۳۰روزه برای ساخت Baseline تست dApp

بازهخروجیExit criteria
روز ۱–۵Chain/Trust contract، component map، asset/role/invariant و transaction state modelNetwork/finality و Business effects مبهم نیست
روز ۶–۱۰Local deterministic environment، deployment identity، unit/property/stateful suitesReset/reproduce و seed/artifact ممکن است
روز ۱۱–۱۵Wallet/RPC fault، revert/replace/reorg، event indexer replayهیچ Duplicate business effect و silent gap نداریم
روز ۱۶–۲۰Oracle/Bridge/upgrade/access/security scenariosStale/failover/pause/migration authority روشن است
روز ۲۱–۲۵Workload performance، gas/cost، off-chain reconciliation و privacy reviewSLO/budget/retention با Denominator تأیید شده
روز ۲۶–۳۰Monitoring، incident drill، release gate و signed evidence manifestGo/No-go simulation و Action owner/due date ثبت شده

این برنامه نسخه تضمینی یا زمان‌بندی همه پروژه‌ها نیست. دامنه یک Contract/Flow پرریسک را انتخاب کنید، Baseline را بسازید و فقط پس از مشاهده Gapها Scale دهید. معیار موفقیت «تعداد تست» نیست؛ کاهش حالت Unknown، قابلیت بازسازی Failure و جلوگیری از اثر تکراری/گم‌شده است.

۲۰ ضدالگوی رایج در Blockchain Testing

  1. یکی‌دانستن Broadcast، Inclusion و Finality.
  2. نمایش Success فقط با داشتن Tx hash.
  3. شمردن هر Event delivery به‌عنوان Business effect جدید.
  4. نادیده‌گرفتن removed=true و Block hash در Indexer.
  5. استفاده از Tx hash به‌عنوان تنها Business idempotency key.
  6. تست فقط Happy path قرارداد و حذف Sequenceهای Stateful.
  7. اعتماد به Exampleها بدون Invariant و Boundary.
  8. نامیدن Fork محلی به‌عنوان رفتار واقعی Mainnet.
  9. گزارش TPS بدون workload، validity و Finality boundary.
  10. یکی‌دانستن Gas used، Fee و Performance.
  11. اعتماد به یک RPC endpoint به‌عنوان حقیقت مستقل.
  12. نادیده‌گرفتن Wallet intent، Chain ID و signing domain.
  13. تست Upgrade فقط با Deployشدن Implementation جدید.
  14. فرض اینکه Oracle/Bridge جزئی خارجی و خارج Scope است.
  15. Pause یا Admin key بدون drill، threshold و جانشین.
  16. قرار دادن PII، Secret یا Evidence خام روی Public chain.
  17. نامیدن Hash یا Immutability به‌عنوان اثبات صحت داده.
  18. فرض اینکه Audit یا Formal proof نبود همه Bugها را تضمین می‌کند.
  19. Repair با overwrite خاموش DB به‌جای reconciliation قابل‌ردیابی.
  20. اتصال محیط تست به Wallet، Asset، PSP یا Mainnet واقعی.

چک‌لیست نهایی تست بلاک‌چین و dApp

  • □ Chain ID، Protocol/client version و Finality policy ثبت شده است.
  • □ Trust boundary و Writer/Admin/Oracle/Bridge authority روشن است.
  • □ Asset، unit، decimals، conservation و authorization invariant داریم.
  • □ Source/compiler/bytecode/address/proxy/storage identity قابل‌ردیابی است.
  • □ Unit، integration، property/fuzz، stateful و manual security review ترکیب شده‌اند.
  • □ Pending، dropped، replaced، reverted، included، removed و finalized آزموده شده‌اند.
  • □ Wallet متن امضا، Domain، Chain، Contract، Function و Value درست نشان می‌دهد.
  • □ RPC timeout-after-submit و endpoint disagreement نتیجه Unknown ایمن دارند.
  • □ Event identity، duplicate delivery، rewind/replay و indexer gap پوشش داده شده‌اند.
  • □ Oracle stale/deviation/quorum/failure و recovery تست شده است.
  • □ Bridge source/destination/retry/replay/refund و double completion پوشش دارد.
  • □ Upgrade access، initializer، storage layout، event و rollback/exit rehearsal دارد.
  • □ Workload، tail latency، Finality، gas/fee و resource headroom تعریف شده‌اند.
  • □ Front-running/order/deadline/time assumptions صریح‌اند.
  • □ On-chain و Off-chain با checkpoint canonical Reconcile می‌شوند.
  • □ فارسی/RTL، Address، عدد، ریال/تومان و timezone گمراه‌کننده نیست.
  • □ Test data/keys/accounts مصنوعی‌اند و مسیر Production/Mainnet مسدود است.
  • □ PII/Secret/Evidence کامل On-chain یا عمومی نشده است.
  • □ Alert/Runbook/authority/incident drill و repair idempotent داریم.
  • □ Release gate، exception owner/expiry و evidence manifest تأیید شده‌اند.

جمع‌بندی؛ Oracle را از Chain تا کسب‌وکار دنبال کنید

کیفیت dApp از «تغییرناپذیری» یا سبزشدن Unit Test به‌دست نمی‌آید. تست بلاک‌چین زمانی قابل‌اتکاست که Network و Finality تعریف شده، تراکنش یک State machine باشد، Invariantهای قرارداد و دارایی سنجیده شوند، Wallet/RPC/Indexer خطاپذیر فرض شوند، Oracle/Bridge/Upgrade تحت Fault قرار گیرند و Effect نهایی با Ledger خارج Chain Reconcile شود. نتیجه باید دقیقاً بگوید در کدام Chain، Block، Build، State و محدودیت معتبر است.

از یک Flow پرریسک شروع کنید: Contract تست، State transition و Event identity را بنویسید؛ یک Reorg و timeout-after-submit قطعی بسازید؛ سپس Release gate و runbook را با Evidence قابل‌بازتولید تمرین کنید. این مسیر از ادعای کلی «Blockchain اعتماد می‌سازد» به سؤال مهندسی قابل‌آزمون می‌رسد: چه کسی، به کدام State، با کدام Finality و کدام Oracle اعتماد می‌کند؟

پرسش‌های متداول تست بلاک‌چین

۱. آیا Unit Test قرارداد هوشمند برای تست dApp کافی است؟

خیر. Unit Test منطق Function را سریع بررسی می‌کند، اما Wallet و امضا، RPC، lifecycle تراکنش، Reorg/Finality، Indexer، Oracle/Bridge، Upgrade و Reconciliation خارج Chain را پوشش نمی‌دهد. ترکیب تست‌های واحد، Integration، Property/Fuzz، Stateful، Security، Performance و Operational drill لازم است؛ دامنه ترکیب به Risk بستگی دارد.

۲. Confirmation و Finality چه تفاوتی دارند؟

Confirmation معمولاً عمق یا مشاهده Block پس از Inclusion است؛ Finality معنای Protocol-specific درباره احتمال/امکان بازگشت State دارد. عدد ثابت Confirmation را بدون نام Network، Protocol، Block tag و Risk policy «نهایی» ننامید. UI و Backend باید statusهای provisional و finalized را متمایز کنند.

۳. Reorg را چگونه تست کنیم؟

در Node/Devnet یا Harness قطعی، Log اولیه را provisional ingest کنید، همان Log را با block identity قدیمی removed کنید، شاخه canonical جدید را ingest و سپس Finality را اعمال کنید. انتظار این است که اثر موقت معکوس، Duplicate delivery بی‌اثر و اثر canonical فقط یک‌بار ثبت شود. شبیه‌سازی Local اثبات احتمال یا عمق Reorg شبکه واقعی نیست.

۴. بهترین ابزار Blockchain Testing کدام است؟

ابزار واحدی بهترین نیست. Runner قرارداد، local node/devnet، property fuzzer، static analyzer، Wallet/RPC stub، indexer replay harness، load generator و observability هرکدام Oracle متفاوتی می‌دهند. ابتدا Chain/Threat contract و Failure موردنظر را تعریف کنید، سپس ابزاری انتخاب کنید که همان State و Evidence را به‌صورت تکرارپذیر کنترل کند.

۵. آیا ثبت نتیجه تست روی Blockchain اعتماد کامل ایجاد می‌کند؟

خیر. Commitment می‌تواند تطابق Bytes و وجود یک رکورد را پشتیبانی کند، اما صحت Capture، کامل‌بودن Evidence، صلاحیت Signer، کیفیت Oracle، حریم خصوصی یا انطباق را تضمین نمی‌کند. برای بیشتر تیم‌ها signed manifest و storage دارای Object lock/access audit ساده‌تر است؛ Blockchain فقط با مسئله واقعی چند Writer مستقل و Governance روشن توجیه می‌شود.

دیدگاهتان را بنویسید