This guide explains how to independently verify the ownership and cryptocurrency balances of wallet addresses published by OKX in their Proof of Reserves (PoR) reports. By using OKX's open-source verification tools and publicly available snapshot data, you can confirm that the exchange holds the assets it claims.
Understanding Proof of Reserves Verification
Proof of Reserves is a method for cryptocurrency exchanges to provide transparency to their users. It cryptographically proves that the exchange holds sufficient reserves to cover all customer balances.
The process involves two main components:
- Ownership Verification: Confirming that the exchange controls the private keys for the published wallet addresses.
- Balance Verification: Confirming that the on-chain balances of those addresses, at a specific point in time (block height), match the amounts published in the report.
This independent audit helps build trust by ensuring the exchange's solvency.
Pre-Verification Setup
Before you begin the verification process, you need to gather the necessary tools and data.
- Download the Verification Tool: Obtain the latest version of the open-source Proof of Reserves verification toolkit from the official OKX GitHub repository.
- Download the Proof of Reserves File: Acquire the latest Merkle Tree Proof of Reserves snapshot file from the OKX website. This CSV file contains the addresses, balances, and cryptographic signatures.
- Organize Your Files: Place both the downloaded verification tool (unzipped) and the PoR snapshot file in the same directory on your computer for easier terminal navigation.
👉 Access the latest verification tools and resources
Verifying Wallet Address Ownership
OKX's snapshot data includes addresses, a signed message ("I am an OKX address"), and signatures. For Bitcoin, it also includes multisig redeem scripts. Verifying these signatures proves OKX controls the private keys.
Cryptographic Methods by Asset Type
- Bitcoin (BTC) Wallets: OKX uses both single-signature and multi-signature (2-of-3) addresses. The data includes two signatures, proving control of at least two of the three private keys required for the multisig addresses.
- Ethereum (ETH) and USDT Wallets: Ownership is proven by verifying the message and its corresponding cryptographic signature for each address.
Using the Official Verification Tool
You can use OKX's open-source tool to automate the ownership verification process.
- Open a Terminal: Launch Terminal on macOS or Command Prompt (CMD) on Windows.
- Navigate to the Directory: Use the cdcommand to change to the directory where you stored the tool and snapshot file (e.g.,cd ~/Downloads/proof-of-reserves).
- Run the Command: - macOS: ./VerifyAddress --por_csv_filename=okx_por_YYYYMMDD.csv
- Windows: VerifyAddress.exe --por_csv_filename=okx_por_YYYYMMDD.csv
 ReplaceYYYYMMDDwith the actual date on your snapshot file.
 
- macOS: 
- Review the Output: A successful verification will return a message like "Verify address signature end, all address passed."
Note: On macOS, you may need to grant permission to run the tool in System Preferences > Security & Privacy.
Using Third-Party Tools for Verification
For manual verification, you can use third-party tools to validate the signatures.
- BTC Single-Signature Addresses: Use a Bitcoin message verification website. Copy the address, message, and signature from the PoR file into the tool to confirm.
- EVM Chains (ETH, USDT-ERC20): Use an Ethereum message signing verification tool.
- TRON (TRX) Chain Addresses: Use a TRON-compatible signature verification tool.
Verifying ETH Staking Asset Ownership
For Ethereum validator keys published in the PoR, you can use a block explorer to verify ownership.
- Copy a Validator Public Key: From the PoR file, copy a validator's public key address.
- Use a Beacon Chain Explorer: Navigate to a Ethereum Beacon Chain block explorer (like Beaconchain).
- Paste the Public Key: Search for the validator using its public key.
- Verify Deposit Information: Check the "From address" and "Recipient address" for the validator's initial deposit transaction. You can then verify the ownership of these Ethereum addresses using the message signing method described above.
Verifying Wallet Address Balances
This process involves comparing the on-chain balances of addresses at a specific block height against the balances published in OKX's snapshot file. You can verify a single address or the total balance for an entire asset.
General Balance Verification Steps
The core process involves configuring the tool to fetch data from a blockchain node.
- Configure a Data Source: The tool needs to connect to a blockchain node to retrieve historical balance data. This is done by editing the - rpc.jsonfile included in the tool package. You can configure:- A local node you have running (e.g., Bitcoin Core in archive mode).
- A third-party node service provider (e.g., Infura, Alchemy for EVM chains).
- OKLink's Open API (requires a free API key).
 
