1"use strict";(globalThis.webpackChunkelastos_docs=globalThis.webpackChunkelastos_docs||[]).push([[5287],{62163(e,n,r){r.r(n),r.d(n,{assets:()=>o,contentTitle:()=>c,default:()=>a,frontMatter:()=>t,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"blockchain/nodes/configuration","title":"Node Configuration Reference","description":"Detailed configuration reference for all Elastos node components including ELA, ESC, EID, Arbiter, and Oracle services.","source":"@site/docs/blockchain/nodes/configuration.md","sourceDirName":"blockchain/nodes","slug":"/blockchain/nodes/configuration","permalink":"/blockchain/nodes/configuration","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":6,"frontMatter":{"type":"how-to","sidebar_position":6,"title":"Node Configuration Reference","description":"Detailed configuration reference for all Elastos node components including ELA, ESC, EID, Arbiter, and Oracle services.","chains":["all"],"keywords":["Elastos","World Computer","node","configuration","reference","settings","parameters"],"image":"/img/og-blockchain.jpg"},"sidebar":"blockchainSidebar","previous":{"title":"Elastos Council Operations","permalink":"/blockchain/nodes/elastos-council"},"next":{"title":"Port Reference","permalink":"/blockchain/nodes/ports"}}');var d=r(74848),i=r(28453);const t={type:"how-to",sidebar_position:6,title:"Node Configuration Reference",description:"Detailed configuration reference for all Elastos node components including ELA, ESC, EID, Arbiter, and Oracle services.",chains:["all"],keywords:["Elastos","World Computer","node","configuration","reference","settings","parameters"],image:"/img/og-blockchain.jpg"},c="Node Configuration Reference",o={},l=[{value:"Global Configuration",id:"global-configuration",level:2},{value:"ELA Main Chain Configuration",id:"ela-main-chain-configuration",level:2},{value:"ESC Configuration",id:"esc-configuration",level:2},{value:"RPC binding (<code>evm_rpc_bind</code>)",id:"rpc-binding-evm_rpc_bind",level:3},{value:"EID Configuration",id:"eid-configuration",level:2},{value:"Arbiter Configuration",id:"arbiter-configuration",level:2},{value:"Oracle Configuration",id:"oracle-configuration",level:2},{value:"Credential Files",id:"credential-files",level:2},{value:"RPC API Quick Reference",id:"rpc-api-quick-reference",level:2},{value:"ELA Main Chain RPC",id:"ela-main-chain-rpc",level:3},{value:"ESC/EID RPC (Standard Ethereum JSON-RPC)",id:"esceid-rpc-standard-ethereum-json-rpc",level:3},{value:"Arbiter RPC",id:"arbiter-rpc",level:3}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.header,{children:(0,d.jsx)(n.h1,{id:"node-configuration-reference",children:"Node Configuration Reference"})}),"\n",(0,d.jsx)(n.h2,{id:"global-configuration",children:"Global Configuration"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"File:"})," ",(0,d.jsx)(n.code,{children:"~/.config/elastos/node.json"})]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n "chain-type": "mainnet"\n}\n'})}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Field"}),(0,d.jsx)(n.th,{children:"Values"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsx)(n.tbody,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"chain-type"})}),(0,d.jsxs)(n.td,{children:[(0,d.jsx)(n.code,{children:"mainnet"}),", ",(0,d.jsx)(n.code,{children:"testnet"})]}),(0,d.jsxs)(n.td,{children:["Determines which network to connect to. Set during ",(0,d.jsx)(n.code,{children:"~/node/node.sh init"}),". Affects port ranges, seed nodes, genesis blocks, and download URLs."]})]})})]}),"\n",(0,d.jsxs)(n.p,{children:["This file is created by ",(0,d.jsx)(n.code,{children:"init_config()"})," the first time you run ",(0,d.jsx)(n.code,{children:"~/node/node.sh init"}),". Changing it after initialization has no effect; you must reinitialize components to switch networks."]}),"\n",(0,d.jsx)(n.h2,{id:"ela-main-chain-configuration",children:"ELA Main Chain Configuration"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"File:"})," ",(0,d.jsx)(n.code,{children:"~/node/ela/config.json"})]}),"\n",(0,d.jsxs)(n.p,{children:["Auto-generated during ",(0,d.jsx)(n.code,{children:"ela init"}),". The structure:"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n "Configuration": {\n "DPoSConfiguration": {\n "EnableArbiter": true,\n "IPAddress": "203.0.113.50"\n },\n "EnableRPC": true,\n "RpcConfiguration": {\n "User": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",\n "Pass": "q7r8s9t0u1v2w3x4y5z6a7b8c9d0e1f2",\n "WhiteIPList": ["127.0.0.1"]\n },\n "HttpRestPort": 20334,\n "HttpJsonPort": 20336,\n "NodePort": 20338,\n "PrintLevel": 1,\n "MaxLogsSize": 0,\n "MaxPerLogSize": 0,\n "MinCrossCh
1ainTxFee": 10000,\n "PowConfiguration": {\n "PayToAddr": "",\n "AutoMining": false,\n "MinerInfo": "ELA"\n }\n }\n}\n'})}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.strong,{children:"Key parameters:"})}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Parameter"}),(0,d.jsx)(n.th,{children:"Default"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"DPoSConfiguration.EnableArbiter"})}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"true"})}),(0,d.jsx)(n.td,{children:"Enable BPoS consensus participation"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"DPoSConfiguration.IPAddress"})}),(0,d.jsx)(n.td,{children:"Auto-detected"}),(0,d.jsx)(n.td,{children:"Your server's public IP address"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"EnableRPC"})}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"true"})}),(0,d.jsx)(n.td,{children:"Enable JSON-RPC interface"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"RpcConfiguration.User"})}),(0,d.jsx)(n.td,{children:"Random 32-char"}),(0,d.jsx)(n.td,{children:"RPC authentication username"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"RpcConfiguration.Pass"})}),(0,d.jsx)(n.td,{children:"Random 32-char"}),(0,d.jsx)(n.td,{children:"RPC authentication password"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"RpcConfiguration.WhiteIPList"})}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:'["127.0.0.1"]'})}),(0,d.jsx)(n.td,{children:"IP addresses allowed to access RPC"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"HttpRestPort"})}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"20334"})}),(0,d.jsx)(n.td,{children:"RESTful API port"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"HttpJsonPort"})}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"20336"})}),(0,d.jsx)(n.td,{children:"JSON-RPC port"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"NodePort"})}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"20338"})}),(0,d.jsx)(n.td,{children:"P2P network port"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"PrintLevel"})}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"1"})}),(0,d.jsx)(n.td,{children:"Log verbosity (0=debug, 1=info, 2=warn, 3=error, 4=fatal)"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"MinCrossChainTxFee"})}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"10000"})}),(0,d.jsx)(n.td,{children:"Minimum cross-chain transaction fee in sela (1 ELA = 10^8 sela)"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"PowConfiguration.PayToAddr"})}),(0,d.jsx)(n.td,{children:"Empty"}),(0,d.jsx)(n.td,{children:"AuxPoW mining reward address"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"PowConfiguration.AutoMining"})}),(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"false"})}),(0,d.jsx)(n.td,{children:"Enable solo mining (not for merged mining)"})]})]})]}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.strong,{children:"TestNet additions:"})}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n "Configuration": {\n "ActiveNet": "testnet",\n "Magic": 2018101\n }\n}\n'})}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.strong,{children:"BPoS-specific parameters (in full config):"})}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Parameter"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"DPoSConfiguration.Magic"})}),(0,d.jsx)(n.td,{children:"BPoS network magic number"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"DPoSConfiguration.DPoSPort"})}
1),(0,d.jsx)(n.td,{children:"BPoS consensus port (default 20339)"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"CRCArbiters"})}),(0,d.jsx)(n.td,{children:"List of Elastos Council arbiter public keys"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"CheckAddressHeight"})}),(0,d.jsx)(n.td,{children:"Block height at which address format checking activates"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"VoteStartHeight"})}),(0,d.jsx)(n.td,{children:"Block height at which voting becomes active"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"CRCOnlyDPOSHeight"})}),(0,d.jsx)(n.td,{children:"Block height for Elastos Council-only BPoS transition"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"NewCrossChainStartHeight"})}),(0,d.jsx)(n.td,{children:"Block height for new cross-chain protocol"})]})]})]}),"\n",(0,d.jsx)(n.h2,{id:"esc-configuration",children:"ESC Configuration"}),"\n",(0,d.jsxs)(n.p,{children:["ESC (and all sidechain geth forks) use ",(0,d.jsx)(n.strong,{children:"command-line flags"})," rather than a config file. The flags are hardcoded in ",(0,d.jsx)(n.code,{children:"node.sh"}),"."]}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Mining mode"})," (BPoS supernode \u2014 when ",(0,d.jsx)(n.code,{children:"~/.config/elastos/esc.txt"})," exists):"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-bash",children:"./esc \\\n --datadir ~/node/esc/data \\\n --mine --miner.threads 1 \\\n --password ~/.config/elastos/esc.txt \\\n --pbft.keystore ~/node/ela/keystore.dat \\\n --pbft.keystore.password ~/.config/elastos/ela.txt \\\n --pbft.net.address \"$(extip)\" --pbft.net.port 20639 \\\n --rpc --rpcaddr \"$(evm_rpc_bind)\" --rpcapi 'eth,net,web3,txpool,pbft' --rpcvhosts '*' \\\n --ws --wsaddr \"$(evm_rpc_bind)\" --wsorigins '*' \\\n --syncmode full \\\n --frozen.account.list 0x... # repeated, one flag per address (protocol list)\n"})}),"\n",(0,d.jsxs)(n.p,{children:["Block sealing uses the ",(0,d.jsx)(n.strong,{children:"PBFT keystore"})," \u2014 node.sh does ",(0,d.jsx)(n.strong,{children:"not"})," pass ",(0,d.jsx)(n.code,{children:"--unlock"})," or ",(0,d.jsx)(n.code,{children:"--allow-insecure-unlock"}),", so no account is left unlocked for RPC. When a cold reward address is set with ",(0,d.jsx)(n.code,{children:"~/node/node.sh reward set 0x..."}),", node.sh additionally passes ",(0,d.jsx)(n.code,{children:"--pbft.miner.address"}),"."]}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Light-serve mode"})," (RPC node \u2014 no ",(0,d.jsx)(n.code,{children:"esc.txt"}),"):"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-bash",children:"./esc \\\n --datadir ~/node/esc/data \\\n --lightserv 10 \\\n --rpc --rpcaddr \"$(evm_rpc_bind)\" --rpcapi 'eth,net,web3,txpool' --rpcvhosts '*' \\\n --ws --wsaddr \"$(evm_rpc_bind)\" --wsorigins '*'\n"})}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Flag"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"--datadir"})}),(0,d.jsx)(n.td,{children:"Chain data directory"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsxs)(n.td,{children:[(0,d.jsx)(n.code,{children:"--mine"}),", ",(0,d.jsx)(n.code,{children:"--miner.threads"})]}),(0,d.jsx)(n.td,{children:"Block production (mining mode only; PBFT uses 1 thread)"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"--pbft.keystore[.password]"})}),(0,d.jsx)(n.td,{children:"ELA keystore + password file for PBFT signing"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"--pbft.net.address"})}),(0,d.jsxs)(n.td,{children:["Consensus address \u2014 ",(0,d.jsx)(n.code,{children:"$(extip)"}),", auto-detected (not hardcoded)"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"--pbft.net.port"})}),(0,d.jsxs)(n.td,{children:["PBFT consensus port (",(0,d.jsx)(n.code,{children:"20639"}),")"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsxs)(n.td,{children:[(0,d.jsx)(n.code,{children:"--rpcaddr"})," / ",(0,d.jsx)(n.code,{children:"--wsaddr"})]}),(0,d.jsxs)(n.td,{children:["RPC/WS bind \u2014 ",(0,d.jsx)(n.code,{children:"$(evm_rpc_bind)"}),", ",(0,d.jsxs)(n.strong,{children:[(0,d.jsx)(n.code,{children:"127.0.0.1"})," by default"]})," (see below)"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"--rpcapi"})}),(0,d.jsxs)(n.td,{children:["RPC namespaces \u2014 ",(0,d.jsx)(n.code,{children:"eth,net,web3,txpool"})," (+ ",(0,d.jsx)(n.code,{children:"pbft"})," mining-only). ",(0,d.jsx)(n.code,{children:"admin"}),", ",(0,d.jsx)(n.code,{children:"db"}),", ",(0,d.jsx)(n.code,{children:"personal"})," are never enabled."]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsxs)(n.td,{children:[(0,d.jsx)(n.code,{children:"--rpcvhosts"})," / ",(0,d.jsx)(n.code,{children:"--wsorigins"})]}),(0,d.jsxs)(n.td,{children:["Accepted ",(0,d.jsx)(n.code,{children:"Host"})," / ",(0,d.jsx)(n.code,{children:"Origin"})," headers (",(0,d.jsx)(n.code,{children:"*"}),")"]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"--syncmode full"})}),(0,d.jsxs)(n.td,{children:["Mining mode only; the RPC branch passes no ",(0,d.jsx)(n.code,{children:"--syncmode"})]})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"--lightserv"})}),(0,d.jsx)(n.td,{children:"Light-client serving budget (RPC / non-mining only)"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"--frozen.account.list"})}),(0,d.jsxs)(n.td,{children:["Protocol frozen-address list \u2014 a ",(0,d.jsx)(n.strong,{children:"repeated"})," flag, one address per occurrence (not comma-separated)"]})]})]})]}),"\n",(0,d.jsxs)(n.h3,{id:"rpc-binding-evm_rpc_bind",children:["RPC binding (",(0,d.jsx)(n.code,{children:"evm_rpc_bind"}),")"]}),"\n",(0,d.jsxs)(n.p,{children:["EVM chains bind RPC/WS to ",(0,d.jsx)(n.code,{children:"evm_rpc_bind"}),", which defaults to ",(0,d.jsx)(n.strong,{children:(0,d.jsx)(n.code,{children:"127.0.0.1"})})," (localhost only). Override it persistently via the ",(0,d.jsx)(n.code,{children:"~/.config/elastos/evm_rpc_bind"})," file, or for one session via the ",(0,d.jsx)(n.code,{children:"EVM_RPC_BIND"})," env var;
1 an invalid value ",(0,d.jsx)(n.strong,{children:"fails closed"})," to ",(0,d.jsx)(n.code,{children:"127.0.0.1"}),". For internet exposure, keep the loopback bind and front it with a reverse proxy \u2014 see ",(0,d.jsx)(n.a,{href:"esc-rpc-node#expose-it-for-production",children:"Run an ESC RPC Node \u2192 Expose it for production"}),"."]}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.strong,{children:"ESC network parameters:"})}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Parameter"}),(0,d.jsx)(n.th,{children:"MainNet"}),(0,d.jsx)(n.th,{children:"TestNet"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"Chain ID"}),(0,d.jsx)(n.td,{children:"20"}),(0,d.jsx)(n.td,{children:"21"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"RPC Port"}),(0,d.jsx)(n.td,{children:"20636"}),(0,d.jsx)(n.td,{children:"21636"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"WS Port"}),(0,d.jsx)(n.td,{children:"20632"}),(0,d.jsx)(n.td,{children:"21632"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"P2P Port"}),(0,d.jsx)(n.td,{children:"20638"}),(0,d.jsx)(n.td,{children:"21638"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"PBFT Port"}),(0,d.jsx)(n.td,{children:"20639"}),(0,d.jsx)(n.td,{children:"21639"})]})]})]}),"\n",(0,d.jsx)(n.h2,{id:"eid-configuration",children:"EID Configuration"}),"\n",(0,d.jsx)(n.p,{children:"Identical structure to ESC with different ports and chain ID:"}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Parameter"}),(0,d.jsx)(n.th,{children:"MainNet"}),(0,d.jsx)(n.th,{children:"TestNet"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"Chain ID"}),(0,d.jsx)(n.td,{children:"22"}),(0,d.jsx)(n.td,{children:"23"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"RPC Port"}),(0,d.jsx)(n.td,{children:"20646"}),(0,d.jsx)(n.td,{children:"21646"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"WS Port"}),(0,d.jsx)(n.td,{children:"20642"}),(0,d.jsx)(n.td,{children:"21642"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"P2P Port"}),(0,d.jsx)(n.td,{children:"20648"}),(0,d.jsx)(n.td,{children:"21648"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"PBFT Port"}),(0,d.jsx)(n.td,{children:"20649"}),(0,d.jsx)(n.td,{children:"21649"})]})]})]}),"\n",(0,d.jsx)(n.h2,{id:"arbiter-configuration",children:"Arbiter Configuration"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"File:"})," ",(0,d.jsx)(n.code,{children:"~/node/arbiter/config.json"})]}),"\n",(0,d.jsxs)(n.p,{children:["Auto-generated during ",(0,d.jsx)(n.code,{children:"arbiter init"}),". Requires ELA, ESC, and EID to be initialized first."]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-json",children:'{\n "Configuration": {\n "MainNode": {\n "Rpc": {\n "IpAddress": "127.0.0.1",\n "HttpJsonPort": 20336,\n "User": "ela_rpc_user",\n "Pass": "ela_rpc_pass"\n }\n },\n "SideNodeList": [\n {\n "Name": "ESC",\n "Rpc": {\n "IpAddress": "127.0.0.1",\n "HttpJsonPort": 20632\n },\n "SyncStartHeight": 17886000,\n "ExchangeRate": 1.0,\n "SupportQuickRecharge": true,\n "SupportInvalidDeposit": true,\n "SupportNFT": true,\n "PowChain": false\n },\n {\n "Name": "EID",\n "Rpc": {\n "IpAddress": "127.0.0.1",\n "HttpJsonPort": 20642\n },\n "SyncStartHeight": 9611000,\n "ExchangeRate": 1.0,\n "SupportQuickRecharge": true,\n "SupportInvalidDeposit": true,\n "SupportNFT": false,\n "PowChain": false\n },\n {\n "Name": "PG",\n "Rpc": {\n "IpAddress": "127.0.0.1",\n "HttpJsonPort": 20672\n },\n "SyncStartHeight": 0,\n "ExchangeRate": 1.0\n }\n ],\n "RpcConfiguration": {\n "User": "arbiter_rpc_user",\n "Pass": "arbiter_rpc_pass",\n "WhiteIPList": ["127.0.0.1"]\n },\n "HttpJsonPort": 20536,\n "HttpRestPort": 20538\n }\n}\n'})}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Parameter"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"MainNode.Rpc"})}),(0,d.jsx)(n.td,{children:"Connection details for the ELA main chain no
1de"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"SideNodeList[].Name"})}),(0,d.jsx)(n.td,{children:"Sidechain identifier"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"SideNodeList[].Rpc.HttpJsonPort"})}),(0,d.jsx)(n.td,{children:"Sidechain oracle/RPC port"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"SideNodeList[].SyncStartHeight"})}),(0,d.jsx)(n.td,{children:"Block height to start syncing from (optimization)"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"SideNodeList[].ExchangeRate"})}),(0,d.jsx)(n.td,{children:"Cross-chain exchange rate (always 1.0 for ELA)"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"SideNodeList[].SupportQuickRecharge"})}),(0,d.jsx)(n.td,{children:"Enable fast deposits"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"SideNodeList[].SupportInvalidDeposit"})}),(0,d.jsx)(n.td,{children:"Handle invalid deposit recovery"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"SideNodeList[].SupportNFT"})}),(0,d.jsx)(n.td,{children:"Enable NFT cross-chain transfers"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"SideNodeList[].PowChain"})}),(0,d.jsx)(n.td,{children:"Whether the sidechain uses PoW (false for all current sidechains)"})]})]})]}),"\n",(0,d.jsx)(n.h2,{id:"oracle-configuration",children:"Oracle Configuration"}),"\n",(0,d.jsx)(n.p,{children:"Oracles are Node.js processes with no separate configuration file. They read environment variables and connect to their parent sidechain:"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-bash",children:"export env=mainnet # or testnet\nnode crosschain_oracle.js # ESC oracle\nnode crosschain_eid.js # EID oracle\n"})}),"\n",(0,d.jsxs)(n.p,{children:["The oracle binaries and their npm dependencies are downloaded during init via ",(0,d.jsx)(n.code,{children:"chain_prepare_stage"}),"."]}),"\n",(0,d.jsx)(n.h2,{id:"credential-files",children:"Credential Files"}),"\n",(0,d.jsxs)(n.p,{children:["All credential files are stored with ",(0,d.jsx)(n.code,{children:"chmod 600"})," under ",(0,d.jsx)(n.code,{children:"~/.config/elastos/"}),":"]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"File"}),(0,d.jsx)(n.th,{children:"Contents"}),(0,d.jsx)(n.th,{children:"Used By"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"node.json"})}),(0,d.jsx)(n.td,{children:"Network type (mainnet/testnet)"}),(0,d.jsx)(n.td,{children:"All components"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"ela.txt"})}),(0,d.jsx)(n.td,{children:"ELA keystore password"}),(0,d.jsx)(n.td,{children:"ELA, Arbiter, ESC/EID PBFT signing"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"esc.txt"})}),(0,d.jsx)(n.td,{children:"ESC keystore password"}),(0,d.jsx)(n.td,{children:"ESC mining mode"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"eid.txt"})}),(0,d.jsx)(n.td,{children:"EID keystore password"}),(0,d.jsx)(n.td,{children:"EID mining mode"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:(0,d.jsx)(n.code,{children:"pg.txt"})}),(0,d.jsx)(n.td,{children:"PG keystore password"}),(0,d.jsx)(n.td,{children:"PG mining mode"})]})]})]}),"\n",(0,d.jsx)(n.hr,{}),"\n",(0,d.jsx)(n.h2,{id:"rpc-api-quick-reference",children:"RPC API Quick Reference"}),"\n",(0,d.jsx)(n.h3,{id:"ela-main-chain-rpc",children:"ELA Main Chain RPC"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-bash",children:'# Blockchain queries\n~/node/node.sh ela jsonrpc getcurrentheight\n~/node/node.sh ela jsonrpc getbestblockhash\n~/node/node.sh ela jsonrpc "getblockhash 100000"\n~/node/node.sh ela jsonrpc "getblock HASH 2"\n~/node/node.sh ela jsonrpc getblockcount\n\n# Network\n~/node/node.sh ela jsonrpc getconnectioncount\n~/node/node.sh ela jsonrpc nodestate\n~/node/node.sh ela jsonrpc getneighbors\n\n# Mempool\n~/node/node.sh ela jsonrpc getrawmempool\n\n# Wallet\n~/node/node.sh ela jsonrpc listunspent\n\n# Producer info\n~/node/node.sh ela jsonrpc listproducers\n~/node/node.sh ela jsonrpc getdpospeersinfo\n\n# Mining (AuxPoW)\n~/node/node.sh ela jsonrpc "createauxblock PAYOUT_ADDRESS"\n~/node/node.sh ela jsonrpc "submitauxblock HASH AUXPOW_HEX"\n'})}),"\n",(0,d.jsx)(n.h3,{id:"esceid-rpc-standard-ethereum-json-rpc",children:"ESC/EID RPC (Standard Ethereum JSON-RPC)"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-bash",children:'# Block number\ncurl -s http://127.0.0.1:20636 \\\n -d \'{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}\'\n\n# Get balance\ncurl -s http://127.0.0.1:20636 \\\n -d \'{"jsonrpc":"2.0","method":"eth_getBalance","params":["0xADDRESS","latest"],"id":1}\'\n\n# Send raw transaction\ncurl -s http://127.0.0.1:20636 \\\n -d \'{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0xSIGNED_TX"],"id":1}\'\n\n# Get transaction receipt\ncurl -s http://127.0.0.1:20636 \\\n -d \'{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xTX_HASH"],"id":1}\'\n\n# Gas price\ncurl -s http://127.0.0.1:20636 \\\n -d \'{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":1}\'\n\n# Chain ID\ncurl -s http://127.0.0.1:20636 \\\n -d \'{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}\'\n\n# Syncing status\ncurl -s http://127.0.0.1:20636 \\\n -d \'{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}\'\n\n# Peer count\ncurl -s http://127.0.0.1:20636 \\\n -d \'{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}\'\n\n# WebSocket subscription (block headers)\nwscat -c ws://127.0.0.1:20632 \\\n -x \'{"jsonrpc":"2.0","method":"eth_subscribe","params":["newHeads"],"id":1}\'\n'})}),"\n",(0,d.jsx)(n.h3,{id:"arbiter-rpc",children:"Arbiter RPC"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-bash",children:'# Query arbiter status via its RPC port\ncurl -s http://127.0.0.1:20536 \\\n -H "Content-Type: application/json" \\\n -d \'{"method":"getinfo","params":[]}\'\n'})})]})}function a(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(h,{...e})}):h(e)}},28453(e,n,r){r.d(n,{R:()=>t,x:()=>c});var s=r(96540);const d={},i=s.createContext(d);function t(e){const n=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:t(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.