Rangers Protocol

CertiKFiles named in the report

CertiK reviewed Rangers Protocol on 21 Mar 2024: 41 findings, 0 critical; 33 marked fixed, 8 open.

No open critical findings
Open the reportOpen Rangers Protocol’s security record

Report hosted on skynet.certik.com.

Trustblock does not review code.

Findings41

Statuses are the security firm’s own, from its report.

SeverityOpenAcknowledgedFixed
Critical000
High001
Medium204
Low6028
HighMissing Validation of Peer Public KeyFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/common/sign.go - src/core/sync_msg.go - src/core/sync_processor.go The `SignInfo.Id` property is generally used as peer identifier in order to detect bad nodes and to send back responses after answers. However, the codebase lacks proper checks that `SignInfo.Id` represents a legitimate peer identity. Moreover, the `SignData.ValidateSign` function, fetches the public key of the signed payload from the message itself, instead of matching it with a whitelist or blacklist of already known peers. This means that any peer could include an arbitrary `Id` and impersonate any other peer. A malicious node could leverage such situation and, based on the involved functionality, bring the target node in an inconsistent state or circumvent any identity based protection mechanism. The issue involves the following functionalities. - The `chainInfoNotifyHandler` adds to the internal `candidatePool` map the potential updates of the chain. When doing such operation, the `chainInfo.SignInfo.Id` property provides information on the sender peer. If such peer was flagged as "evil" in the `PeerManager` then such message is not considered. Since any peer could present an arbitrary `Id`, a malicious node could leverage such situation and bring a target node in an inconsistent state, letting it accept as global state some chain incorrect chain information. - The `blockChainPieceReqHandler` method is supposed to handle the incoming request of a blockchain piece. Since the `Id` can be arbitrarily set by the sender, an attacker could exploit the whole network to flood with responses a target node which, instead, did not perform any request. Such vulnerability enables and attacker to use the whole network as amplification system for a DDoS attack. - The `blockChainPieceHandler` handle manages incoming chain information filtering out messages coming from peers other than the expected candidate. Any malicious node can arbitrarily set the `chainPieceInfo.SignInfo.Id` property and circumvent such check on the sender. - The `blockResponseMsgHandler` and `groupResponseMsgHandler` handlers respectively check the received block or group response comes from the expected candidate peer by checking its Id. Any malicious node can impersonate the expected candidate peer and provide wrong information on the synchronized block.

MediumIncomplete Input Validation of `topHeader`Fixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files - src/core/sync_msg.go The function `verifyBlockChainPiece()` does not verify the `topHeader` is legitimate via `consensusHelper.VerifyBlockHeader`. Per the comment of `VerifyBlockHeader`. ```go //verify the blockheader: mainly verify the group signature VerifyBlockHeader(bh *BlockHeader) (bool, error) ``` A malicious node can send a chain piece of info with a malformed group signature to parse the verification process of `verifyBlockChainPiece()`, which may bring unexpected errors.

MediumMissing `RUnlock` on `db.lock` Before ReturningFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/storage/trie/database.go The function `Commit()` iterates over all the children of a particular node, and writes them out to disk. Before writing nodes to disk, The function `Commit()` places a read-only locker by `db.lock.RLock()`, However, when failing to write in batch mode, The function `Commit()` forgets to unlock the read-only locker, which may cause a potential deadlock. ```go func (db *NodeDatabase) Commit(node common.Hash, report bool) error { // Create a database batch to flush persistent data out. It is important that // outside code doesn't see an inconsistent state (referenced data removed from // memory cache during commit but not yet in persistent storage). This is ensured // by only uncaching existing data when the database write finalizes. db.lock.RLock() for hash, preimage := range db.preimages { if err := batch.Put(db.secureKey(hash[:]), preimage); err != nil { db.lock.RUnlock() return err } if batch.ValueSize() > xdb.IdealBatchSize { if err := batch.Write(); err != nil { return err //@audit here } batch.Reset() } } ``` Since the file is out of scope, we mark this finding as medium.

