Bitok is based on Bitcoin v0.3.19 (the last release by Satoshi) and finishes what was left undone: native privacy, full script opcodes, CPU mining, free transactions for real users. Security fixes and modern build compatibility included.
| Algorithm | BitokPoW (Yespower N=2048, r=32 key="BitokPow") |
| Block time | 10 minutes |
| Block reward | 50 BITOK |
| Halving | every 210,000 blocks |
| Max supply | 21,000,000 |
| Diff adjust | every 2016 blocks |
| Maturity | 100 blocks |
| P2P port | 18333 |
| RPC port | 8332 |
Native privacy: OK addresses
Stealth addresses built into the protocol. Sender derives a one-time address via ECDH using your published ok-address. Every payment lands at a unique address. On-chain unlinkability, no layer-2 required.
All opcodes enabled
OP_CAT, OP_MUL, OP_AND, OP_SUBSTR, OP_CHECKMULTISIG -- everything Satoshi wrote runs inside a bounded VM with strict limits.
Free transactions
Coins held ~1 day move at no cost. Satoshi's priority system, as designed.
CPU mining
BitokPoW is memory-hard (~128KB/hash). GPUs don't gain much. Anyone with a laptop can mine. Important: Bitok has bnProofOfWorkLimit(~uint256(0) >> 17).
| Windows | %APPDATA%\Bitok\ |
| Linux | ~/.bitokd/ |
| macOS | ~/Library/Application Support/Bitok/ |
Checkpoints added as the chain grows. Time warp protection active. Value overflow protection, DoS limits, anchor connections, network group diversity.
Back up your wallet.dat. If you lose it, the coins are gone. There is no recovery.
DNS seeds:
MIT. Same as original Bitcoin.
-- Tom Elvis Jedusor
| PRIVACY.md | Native stealth addresses (OK addresses): ECDH protocol, scanning, change keys |
| SCRIPT_EXEC.md | Script execution rules, limits, separated evaluation |
| FEES.md | Priority-based fee policy |
| SECURITY_FIXES.md | Security hardening details |
| RPC_API.md | Complete JSON-RPC reference |
| BITOKPOW.md | Yespower algorithm details |
| RAW_TRANSACTIONS.md | Multisig and signing workflows |
| SCRIPT_DEV.md | Script development guide |
| POOL_INTEGRATION.md | Mining pool integration guide |
| BUILD_UNIX.md | Linux/Unix build instructions |
| BUILD_MACOS.md | macOS build instructions |
| BUILD_WINDOWS.md | Windows build instructions |
Native protocol-level privacy. Every payment to an ok-address creates a unique one-time on-chain address. Nobody watching the blockchain can link payments to you -- even if your OK address is public.
This is not a layer-2. Not a proposal. Implemented in the Bitok core, today.
Sender side
Receiver scans
| Prefix | ok (version 0x01, Base58Check) |
| Scan pubkey | 33 bytes (compressed secp256k1) |
| Spend pubkey | 33 bytes (compressed secp256k1) |
| Total length | ~95 characters |
| TX overhead | 34-byte OP_RETURN output |
Key roles
Scan key -- detects incoming payments. Can be shared with a watch-only service (no spending ability).
Spend key -- derives the private key for each payment. Never leaves your wallet.
Change privacy
Change outputs also use stealth addresses. Change keys are derived deterministically from your spend secret -- recoverable from a single backup.
Receiver unlinkability -- all payments to one OK address appear as unrelated on-chain addresses. An observer cannot connect them.
No address reuse -- every payment lands at a unique address. Structurally impossible to reuse.
Sender privacy -- ephemeral key is fresh per transaction. Reveals nothing about sender.
Watch-only scanning -- give scan key to a service to detect payments without spending ability.
Network-level: your node IP is visible to peers when broadcasting. On-chain only. Dandelion++ planned.
| Address reuse | visible / impossible |
| Payment linkable | yes / no |
| Publish publicly | risky / safe |
| TX overhead | none / 34 bytes |
| Full node needed | no / yes (to scan) |
| getnewstealthaddress [label] | generate new OK address, stored in wallet |
| liststealthaddresses [show_secrets] | list all OK addresses, optionally show keys |
| sendtoaddress "ok..." amount | auto-detects OK address, performs full ECDH + OP_RETURN |
| decodestealthaddress "ok..." | show scan/spend pubkeys from address |
| dumpprivkey "ok..." | export stealth secret for backup |
| importprivkey "secret" [label] | import stealth secret + full rescan |
| scanstealthchangekeys "scan_hex" | recover change keys after wallet restore |
GUI Wallet
Settings > Generate Coins. That's it.
Command Line
RPC Control
Install
bitok.conf
Run
Sequential memory init + random access + SIMD (SSE2/AVX/AVX2/AVX512 auto-detected). GPUs: high bandwidth but poor random-access latency. 250-350W for ~2-3x improvement over a 50-100W CPU.
August 2010: Bitcoin Core disabled most scripting opcodes. Bitok keeps every opcode in a bounded VM.
| Max script size | 10,000 bytes |
| Max stack depth | 1,000 items |
| Max element size | 520 bytes |
| Max opcodes/script | 201 |
| Max sigops/block | 20,000 |
| Max multisig keys | 20 |
OP_CAT -- concatenation, covenant patterns
OP_MUL OP_DIV OP_MOD OP_LSHIFT OP_RSHIFT -- arithmetic
OP_AND OP_OR OP_XOR OP_INVERT -- bitwise logic
OP_SUBSTR OP_LEFT OP_RIGHT -- string manipulation
OP_CHECKMULTISIG -- bare m-of-n, standard relay
OP_RETURN -- provably unspendable (bug fixed)
Strict DER + low-S signatures. Separated evaluation (scriptSig can't manipulate scriptPubKey). Minimal push encoding. SIGHASH_SINGLE fix. CHECKMULTISIG NULLDUMMY enforced. Any well-formed script up to 10KB is standard and relayable.
JSON-RPC 1.0 over HTTP POST. Port 8332, localhost only, HTTP Basic Auth.
| getinfo | node status, balance, connections |
| getblockcount | chain height |
| getblockhash <n> | hash at height |
| getblock <hash> | block details |
| getblockheader <hash> | header only |
| getbestblockhash | tip hash |
| getdifficulty | current difficulty |
| getbalance | total balance |
| getnewaddress [label] | new receive address |
| sendtoaddress <addr> <amt> | send (auto-handles OK addresses) |
| listtransactions [n] | recent wallet txs |
| listunspent | UTXOs |
| dumpprivkey <addr> | export key or stealth secret |
| importprivkey <wif> | import key or stealth secret + rescan |
| getnewstealthaddress [label] | generate ok-address |
| liststealthaddresses [true] | list OK addresses |
| decodestealthaddress <ok> | show scan/spend pubkeys |
| scanstealthchangekeys <hex> | recover change keys after restore |
| getconnectioncount | peer count |
| getpeerinfo | connected peers |
| addnode <ip> add|remove | manage peers |
| stop | graceful shutdown |
| gettransaction <txid> | wallet tx details |
| getrawtransaction <txid> [1] | raw hex or JSON |
| createrawtransaction | build unsigned tx |
| signrawtransaction <hex> | sign with wallet keys |
| sendrawtransaction <hex> | broadcast to network |
| decodescript <hex> | analyze script |
| setgenerate <bool> [n] | enable/disable mining |
| getgenerate | mining status |
| getmininginfo | hashrate, difficulty |
| getblocktemplate | BIP 22 template |
| submitblock <hex> | submit mined block |
| getwork | legacy mining |
Full reference: RPC_API.md
Complete reference for writing, testing, and deploying custom script contracts on Bitok. Script execution activated at block 18,000.
All original opcodes enabled -- OP_CAT, OP_MUL, OP_DIV, OP_AND, OP_OR, OP_LSHIFT, OP_SUBSTR, OP_INVERT, OP_XOR, OP_MOD, OP_RSHIFT, OP_LEFT, OP_RIGHT, OP_2MUL, OP_2DIV
Bounded execution with deterministic limits
Separated evaluation -- scriptSig is push-only, scriptPubKey runs all logic
nLockTime (block height or Unix timestamp gating)
All six sighash types: ALL, NONE, SINGLE + ANYONECANPAY variants
Permissive standardness -- any parseable script relayed post-activation
Full raw transaction RPC toolkit (buildscript, validatescript, verifyscriptpair)
No P2SH (no BIP16, no redeemScript, no script-hash addresses)
No SegWit (no witness data, no bech32)
No OP_CHECKLOCKTIMEVERIFY -- use nLockTime on the transaction itself
No OP_CHECKSEQUENCEVERIFY (no relative timelocks)
No Taproot, no Schnorr signatures
No post-2010 Bitcoin soft forks
What you write in scriptPubKey is executed directly -- no P2SH wrapping, no witness program.
Separated evaluation (post block 18,000):
scriptSig can only push data. OP_DUP, OP_ADD etc. in scriptSig = fail. All logic goes in scriptPubKey.
False: empty byte vector, all-zero bytes, or negative-zero (0x80 suffix). Everything else is true.
| Script size | 10,000 bytes |
| Stack + altstack | 1,000 elements combined |
| Element size | 520 bytes |
| Opcodes/script | 201 non-push |
| Numeric operand | 4 bytes max |
| Shift amount | 0-31 only |
| Multisig keys | 20 max |
| Sigops/block | 20,000 |
| Dust threshold | 0.01 BITOK |
| Fee per KB | 0.01 BITOK |
Little-endian signed magnitude. High bit of the last byte is the sign bit. Maximum 4 bytes. Minimal encoding enforced.
| buildscript '["OP_ADD","OP_5","OP_EQUAL"]' | assemble script from opcode names + hex data -- returns hex, asm, type, withinLimits |
| validatescript <hex> '["03","02"]' | sandbox test: load stack (first=bottom, last=top), run scriptPubKey, check result |
| verifyscriptpair <tx_hex> <idx> <spk_hex> | full consensus verify with real tx context -- the only way to test OP_CHECKSIG |
| analyzescript <hex> | deep static analysis: opcodes by category, sigops, limit usage, type |
| decodescript <hex> | disassemble + classify; returns asm, type, reqSigs, addresses |
| setscriptsig <tx> <idx> <scriptsig> | inject scriptSig into unsigned tx -- array ["03","02"] or raw hex |
| getscriptsighash <tx> <idx> <spk> [type] | get 32-byte digest for manual/offline signing |
| createmultisig <m> '["pub1","pub2"]' | build m-of-n script; max 20 keys |
| addpreimage <hex> | register preimage; enables auto-sign for hashlock outputs in signrawtransaction |
| decodescriptsig <sig_hex> <spk_hex> | label each push element by role (signature, pubkey, preimage...) |
Arithmetic puzzle
Hashlock + signature
OP_CAT covenant
IF/ELSE branch
Time-locked payment
2-of-2 multisig
| ALL (0x01) | All inputs + all outputs |
| NONE (0x02) | This input only; no outputs committed |
| SINGLE (0x03) | This input + output at same index |
| ALL|ANYONECANPAY (0x81) | Only this input; all outputs |
| NONE|ACP (0x82) | Only this input; no outputs |
| SINGLE|ACP (0x83) | Only this input; output at same index |
Bitok is Bitcoin v0.3.19 modernized for current toolchains. Compiles on Ubuntu 24.04 LTS, macOS 11+, and Windows via MinGW. Dependencies: GCC 11+, OpenSSL 3.x, Berkeley DB 5.3, Boost 1.74+, wxWidgets 3.2 (optional, GUI only).
1. Install Dependencies
Core (required for daemon):
GUI wallet (optional):
2. Build
3. CPU Optimization
Default uses -march=native for your CPU. For distributable binaries:
4. Install
Data directory: ~/.bitokd/
1. Install Dependencies
Supports macOS 11.0+ on Apple Silicon (arm64) and Intel (x86_64).
2. Build
3. CPU Optimization
4. Install
Data directory: ~/Library/Application Support/Bitok/
Troubleshooting
1. Install Visual Studio
Visual Studio 2019 or newer. During install select the Desktop development with C++ workload.
2. Setup vcpkg
3. Install Dependencies
Daemon only:
GUI wallet (all daemon deps + wxWidgets):
4. Build
Open x64 Native Tools Command Prompt for VS from the Start menu:
Output: bitok.exe (GUI), bitokd.exe (daemon) Data: %APPDATA%\Bitok\
Troubleshooting
Berkeley DB wallet format
vcpkg provides BDB 4.8 -- different from Linux builds (BDB 5.3). If migrating a wallet from another build, run recovery first:
wxWidgets version mismatch
Check the installed version and update WX_VER in makefile.vc if needed:
Windows Defender may flag crypto software -- add a folder exclusion in Settings if needed.
Check logs: ~/.bitokd/debug.log Port used: 8333 (p2p), 8332 (rpc)
Config file locations:
| Linux | ~/.bitokd/bitok.conf |
| macOS | ~/Library/Application Support/Bitok/bitok.conf |
| Windows | %APPDATA%\Bitok\bitok.conf |
Secure it on Linux/macOS:
Example config:
INFORMATION
WALLET
MINING
CURL EXAMPLE