- Run the CheckBalance Tool: Use the terminal to execute commands for either single-address or total-balance verification.
Verifying BTC Balances
Verifying Bitcoin balances requires querying a node at the exact block height of the snapshot.
Step 1: Set Up a Bitcoin Node (Optional)
You can install and sync Bitcoin Core. After syncing to the latest block, you must roll it back to the precise snapshot height listed in the PoR file using the invalidateblock command with the hash of the block after the snapshot.
Step 2: Configure RPC Settings
Edit the rpc.json file to point to your local node's RPC interface or another data source.
Step 3: Execute the Verification Command
- Single Address:./CheckBalance --mode="single_address" --coin_name="btc" --address="[BTC Address]" --por_csv_filename=okx_por_YYYYMMDD.csv
- Total BTC Balance:./CheckBalance --mode="single_coin_total_balance" --coin_name="btc" --por_csv_filename=okx_por_YYYYMMDD.csv
Verifying EVM Chain Balances (ETH, USDT)
The process for Ethereum and its layer-2 networks (Arbitrum, Optimism) and sidechains (Polygon, Avalanche) is similar.
- Configure RPC: Update the rpc.jsonfile with endpoints for the chains you wish to verify. You can use services like Infura or Alchemy, which offer archive node access.
- Run the Command: - Single Address (e.g., ETH):./CheckBalance --mode="single_address" --coin_name="eth" --address="0x..." --por_csv_filename=okx_por_YYYYMMDD.csv
- Total Balance (e.g., USDT on Arbitrum):./CheckBalance --mode="single_coin_total_balance" --coin_name="USDT-ARBITRUM" --por_csv_filename=okx_por_YYYYMMDD.csv
 
- Single Address (e.g., ETH):
The tool supports various assets including ETH, ETH-ARBITRUM, ETH-OPTIMISM, USDT-ERC20, USDT-TRC20, USDT-POLY, USDT-AVAXC, USDT-ARBITRUM, and USDT-OPTIMISM.
👉 Explore detailed chain-specific verification methods
Frequently Asked Questions
What is Proof of Reserves (PoR) and why is it important?
Proof of Reserves is an auditing practice that uses cryptographic proofs to verify a cryptocurrency exchange holds enough assets to cover all customer deposits. It's crucial for user trust as it provides transparent evidence of solvency, reducing the risk of fractional reserve practices or insolvency.
Do I need technical expertise to perform these verifications?
Yes, a moderate level of technical comfort is required, particularly with using command-line terminals and potentially configuring blockchain nodes. While the open-source tools simplify the process, following the step-by-step instructions is necessary for accurate results.
What if I don't want to run a full blockchain node?
You don't have to. The verification tool can be configured to use third-party services like Infura, Alchemy, or OKLink's API to fetch the necessary blockchain data. This avoids the lengthy process of syncing a local node.
How often does OKX publish new Proof of Reserves data?
OKX regularly publishes updated Merkle Tree Proof of Reserves reports. It's best practice to check their official transparency page for the most recent snapshot file to ensure you are verifying the latest data.
What does it mean if the verification check fails?
First, double-check that you are using the correct snapshot file and have configured your RPC settings properly. Ensure your node or API provider has access to archival data at the exact block height specified. If the problem persists with correct setup, it may indicate a discrepancy that should be reported.
Can I verify assets on networks like Polygon or Arbitrum?
Absolutely. The verification process supports multiple Ethereum Virtual Machine (EVM) compatible chains, including Polygon, Arbitrum, Optimism, and Avalanche. You simply need to configure the correct RPC endpoint for each chain in the rpc.json file and use the appropriate coin_name in the command.