MediumMissing Close `groupChain` When Stopping a NodeFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/groupchain.go When a user tries to stop a node with ctrlc, the `handleExit()` will be called. **src/gx/cli/gx.go** ```go func (gx *GX) handleExit(ctrlC <-chan bool, quit chan<- bool) { <-ctrlC fmt.Println("exiting...") consensus.StopMiner() if core.GetBlockChain() != nil { core.GetBlockChain().Close() } service.Close() middleware.Close() log.Close() if gx.init { quit <- true } else { os.Exit(0) } } ``` However, the `Close()` function from file src/core/groupchain.go which will close a leveldb `groups` won't be called. ```go func (chain *groupChain) Close() { chain.groups.Close() } ``` If you forget to close a LevelDB database properly and attempt to open it again, you may encounter an error indicating that the database is locked or in use. LevelDB uses file locking to prevent multiple processes from writing to the database simultaneously, which can cause data corruption. In addition, the `Close()` function does not close the derived leveldb `joinedGroups`.

MediumTimer Reset MisuseFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/blockchain_add.go - src/core/sync_processor.go - src/core/sync_msg.go The `syncProcessor` struct fires periodic go-routines based on 4 internal timers that get reset each time they expire through the `Reset` call. Such method, as documented in the Go Standard Library, can be called on stopped and expired `Timer` instances once the firing channel is drained, too. In case a single handler is called upon `Timer` expiration, such guarantee is ensured by design. In case the `Timer` may be `Reset` by a different and/or concurrent handler, then a call to `Stop` should ensure the `Timer` is in a state that can be safely reset. However, in the following case such guarantee is not respected: - The `trySync` function is called not only upon the expiration of the `syncTimer`, but also in the `addCandidate` function, which is not involved in the periodic `loop` on the `syncTimer`. The consequence is that a `trySync` invocation may try to `Reset` the timer while it is still active. - The `broadcastTimer` timer is reset in `broadcastChainInfo`, but such method may be called as a go-routine in the `successOnChainCallBack` function, which is not related to the firing of the `broadcastTimer`, which can cause an inconsistent `Reset` of the timer. - In `syncProcessor.syncGroup` the `Reset` method is called on `groupReqTimer` but there is no guarantee the timer is already stopped or expired. - The `blockReqTimer` timer can be reset in the function `requestBlockChainPiece`, which will be called by the function `trySync()`. However, `trySync()` can be triggered by the timer `syncTimer`, which does not guarantee that `blockReqTimer` is stopped or expired with a drained channel. The same issue exists in the function `syncBlock`.

LowAddress of a Pointer Variable Cannot be `nil`Fixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/blockchain.go `block` is a pointer returned from `types.UnMarshalBlock()`. However, `&block` that gets an address of a pointer(even nil value) won't be nil, thus the condition `&block == nil` won't be satisfied forever. ```go=434 var block *types.Block block, err = types.UnMarshalBlock(result) if err != nil || &block == nil { return nil } return block ```

LowClarification on Empty `txRaw.Source`Fixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/game_executor.go The `gameExecutor.runTransaction` function checks the `txRaw.Source` not to be an empty string. The audit team would like clarification on the cases such condition is possible.

LowEmpty ImplementationFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/msg_handler.go The `ChainHandler` struct has a methods called `Handle` which has an empty implementation that returns `nil` only. The methods is called by the network module on the arrival of a new message.

LowInconsistent Transactions RootFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/rpc_types.go The `ConvertBlockByHeader` function returns the provided block information in an `RPCBlock` struct suitable for being sent as RPC response. However, the response includes a `TransactionRoot` field which is constantly set as the empty trie root, independently from the effective list of transactions include in a block. Such practice can introduce unexpected outcomes in interaction with external components. In fact, they would obtain inconsistent information about the requested block: an empty transaction trie but a non-empty transaction list.

LowIncorrect Go VersionFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - go.mod The declared Golang version is `1.13`, but the `core` module contains a call to `time.Milli` which is only available starting from version `1.17`.

