mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-21 12:16:44 +00:00
qkc/slave 02: add cluster RPC and P2P command opcodes (#23)
* add cluster opcode * fix comment
This commit is contained in:
parent
1a1d5c5d3d
commit
10a17d62aa
2 changed files with 220 additions and 0 deletions
152
qkc/cluster/wire/opcode.go
Normal file
152
qkc/cluster/wire/opcode.go
Normal file
|
|
@ -0,0 +1,152 @@
|
|||
// Copyright 2026-2027, QuarkChain.
|
||||
|
||||
package wire
|
||||
|
||||
// ClusterOpBase is the offset added to all cluster op values on wire.
|
||||
// Values below ClusterOpBase belong to CommandOp (P2P).
|
||||
const ClusterOpBase ClusterOp = 128
|
||||
|
||||
// ClusterOp — cluster RPC opcodes (master ↔ slave, slave ↔ slave)
|
||||
type ClusterOp byte
|
||||
|
||||
const (
|
||||
// ── §1 Cluster initialisation ───────────────────────────────────────────
|
||||
ClusterOpPing ClusterOp = 1 + ClusterOpBase // 0x81
|
||||
ClusterOpPong ClusterOp = 2 + ClusterOpBase // 0x82
|
||||
ClusterOpConnectToSlavesRequest ClusterOp = 3 + ClusterOpBase // 0x83
|
||||
ClusterOpConnectToSlavesResponse ClusterOp = 4 + ClusterOpBase // 0x84
|
||||
ClusterOpAddRootBlockRequest ClusterOp = 5 + ClusterOpBase // 0x85
|
||||
ClusterOpAddRootBlockResponse ClusterOp = 6 + ClusterOpBase // 0x86
|
||||
ClusterOpGetEcoInfoListRequest ClusterOp = 7 + ClusterOpBase // 0x87
|
||||
ClusterOpGetEcoInfoListResponse ClusterOp = 8 + ClusterOpBase // 0x88
|
||||
ClusterOpGetNextBlockToMineRequest ClusterOp = 9 + ClusterOpBase // 0x89
|
||||
ClusterOpGetNextBlockToMineResponse ClusterOp = 10 + ClusterOpBase // 0x8A
|
||||
ClusterOpGetUnconfirmedHeadersRequest ClusterOp = 11 + ClusterOpBase // 0x8B
|
||||
ClusterOpGetUnconfirmedHeadersResponse ClusterOp = 12 + ClusterOpBase // 0x8C
|
||||
ClusterOpGetAccountDataRequest ClusterOp = 13 + ClusterOpBase // 0x8D
|
||||
ClusterOpGetAccountDataResponse ClusterOp = 14 + ClusterOpBase // 0x8E
|
||||
ClusterOpAddTransactionRequest ClusterOp = 15 + ClusterOpBase // 0x8F
|
||||
ClusterOpAddTransactionResponse ClusterOp = 16 + ClusterOpBase // 0x90
|
||||
|
||||
// ── §2 Slave → Master (mining) ──────────────────────────────────────────
|
||||
ClusterOpAddMinorBlockHeaderRequest ClusterOp = 17 + ClusterOpBase // 0x91
|
||||
ClusterOpAddMinorBlockHeaderResponse ClusterOp = 18 + ClusterOpBase // 0x92
|
||||
|
||||
// ── §3 Slave ↔ Slave (xshard direct) ────────────────────────────────────
|
||||
ClusterOpAddXshardTxListRequest ClusterOp = 19 + ClusterOpBase // 0x93
|
||||
ClusterOpAddXshardTxListResponse ClusterOp = 20 + ClusterOpBase // 0x94
|
||||
|
||||
// ── §4 Master → Slave (sync / virtual conns) ────────────────────────────
|
||||
ClusterOpSyncMinorBlockListRequest ClusterOp = 21 + ClusterOpBase // 0x95
|
||||
ClusterOpSyncMinorBlockListResponse ClusterOp = 22 + ClusterOpBase // 0x96
|
||||
ClusterOpAddMinorBlockRequest ClusterOp = 23 + ClusterOpBase // 0x97
|
||||
ClusterOpAddMinorBlockResponse ClusterOp = 24 + ClusterOpBase // 0x98
|
||||
ClusterOpCreateClusterPeerConnectionRequest ClusterOp = 25 + ClusterOpBase // 0x99
|
||||
ClusterOpCreateClusterPeerConnectionResponse ClusterOp = 26 + ClusterOpBase // 0x9A
|
||||
ClusterOpDestroyClusterPeerConnectionCommand ClusterOp = 27 + ClusterOpBase // 0x9B (non-RPC)
|
||||
|
||||
// 28 is skipped in Python. Wire value 0x9C is intentionally unused.
|
||||
|
||||
ClusterOpGetMinorBlockRequest ClusterOp = 29 + ClusterOpBase // 0x9D
|
||||
ClusterOpGetMinorBlockResponse ClusterOp = 30 + ClusterOpBase // 0x9E
|
||||
ClusterOpGetTransactionRequest ClusterOp = 31 + ClusterOpBase // 0x9F
|
||||
ClusterOpGetTransactionResponse ClusterOp = 32 + ClusterOpBase // 0xA0
|
||||
|
||||
// ── §5 Slave ↔ Slave (xshard batch) ─────────────────────────────────────
|
||||
ClusterOpBatchAddXshardTxListRequest ClusterOp = 33 + ClusterOpBase // 0xA1
|
||||
ClusterOpBatchAddXshardTxListResponse ClusterOp = 34 + ClusterOpBase // 0xA2
|
||||
|
||||
// ── §6 Master → Slave (JSON-RPC-like) ───────────────────────────────────
|
||||
ClusterOpExecuteTransactionRequest ClusterOp = 35 + ClusterOpBase // 0xA3
|
||||
ClusterOpExecuteTransactionResponse ClusterOp = 36 + ClusterOpBase // 0xA4
|
||||
ClusterOpGetTransactionReceiptRequest ClusterOp = 37 + ClusterOpBase // 0xA5
|
||||
ClusterOpGetTransactionReceiptResponse ClusterOp = 38 + ClusterOpBase // 0xA6
|
||||
ClusterOpMineRequest ClusterOp = 39 + ClusterOpBase // 0xA7
|
||||
ClusterOpMineResponse ClusterOp = 40 + ClusterOpBase // 0xA8
|
||||
ClusterOpGenTxRequest ClusterOp = 41 + ClusterOpBase // 0xA9
|
||||
ClusterOpGenTxResponse ClusterOp = 42 + ClusterOpBase // 0xAA
|
||||
ClusterOpGetTransactionListByAddressRequest ClusterOp = 43 + ClusterOpBase // 0xAB
|
||||
ClusterOpGetTransactionListByAddressResponse ClusterOp = 44 + ClusterOpBase // 0xAC
|
||||
ClusterOpGetLogRequest ClusterOp = 45 + ClusterOpBase // 0xAD
|
||||
ClusterOpGetLogResponse ClusterOp = 46 + ClusterOpBase // 0xAE
|
||||
ClusterOpEstimateGasRequest ClusterOp = 47 + ClusterOpBase // 0xAF
|
||||
ClusterOpEstimateGasResponse ClusterOp = 48 + ClusterOpBase // 0xB0
|
||||
ClusterOpGetStorageRequest ClusterOp = 49 + ClusterOpBase // 0xB1
|
||||
ClusterOpGetStorageResponse ClusterOp = 50 + ClusterOpBase // 0xB2
|
||||
ClusterOpGetCodeRequest ClusterOp = 51 + ClusterOpBase // 0xB3
|
||||
ClusterOpGetCodeResponse ClusterOp = 52 + ClusterOpBase // 0xB4
|
||||
ClusterOpGasPriceRequest ClusterOp = 53 + ClusterOpBase // 0xB5
|
||||
ClusterOpGasPriceResponse ClusterOp = 54 + ClusterOpBase // 0xB6
|
||||
ClusterOpGetWorkRequest ClusterOp = 55 + ClusterOpBase // 0xB7
|
||||
ClusterOpGetWorkResponse ClusterOp = 56 + ClusterOpBase // 0xB8
|
||||
ClusterOpSubmitWorkRequest ClusterOp = 57 + ClusterOpBase // 0xB9
|
||||
ClusterOpSubmitWorkResponse ClusterOp = 58 + ClusterOpBase // 0xBA
|
||||
|
||||
// ── §7 Slave → Master (block list) ──────────────────────────────────────
|
||||
ClusterOpAddMinorBlockHeaderListRequest ClusterOp = 59 + ClusterOpBase // 0xBB
|
||||
ClusterOpAddMinorBlockHeaderListResponse ClusterOp = 60 + ClusterOpBase // 0xBC
|
||||
|
||||
// ── §8 Master → Slave (JRPC & staking) ──────────────────────────────────
|
||||
ClusterOpCheckMinorBlockRequest ClusterOp = 61 + ClusterOpBase // 0xBD
|
||||
ClusterOpCheckMinorBlockResponse ClusterOp = 62 + ClusterOpBase // 0xBE
|
||||
ClusterOpGetAllTransactionsRequest ClusterOp = 63 + ClusterOpBase // 0xBF
|
||||
ClusterOpGetAllTransactionsResponse ClusterOp = 64 + ClusterOpBase // 0xC0
|
||||
ClusterOpGetRootChainStakesRequest ClusterOp = 65 + ClusterOpBase // 0xC1
|
||||
ClusterOpGetRootChainStakesResponse ClusterOp = 66 + ClusterOpBase // 0xC2
|
||||
ClusterOpGetTotalBalanceRequest ClusterOp = 67 + ClusterOpBase // 0xC3
|
||||
ClusterOpGetTotalBalanceResponse ClusterOp = 68 + ClusterOpBase // 0xC4
|
||||
)
|
||||
|
||||
// CommandOp — P2P command opcodes (peer ↔ peer, cluster_peer_id != 0)
|
||||
type CommandOp byte
|
||||
|
||||
const (
|
||||
// Master-only.
|
||||
CommandOpHello CommandOp = 0x00
|
||||
|
||||
// Master → Slave (NON-RPC).
|
||||
CommandOpNewMinorBlockHeaderList CommandOp = 0x01
|
||||
CommandOpNewTransactionList CommandOp = 0x02
|
||||
|
||||
// Master-only.
|
||||
CommandOpGetPeerListRequest CommandOp = 0x03
|
||||
CommandOpGetPeerListResponse CommandOp = 0x04
|
||||
CommandOpGetRootBlockHeaderListRequest CommandOp = 0x05
|
||||
CommandOpGetRootBlockHeaderListResponse CommandOp = 0x06
|
||||
CommandOpGetRootBlockListRequest CommandOp = 0x07
|
||||
CommandOpGetRootBlockListResponse CommandOp = 0x08
|
||||
|
||||
// Master → Slave (RPC).
|
||||
CommandOpGetMinorBlockListRequest CommandOp = 0x09
|
||||
CommandOpGetMinorBlockListResponse CommandOp = 0x0A
|
||||
CommandOpGetMinorBlockHeaderListRequest CommandOp = 0x0B
|
||||
CommandOpGetMinorBlockHeaderListResponse CommandOp = 0x0C
|
||||
|
||||
// Master → Slave (NON-RPC).
|
||||
CommandOpNewBlockMinor CommandOp = 0x0D
|
||||
|
||||
// Master-only.
|
||||
CommandOpPing CommandOp = 0x0E
|
||||
CommandOpPong CommandOp = 0x0F
|
||||
CommandOpGetRootBlockHeaderListWithSkipRequest CommandOp = 0x10
|
||||
CommandOpGetRootBlockHeaderListWithSkipResponse CommandOp = 0x11
|
||||
CommandOpNewRootBlock CommandOp = 0x12 // NON-RPC
|
||||
|
||||
// Master → Slave (RPC).
|
||||
CommandOpGetMinorBlockHeaderListWithSkipRequest CommandOp = 0x13
|
||||
CommandOpGetMinorBlockHeaderListWithSkipResponse CommandOp = 0x14
|
||||
)
|
||||
|
||||
// =============================================================================
|
||||
// Opcode classification
|
||||
// =============================================================================
|
||||
|
||||
// InCommandOpRange reports whether op lies in the P2P command range (< ClusterOpBase).
|
||||
// This only classifies the range, not validity. Callers must reject unrecognised
|
||||
// values, e.g. via a default case in opcode switch statements.
|
||||
func InCommandOpRange(op byte) bool { return op < byte(ClusterOpBase) }
|
||||
|
||||
// InClusterOpRange reports whether op lies in the cluster range (≥ ClusterOpBase).
|
||||
// This only classifies the range, not validity. Callers must reject unrecognised
|
||||
// values, e.g. via a default case in opcode switch statements.
|
||||
func InClusterOpRange(op byte) bool { return op >= byte(ClusterOpBase) }
|
||||
68
qkc/cluster/wire/opcode_test.go
Normal file
68
qkc/cluster/wire/opcode_test.go
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
// Copyright 2026-2027, QuarkChain.
|
||||
|
||||
package wire
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestOpcodeRangeInvariant(t *testing.T) {
|
||||
for i := 0; i < 256; i++ {
|
||||
b := byte(i)
|
||||
|
||||
cmd := InCommandOpRange(b)
|
||||
clu := InClusterOpRange(b)
|
||||
if cmd && clu {
|
||||
t.Fatalf("opcode overlap at 0x%02X", b)
|
||||
}
|
||||
if !cmd && !clu {
|
||||
t.Fatalf("opcode not classified at 0x%02X", b)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestOpcodeBoundaryValues(t *testing.T) {
|
||||
tests := []struct {
|
||||
op byte
|
||||
isCommand bool
|
||||
isCluster bool
|
||||
}{
|
||||
{0x00, true, false},
|
||||
{0x7F, true, false},
|
||||
{0x80, false, true},
|
||||
{0xFF, false, true},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
if InCommandOpRange(tt.op) != tt.isCommand {
|
||||
t.Fatalf("command range mismatch at 0x%02X", tt.op)
|
||||
}
|
||||
if InClusterOpRange(tt.op) != tt.isCluster {
|
||||
t.Fatalf("cluster range mismatch at 0x%02X", tt.op)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestClusterOpBase(t *testing.T) {
|
||||
if ClusterOpBase != ClusterOp(128) {
|
||||
t.Errorf("ClusterOpBase = %d; want 128", ClusterOpBase)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCriticalOpcodeValues(t *testing.T) {
|
||||
cases := []struct {
|
||||
name string
|
||||
op byte
|
||||
}{
|
||||
{"ClusterOpPing", byte(ClusterOpPing)},
|
||||
{"ClusterOpPong", byte(ClusterOpPong)},
|
||||
{"CommandOpHello", byte(CommandOpHello)},
|
||||
{"CommandOpPing", byte(CommandOpPing)},
|
||||
{"CommandOpPong", byte(CommandOpPong)},
|
||||
}
|
||||
|
||||
for _, c := range cases {
|
||||
// range sanity
|
||||
if InCommandOpRange(c.op) == InClusterOpRange(c.op) {
|
||||
t.Fatalf("%s invalid classification", c.name)
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue