PepecoinArcade
@ Create a new account

Messaging: the node

docs/messaging/01-node.md

Jump to: Why testnet · The binary · Testnet next to mainnet · Chain rules the format relies on · Carriers · Testnet coins · Pitfalls when setting up nodes by hand · Platform differences

The Messenger runs on Pepecoin testnet, always. This page covers the node side: which binary, how the testnet node is configured next to the mainnet one, the chain rules the message format relies on, and how to get testnet coins. The message format itself is in 02-design.md.

Why testnet

Messaging is testnet-only as a product rule, enforced in code (require_messaging_network() in arcade/config.py refuses any other network). Tokens, NFTs and coins live on mainnet; messages, profiles and the feed live on testnet. One application talks to both nodes.

The format is still designed to mainnet standardness rules, so that it would relay anywhere: testnet sets fRequireStandard = false, and a format that only worked there would be silently unrelayable on a real network.

The binary

Pepecoin Core v1.1.0 (released 2024-12-18) is the current release, and the same binaries serve mainnet and testnet. Download and verification are described in ../00-node-setup.md. In short:

CheckExpected
SHA-256 (Linux x86_64)9d7ef948…f710b, matching SHA256SUMS.asc
GPG signatureGood, key 18250EC9 2E527E97 23E49116 FD415169 D2691927
Signerfingerprint matches contrib/gitian-keys/david2278-key.pgp in the Pepecoin repo
Binary ↔ sourcepepecoind reports v1.1.0.0-4fb5a0cd9, the v1.1.0 tag commit

Two caveats apply: the signing key expired 2026-01-02 (the signature predates expiry, so it is sound), and trust is single-channel (tarball, checksums, signature and key all come from the same GitHub organisation; the key is not on public keyservers).

Upstream ships builds for every platform the installer supports, so nothing needs to be built from source:

TargetAsset
Linux x86_64pepecoin-1.1.0-x86_64-linux-gnu.tar.gz
Linux aarch64pepecoin-1.1.0-aarch64-linux-gnu.tar.gz
Linux armhf (32-bit, e.g. Raspberry Pi)pepecoin-1.1.0-arm-linux-gnueabihf.tar.gz
Windows 64-bitpepecoin-1.1.0-win64.zip
macOSpepecoin-1.1.0-osx-unsigned.dmg

Testnet next to mainnet

The installer sets up both nodes side by side. Neither touches the other's data.

MainnetTestnet
Service (systemd user unit)pepecoind-mainnet.servicepepecoind-testnet.service
Datadir (Linux)~/.pepecoin~/.pepecoin-testnet
Configpepecoin.confpepecoin.conf with testnet=1
Runs asyouyou
P2P / RPC33874 / 3387344874 / 44873
ZMQ hashblock / rawblock / rawtx28332 / 28333 / 2833528432 / 28433 / 28435
RPC authcookiecookie
dbcache512 MiB512 MiB

Both nodes run as your own user because pepecoind always writes .cookie with mode 0600, and no group membership, -rpccookiefile path or POSIX ACL can share a 0600 file across users. Running as the same user as the application makes cookie authentication work with no stored password at all.

The testnet node needs its wallet enabled: it pays message fees.

Check it:

``bash systemctl --user status pepecoind-testnet pepecoin-cli -datadir=$HOME/.pepecoin-testnet getblockchaininfo pepecoin-cli -datadir=$HOME/.pepecoin-testnet getconnectioncount ``

Peers and sync

Both testnet DNS seeds are compiled into the binary (chainparams.cpp), so the node finds peers on its own over port 44874. Expect a small number of peers; testnet is a quiet network. The testnet chain is deeper than its activity suggests (well past 450,000 headers), so a first sync from scratch takes a few hours. Mainnet Pepecoin is a young, low-volume chain and syncs comfortably even on modest hardware.

The index bootstrap the installer downloads (see ../00-node-setup.md) covers the application's own index; the nodes still download and verify blocks themselves.

Chain rules the format relies on

All checked in the Pepecoin v1.1.0 source (commit 4fb5a0cd):