Show 10 more
LowLoop on Single ChannelFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/bad_peers.go The `loop` method of the `peerManager` struct is in charge to periodically check if a peer, previously marked as bad, can have its status restored by being removed from the blacklist. The periodic iterations are fired by the `cleaner` `Ticker`. Since the `loop` function only awaits for the ticker to fire, there is no need to use a generic `for` loop followed by a `select` construct.

LowMisleading `nil` Check on Logger InstanceFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/groupchain.go The `logger` variable at the pointed location is checked to be not `nil` before being used. If it is `nil`, then the message is not sent to the logger to avoid a `nil` dereference and execution continues. However, in some lines after, the `logger` variable is directly used without further checks. If `logger` can be `nil`, then the following usages will make the code panic since they will be using a `nil` reference.

LowMissing Close `db` when destroy a `fork_block` orFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/fork_group.go - src/core/fork_block.go The `finishCurrentSync` function is responsible for handling the termination of block forks or group forks within the Golang blockchain codebase. However, it has been identified that the function does not properly close database connections when destroying these forks. The relevant code snippet is as follows: ```go if p.blockFork != nil { p.blockFork.destroy() p.blockFork = nil } if p.groupFork != nil { p.groupFork.destroy() p.groupFork = nil } ``` The `destroy` method is called on both `blockFork` and `groupFork` objects, but it lacks the necessary logic to close database connections. This oversight can lead to database connection leaks, which may result in unexpected errors and could potentially exhaust database resources, leading to a denial of service.

LowMissing Input Validation in the `GameExecutor` MeFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/game_executor.go The `read` method of the `GameExecutor` struct handles messages published on the `ClientTransactionRead` channel. Such messages represent requests about the chain data from external clients. Based on the `Transaction.Type`, messages are unmarshaled and served. The transaction type highlighted by the pointed locations unmarshals the input parameters in a generic `map[string]string` which leaves freedom to set fields with any name. For such reason, the accessed values at predefined keys, e.g. `height`, `hash, `address`, `txHash`, may or may not be set. The existence of such entries should be verified before accessing them, to avoid trying to read `map` keys that are not set.

LowMissing nil Check of Variable `verifiedTx`Fixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/blockchain.go The `queryTxsByBlockHash()` function is designed to retrieve transactions (`txs`) based on their block hash. However, the implementation does not account for potential nil values within the `txHashList`. When the function attempts to dereference `verifiedTx`, it may result in a runtime panic, which could cause a denial of service or other unintended behavior. ```go for _, verifiedTx := range verifiedTxs { if verifiedTx.Hash == hash[0] { tx = verifiedTx break } } ```

LowMissing Removing Block Info From `verifiedBodyCacFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/blockchain.go When removing a block, the function `remove()` will try to remove block info from db(hashDB/heightDB/verifyHashDB), `topBlocks`, and `verifiedBlocks`. However, the function does not remove block info from verifiedBodyCache, which will be used in `queryTxsByBlockHash()`. ```go=430 func (chain *blockChain) queryTxsByBlockHash(blockHash common.Hash, txHashList []common.Hashes) ([]*types.Transaction, []common.Hashes, error) { if nil == txHashList || 0 == len(txHashList) { return nil, nil, service.ErrNil } verifiedBody, _ := chain.verifiedBodyCache.Get(blockHash) var verifiedTxs []*types.Transaction if nil != verifiedBody { verifiedTxs = verifiedBody.([]*types.Transaction) } //... } ``` A user still can query TXs from `verifiedBodyCache` by blockHash as verified TXs even if the block is removed, which may bring some unexpected errors.

LowMissing Response on Failing RequestFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/game_executor.go The `read` handler sends a successful response after the incoming message is processed. However, in the case of an error occurring during the message execution, e.g. for the marshaling and unmarshaling of the parameter or for errors on the input data, a success response is always returned with an empty result and the error is ignored. In such a way the wrong feedback is provided to the calling client.

