Latency: ~10-minute block times
Execution depends on Bitcoin block confirmation. Unlike Ethereum (which targets ~12-second blocks), Bitcoin targets ~10 minutes per block. This means:- Contract calls are not instantaneous
- Users should expect multi-minute delays between submitting an action and seeing its effect
- You cannot build synchronous, sub-second UX flows on top of BRC2.0 directly
No synchronous Bitcoin state queries
Contracts cannot query Bitcoin state in real time. All operations are based on indexed, confirmed inscriptions. This means:- You cannot read a UTXO balance or check a Bitcoin transaction within a contract call as if it were a synchronous RPC call
- Any logic that depends on Bitcoin state must work from data that was already indexed and included in a prior inscription
Indexer determinism requirements
Contract state is reconstructed by deterministic replay of inscriptions in order. Every compliant indexer that processes the same Bitcoin history must arrive at identical contract state. For you as a developer, this means:- Contracts must not produce non-deterministic outputs (no randomness from block hashes, timestamps, or external inputs that vary between replays)
- Execution order is strictly sequential — there is no out-of-order or parallel execution
- Reorgs cause execution to be replayed from the reorg point; your contract logic must be safe to re-execute
This is conceptually similar to Ethereum replay tests, but the underlying ordering chain is Bitcoin. If your contract behaves correctly under Ethereum replay conditions (deterministic, no side effects from execution order), it will behave correctly here.
block.timestamp unreliability
block.timestamp in BRC2.0 reflects Bitcoin block timestamps. Bitcoin miners have latitude to set block timestamps within a range (subject to consensus rules), making them less reliable than Ethereum block timestamps for precision timing.
No msg.value in native ETH
There is no native ETH in BRC2.0. The system operates on BRC-20 tokens, not ETH. This means:msg.valueis always zero- Payable functions that expect ETH will not receive it
- Native ETH transfers between contracts are not supported
ecrecover is not usable
EVM addresses in BRC2.0 are derived from Bitcoin pkscripts and have no associated ECDSA private keys.ecrecover cannot be used for authentication.
No EVM mempool
There is no EVM mempool. Transactions cannot be submitted to a peer-to-peer EVM network, monitored in a pending state, or replaced using EIP-1559-style replacement.- There is no
eth_sendRawTransaction - There is no “pending” transaction state to query
- Transaction replacement (speed-up, cancel) works through Bitcoin transaction replacement (RBF), not EVM mechanisms
tx.origin is unreliable
There is no concept of a user-controlled EOA originating a call chain.tx.origin does not represent a reliably user-controlled address.
Gas-price-based logic does not apply
There is no dynamic gas price, base fee, or priority fee. Contracts that use gas-price-based logic for anti-front-running, fee estimation, or dynamic pricing will not behave as intended.Limitations at a glance
| Limitation | Impact | Mitigation |
|---|---|---|
| ~10-minute block times | No fast finality | Design async UX with optimistic updates |
| No synchronous Bitcoin queries | Can’t read UTXOs in real time | Use pre-indexed inscription data |
| Indexer determinism | Must be deterministic, sequential | Avoid randomness and order-dependent logic |
block.timestamp unreliable | No sub-minute timing | Use coarse time windows only |
No msg.value / ETH | ETH transfers don’t work | Use BRC-20 token logic |
ecrecover unusable | Ethereum auth patterns break | Use BIP-322 precompile |
| No EVM mempool | No pending tx visibility | Interact through Bitcoin inscriptions |
tx.origin unreliable | Auth bypass risk | Use msg.sender + BIP-322 |
| No dynamic gas price | Gas-price logic breaks | Remove all tx.gasprice usage |