RuleValueSource
Dogecoin-derivedbanner: "Bitcoin Core, Dogecoin Core, and Pepecoin Core"binary
Testnet P2P / RPC ports44874 / 44873chainparams.cpp:282, chainparamsbase.cpp:48
Testnet addresses start with nPUBKEY_ADDRESS = 113chainparams.cpp
OP_RETURN script size≤ 83 bytes (MAX_OP_RETURN_RELAY), i.e. 80 bytes of datascript/standard.h:30
OP_RETURN outputs per standard txone (multi-op-return otherwise)policy/policy.cpp:115-119
Bare multisig relayedDEFAULT_PERMIT_BAREMULTISIG = true; x-of-3 is standardvalidation.h:143, policy/policy.cpp:41-48
Mainnet fRequireStandardtruechainparams.cpp:177
Testnet / regtest fRequireStandardfalsechainparams.cpp:309, :408
-acceptnonstdtxntoggles it; refused on mainnetinit.cpp:1057, :1059
Recommended min fee0.01 PEP/kB (RECOMMENDED_MIN_TX_FEE = COIN/100)policy/policy.h:23
Soft dust limit0.01 PEPpolicy/policy.h:70
Hard dust limit (standardness)0.001 PEP (DUST/10)policy/policy.h:81
Mempool ancestor / descendant limit25validation.h:74, :78

RPC names differ from modern Bitcoin Core: use signrawtransaction (not …withwallet) and validateaddress (not getaddressinfo). generate, generatetoaddress and fundrawtransaction all exist.

There are three dust thresholds, and the wallet's own floor (DEFAULT_DISCARD_THRESHOLD, 0.01 PEP) is the one that binds when funding through the node; see 02-design.md.

Carriers

Messages are not squeezed into 80-byte OP_RETURN outputs. The application already has a much larger carrier:

CarrierPayload bytes per transaction
Class C (OP_RETURN)72, after the 4-byte marker and 4-byte type header
Class B (bare multisig)7,646

Class B is standard on mainnet, so it is the primary carrier for messages; Class C is used for small records such as key announcements. Consequences:

Testnet coins

Every message is a transaction, so the testnet wallet needs coins.

From the arcade's faucet

A new account on an arcade is given a one-time gift of test coins so it can claim its name, post and message straight away. The faucet is testnet-only by default.

By mining

Testnet allows minimum-difficulty blocks, which makes CPU mining practical (pow.cpp:17-28):

``cpp bool AllowMinDifficultyForBlock(...) { if (!params.fPowAllowMinDifficultyBlocks) return false; if (pindexLast->nHeight < 1250) return false; // Allow a minimum-difficulty block if more than 2nTargetSpacing has elapsed return (pblock->GetBlockTime() > pindexLast->GetBlockTime() + params.nPowTargetSpacing2); } ``

HeightsRulesetMin-difficulty allowed
0–999baseyes
1000–1249digishieldno
1250–41,999minDifficultyyes
42,000–auxpowyes (inherited)

So at current heights, if testnet has been quiet for more than 120 seconds (2 × 60 s spacing), the next block may be mined at powLimit (0x00000fff…), roughly 2²⁰ expected Scrypt hashes. On a single CPU core that typically takes a few minutes.

The command-line tool wraps this:

``bash arcade-msg fund ``

It mines one block and stops. One block pays 10,000 PEP, enough for tens of thousands of messages. Coinbase maturity on testnet is 240 blocks, so mined coins become spendable about four hours later; mining more does not shorten that, because maturity is measured in chain height. Start it when you set up your key, not when you first want to send.

Pitfalls when setting up nodes by hand

Each of these is handled by the installer:

1. RestrictAddressFamilies must include AF_NETLINK, or libzmq aborts at startup. 2. -daemonwait does not exist in this 0.13/0.14-era codebase. Use Type=simple and run in the foreground. 3. The rpcauth HMAC uses the salt as the raw ASCII of the hex string, not decoded hex (httprpc.cpp:118). Getting this wrong yields a silent authentication failure. 4. .cookie is always mode 0600, so cookie auth only works if the client runs as the same user as the daemon. Choose the service user around that. 5. The signing key is expired and not on public keyservers. Fetch it from the source tree at the release tag. 6. Verify before executing: hash and signature, and stop on failure.

Platform differences

LinuxWindows
Service managersystemd user unitslogon tasks (no systemd)
Default datadir~/.pepecoin, ~/.pepecoin-testnet%APPDATA%\Pepecoin, %APPDATA%\Pepecoin-testnet
Binary location~/.local/bin%LOCALAPPDATA%\DogecoinArcade\bin

← all docs