LowMissing Revert on Block Insert ErrorFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/blockchain_add.go The `insertBlock` method adds a new block on top of the current chain and updates the node state. Such a task involves several operations like saving the new state root, removing transactions from the mempool and updating the current top block. It is important to keep the consistency of the information of the chain that all such operations either succeed or fail at the same time in an atomic manner. The `updateLastBlock` call at the pointed lines admits a `false` outcome that lets `insertBlock` return with an error code. However, if the function returns with an error code at this point, there is not any revert of the previous updates and, despite the early return, the node state is partially updated, leaving it in an inconsistent state. Specifically, the following functions were called and not reverted upon error: - `saveBlockState` - `updateVerifyHash` - `updateTxPool` - `topBlocks.Add` At the same manner, in the `saveBlockState` function, invoked inside `insertBlock`, both calls to `Commit` on `state` and `trieDB` may fail, but there is not any revert mechanism for `state` in case the `Commit` on `trieDB` returns an error.

LowOff-by-one Error in `buildCache()`Fixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/blockchain.go An off-by-one error is a logic error involving the discrete equivalent of a boundary condition. The function `buildCache` is intended to add `size` blocks to cache `chain.topBlocks` when the latest block height is greater than or equal to `size`, however only `size-1` blocks will be added. ```go func (chain *blockChain) buildCache(size uint64) { var start uint64 if chain.latestBlock.Height < size { start = 0 } else { start = chain.latestBlock.Height - (size - 1) } for i := start; i < chain.latestBlock.Height; i++ { chain.topBlocks.Add(i, chain.QueryBlockHeaderByHeight(i, false)) } } ```

LowPotential Inconsistency in `RequestIds` CalculatiFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/blockchain.go The `RequestIds` property in the `BlockHeader` struct is computed starting from the transactions set in `Block.Transaction` as input from `CastBlock`. However, such list of transactions is subsequently modified when the transaction are effectively executed by the EVM. As a result, since the list of transactions may have changed, the already computed `RequestIds` could be invalid but anyway included in the `Block.Header`.

Show 10 more
LowPotential Logical Flaw in `queryTxsByBlockHash()`Fixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/blockchain.go The function `queryTxsByBlockHash()` is intended to query all the verified txs in `txHashList`. When finding all the available txs in `txHashList`, a nil tx may be added to the return array `txs`. ```go=468 for _, hash := range txHashList { var tx *types.Transaction if verifiedTxs != nil { for _, verifiedTx := range verifiedTxs { if verifiedTx.Hash == hash[0] { tx = verifiedTx break } } } if tx == nil { tx, err = chain.transactionPool.GetTransaction(hash[0]) } if tx == nil { need = append(need, hash) } txs = append(txs, tx)//tx may be nil } ``` Dereferencing a nil transaction in `txs` may cause a panic error.

LowPreallocate Maximum CapacityFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/blockchain_verify.go The `hashList` variable is a slice with an upper bound of $100$ elements enforced by the subsequent logic. Since the following code accounts for such limit and the number of transactions in a block can easily be a multiple of $100$, the Go runtime needs to allocate new segments of contiguous memory each time the default capacity of the array is exceeded. Given the described constraint on the slice length, such overhead can be saved with a unique array allocation.

LowRedundant `break` StatementFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/game_executor.go The Go language will automatically provide a break statement at the end of each case block. So the break statement that is needed in switch cases in many other languages is not needed in go.

LowRedundant `nil` CheckFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/blockchain_add.go - src/core/fork_group.go - src/core/fork_block.go The function call `len(nil)` returns 0, thus it is unnecessary to check if the key is `nil`. **src/core/blockchain_add.go** ```go func dumpTxs(txs []*types.Transaction, blockHeight uint64) { if txs == nil || len(txs) == 0 { return } ``` **src/core/fork_group.go**\ **src/core/fork_block.go** ```go if bytes == nil || len(bytes) == 0 { return nil } ```

LowSimplifiable Boolean ReturnFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/blockchain_sync.go The pointed snippet of code explicitly returns the condition in the `if` statement. ```go=76 if hashBigCompareValue > 0 { return true } return false ```

LowUnhandled DB FailuresFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/blockchain_consistency.go - src/core/groupchain.go The code at the pointed locations calls the underlying database to perform the requested modifications. However, errors that may arise from such calls are not handled and execution proceeds independently from the operation success. Such behavior can introduce inconsistent states inside the expected logic.

LowUnhandled Errors on Fork Block AdditionFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/fork_block.go The `addBlockOnFork` function verifies and commits a new block on a chain fork. After all the checks are performed the state and the chain are updated with the `fork.saveState` and `fork.insertBlock` calls. Such methods may fail and return an error, but such a condition is not managed by the calling logic that, instead, ignores any outcome. If any error is raised, then the execution continues and: - in case there are new blocks to add, the next blocks fail to verify due to the inconsistent state; - in case there are no new blocks to add, the fork is left in an inconsistent state.

LowUnnecessary Computation of Replaced ValueFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/blockchain.go The `StateTree` property of the `BlockHeader` struct is set on struct create but it is replaced with the correct value at the end of the `CastBlock` function where the correct hash is computed. The first initialization can be saved.

LowUnused Boolean VariableFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/blockchain.go The `init` field in the `blockChain` struct is set at the end of the `initBlockChain` function but it is never read.

LowUnused CodeFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/blockchain_add.go The pointed code snippets are unused.

Show 3 more
LowUnused ErrorFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/fork_group.go The following variables contain errors which are defined but never used: - `verifyGroupErr`

LowUsage of `panic`Fixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/blockchain_add.go A `panic` in Golang means that the exceptions are raised at runtime when an error is encountered typically. Mostly it is used to fail fast on errors that shouldn’t occur during normal operations, or those that are not prepared to handle gracefully. In the current codebase, `panic` is used during blockchain runtime, which may stop the current node.

LowUsage of Magic NumbersFixed

Commit: - [`0248879b845ff1a9e790580655cf7daf784536d1`](https://github.com/rangersprotocolcode/go-rangers/tree/0248879b845ff1a9e790580655cf7daf784536d1) Files: - src/core/blockchain.go - src/core/blockchain_add.go - src/core/blockchain_verify.go - src/core/game_executor.go - src/core/genesis_sub.go The pointed code locations make use of magic numbers. Such practice is error prone across development iterations and lows code readability.

Contracts in scope

No deployed address is recorded for this audit.

The report names a repository or files. Open the report to see its scope.

Repository and files the report names (28)

  • src/core/genesis_sub.go
  • src/core/genesis_block.go
  • src/core/blockchain_notify.go
  • src/core/sync_msg.go
  • src/core/game_executor_service.go
  • src/core/game_executor.go
  • src/core/sync_processor.go
  • src/core/fork_group.go
  • src/core/init.go
  • src/core/blockchain_verify.go
  • src/core/sync_helper.go
  • src/core/genesis_block_robin.go
  • src/core/rpc_types.go
  • src/core/bad_peers.go
  • src/core/vmexecutor.go
  • src/core/msg_handler.go
  • src/core/vmexecutor_sub.go
  • src/core/genesis_block_dev.go
  • src/core/blockchain_consistency.go
  • src/core/blockchain_genesis.go
  • src/core/msg_sender.go
  • src/core/interface.go
  • src/core/blockchain.go
  • src/core/groupchain_sync.go
  • src/core/fork_block.go
  • src/core/groupchain.go
  • src/core/blockchain_sync.go
  • src/core/blockchain_add.go

Part of Rangers Protocol’s security record

Rangers Protocol
Audits3 audits by 1 firmLast audit Dec 2024, by CertiK.
Critical findingsNo open critical findingsAcross 3 reports.
Open Rangers Protocol’s security record

Security firm

CertiK

1,044 projects reviewed · 1,375 reports · latest May 2025

See CertiK’s audits

Something wrong on this page? A missing report, a wrong date, a finding that was fixed since. Tell us and we check it against its source.

Tell us