An alternative full node bitcoin implementation written in Go (golang)
This report summarizes scanner evidence for btcsuite/btcd, a Go project with 6,717 GitHub stars. SynthScan examined 214,110 lines of code across 656 source files, recording 726 pattern matches distributed across 8 syntactic categories. The legacy adjusted pattern signal is 3.8 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 721 finding(s).
Are imports declared and package/API names verified? 1 finding(s).
Are wrappers, guards, and repeated structures necessary? 4 finding(s).
Which changes need focused human review? 726 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 726 distinct pattern matches across 8 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | log.go | 41 | // Loggers per subsystem. A single backend logger is created and all subsystem | COMMENT |
| LOW | config.go | 421 | // loadConfig initializes and parses the config using a config file and command | COMMENT |
| LOW | server.go | 561 | } | COMMENT |
| LOW | server.go | 721 | COMMENT | |
| LOW | server.go | 801 | // resources with unusually large inventory queries. | COMMENT |
| LOW | server.go | 1321 | COMMENT | |
| LOW | rpcserver.go | 61 | // uint256Size is the number of bytes needed to represent an unsigned | COMMENT |
| LOW | rpcserver.go | 1561 | // was last generated or create a new one. | COMMENT |
| LOW | rpcserver.go | 2021 | COMMENT | |
| LOW | rpcserver.go | 4161 | COMMENT | |
| LOW | rpcserver.go | 4721 | // The interface contract requires that all of these methods are safe for | COMMENT |
| LOW | rpcserver.go | 4761 | // PersistentPeers returns an array consisting of all the persistent | COMMENT |
| LOW | rpcserver.go | 4781 | } | COMMENT |
| LOW | rpcserver.go | 4801 | SyncPeerID() int32 | COMMENT |
| LOW | rpcwebsocket.go | 41 | // independent of the send channel buffer. | COMMENT |
| LOW | rpcwebsocket.go | 141 | // are interested in. When an event happens elsewhere in the code such as | COMMENT |
| LOW | rpcwebsocket.go | 221 | COMMENT | |
| LOW | rpcwebsocket.go | 1201 | // wsResponse houses a message to send to a connected websocket client as | COMMENT |
| LOW | rpcwebsocket.go | 1441 | continue | COMMENT |
| LOW | rpcwebsocket.go | 1801 | COMMENT | |
| LOW | rpcwebsocket.go | 1941 | // to the client having already been disconnected or dropped. | COMMENT |
| LOW | rpcwebsocket.go | 2681 | // range were successfully fetched and a stop block | COMMENT |
| LOW | rpcwebsocket.go | 2741 | } | COMMENT |
| LOW | upnp.go | 1 | package main | COMMENT |
| LOW | upnp.go | 21 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | COMMENT |
| LOW | rpcadapters.go | 41 | // interface implementation. | COMMENT |
| LOW | rpcadapters.go | 121 | // applies to both inbound and outbound peers. Attempting to remove an id that | COMMENT |
| LOW | rpcadapters.go | 201 | COMMENT | |
| LOW | rpcadapters.go | 241 | COMMENT | |
| LOW | rpcadapters.go | 281 | // the provided locators until the provided stop hash or the current tip is | COMMENT |
| LOW | btcjson/register.go | 21 | const ( | COMMENT |
| LOW | btcjson/register.go | 121 | return false | COMMENT |
| LOW | btcjson/register.go | 141 | // - The order of the positional parameters in the marshalled JSON will be in | COMMENT |
| LOW | btcjson/jsonrpcerr.go | 141 | COMMENT | |
| LOW | btcjson/chainsvrresults.go | 921 | COMMENT | |
| LOW | btcjson/chainsvrresults.go | 941 | // false). | COMMENT |
| LOW | btcjson/walletsvrresults.go | 41 | HDMasterFingerprint *string `json:"hdmasterfingerprint,omitempty"` | COMMENT |
| LOW | btcjson/walletsvrcmds.go | 921 | // ImportMultiRequest defines the request struct to be passed to the | COMMENT |
| LOW | btcjson/walletsvrcmds.go | 961 | // (as an int) or the range (as []int{begin, end}) to import. | COMMENT |
| LOW | btcjson/cmdparse.go | 501 | // to be passed unaltered. In particular, the following conversions are | COMMENT |
| LOW | btcjson/export_test.go | 1 | // Copyright (c) 2014 The btcsuite developers | COMMENT |
| LOW | btcjson/chainsvrwsntfns.go | 1 | // Copyright (c) 2014-2017 The btcsuite developers | COMMENT |
| LOW | btcjson/chainsvrwsntfns.go | 21 | // | COMMENT |
| LOW | btcjson/chainsvrwsntfns.go | 41 | COMMENT | |
| LOW | btcjson/chainsvrwsntfns.go | 61 | // Deprecated: Not used with rescanblocks command. | COMMENT |
| LOW | btcjson/walletsvrwsntfns.go | 1 | // Copyright (c) 2014 The btcsuite developers | COMMENT |
| LOW | btcjson/help.go | 461 | // result types given a map to provide the appropriate keys for the method | COMMENT |
| LOW | btcjson/help.go | 481 | // "<method>-<lowerfieldname>" Description for each command argument | COMMENT |
| LOW | btcjson/btcdextcmds.go | 1 | // Copyright (c) 2014-2016 The btcsuite developers | COMMENT |
| LOW | btcjson/btcdextcmds.go | 121 | // | COMMENT |
| LOW | btcjson/submitpackage.go | 1 | package btcjson | COMMENT |
| LOW | btcjson/submitpackage.go | 21 | // - Limits: Subject to node limits on package size (e.g., max 25 txs) and | COMMENT |
| LOW | btcjson/submitpackage.go | 41 | // This RPC is experimental. Refer to Bitcoin Core's `doc/policy/packages.md` | COMMENT |
| LOW | btcjson/submitpackage.go | 81 | type JsonSubmitPackageTxResult struct { | COMMENT |
| LOW | btcjson/submitpackage.go | 141 | COMMENT | |
| LOW | cmd/btcctl/config.go | 181 | // line options. | COMMENT |
| LOW | database/error.go | 21 | COMMENT | |
| LOW | database/error.go | 61 | // ErrTxNotWritable indicates an operation that requires write access to | COMMENT |
| LOW | database/error.go | 81 | // ErrKeyRequired indicates at attempt to insert a zero-length key. | COMMENT |
| LOW | database/error.go | 101 | COMMENT | |
| 567 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | btcjson/register.go | 153 | // NOTE: This function only needs to be able to examine the structure of the | COMMENT |
| LOW⚡ | btcjson/chainsvrresults.go | 521 | // Step 1: Create type aliases of the original struct. | COMMENT |
| LOW⚡ | btcjson/chainsvrresults.go | 524 | // Step 2: Create an anonymous struct with raw replacements for the special | COMMENT |
| LOW⚡ | btcjson/chainsvrresults.go | 535 | // Step 3: Unmarshal the data into the anonymous struct. | COMMENT |
| LOW⚡ | btcjson/chainsvrresults.go | 540 | // Step 4: Convert the raw fields to the desired types | COMMENT |
| LOW⚡ | btcjson/walletsvrresults.go | 72 | // Step 1: Create type aliases of the original struct, including the | COMMENT |
| LOW⚡ | btcjson/walletsvrresults.go | 77 | // Step 2: Create an anonymous struct with raw replacements for the special | COMMENT |
| LOW⚡ | btcjson/walletsvrresults.go | 90 | // Step 3: Unmarshal the data into the anonymous struct. | COMMENT |
| LOW⚡ | btcjson/walletsvrresults.go | 95 | // Step 4: Convert the raw fields to the desired types | COMMENT |
| LOW⚡ | btcjson/jsonrpc.go | 107 | // Step 1: Create a type alias of the original struct. | COMMENT |
| LOW⚡ | btcjson/jsonrpc.go | 110 | // Step 2: Create an anonymous struct with raw replacements for the special | COMMENT |
| LOW⚡ | btcjson/jsonrpc.go | 120 | // Step 3: Unmarshal the data into the anonymous struct. | COMMENT |
| LOW⚡ | btcjson/jsonrpc.go | 126 | // Step 4: Convert the raw fields to the desired types | COMMENT |
| LOW | database/ffldb/db.go | 1053 | // NOTE: This function must only be called on a writable transaction. Since it | COMMENT |
| LOW | database/ffldb/db.go | 1090 | // NOTE: This function must only be called on a writable transaction. Since it | COMMENT |
| LOW | database/ffldb/db.go | 1108 | // NOTE: This function must only be called on a writable transaction. Since it | COMMENT |
| LOW | database/ffldb/blockio.go | 399 | // NOTE: This function MUST be called with the write cursor current file lock | COMMENT |
| LOW | chainhash/hash.go | 190 | // NOTE: This function accepts short and odd-length hex strings and pads them. | COMMENT |
| LOW | chainhash/hash.go | 216 | // NOTE: This function accepts short and odd-length hex strings and pads them. | COMMENT |
| LOW | wire/msgtx.go | 1160 | // NOTE: This function is exported in order to allow txscript to compute the | COMMENT |
| LOW | wire/msgtx.go | 1174 | // NOTE: This function is exported in order to allow txscript to compute the | COMMENT |
| LOW | connmgr/connmanager.go | 561 | // NOTE: This method can also be used to cancel a lingering connection attempt | COMMENT |
| LOW | rpcclient/wallet.go | 558 | // NOTE: This function requires to the wallet to be unlocked. See the | COMMENT |
| LOW | rpcclient/wallet.go | 591 | // NOTE: This function requires to the wallet to be unlocked. See the | COMMENT |
| LOW | rpcclient/wallet.go | 645 | // NOTE: This function requires to the wallet to be unlocked. See the | COMMENT |
| LOW | rpcclient/wallet.go | 675 | // NOTE: This function requires to the wallet to be unlocked. See the | COMMENT |
| LOW | rpcclient/wallet.go | 708 | // NOTE: This function requires to the wallet to be unlocked. See the | COMMENT |
| LOW | rpcclient/wallet.go | 764 | // NOTE: This function requires to the wallet to be unlocked. See the | COMMENT |
| LOW | rpcclient/wallet.go | 797 | // NOTE: This function requires to the wallet to be unlocked. See the | COMMENT |
| LOW | rpcclient/wallet.go | 832 | // NOTE: This function requires to the wallet to be unlocked. See the | COMMENT |
| LOW | rpcclient/wallet.go | 2327 | // NOTE: This function requires to the wallet to be unlocked. See the | COMMENT |
| LOW | rpcclient/wallet.go | 2372 | // NOTE: This function requires to the wallet to be unlocked. See the | COMMENT |
| LOW | rpcclient/wallet.go | 2423 | // NOTE: This function requires to the wallet to be unlocked. See the | COMMENT |
| LOW | psbt/updater.go | 83 | // NOTE: This function does *not* validate the ECDSA signature itself. | COMMENT |
| LOW | psbt/taproot.go | 102 | // NOTE: This function does not account for the size of the BIP32 child indexes, | COMMENT |
| LOW | integration/rpctest/rpc_harness.go | 136 | // NOTE: This function is safe for concurrent access. | COMMENT |
| LOW | integration/rpctest/rpc_harness.go | 253 | // NOTE: This method and TearDown should always be called from the same | COMMENT |
| LOW | integration/rpctest/rpc_harness.go | 340 | // NOTE: This method and SetUp should always be called from the same goroutine | COMMENT |
| LOW⚡ | peer/p2pdowngrader_test.go | 169 | // Step 1: Mark A, B, C. | COMMENT |
| LOW⚡ | peer/p2pdowngrader_test.go | 175 | // Step 2: Mark A again. This should move A to the front | COMMENT |
| LOW⚡ | peer/p2pdowngrader_test.go | 179 | // Step 3: Mark D. This should evict B (which is now the | COMMENT |
| LOW | txscript/sighash.go | 75 | // NOTE: This function is only valid for version 0 scripts. Since the function | COMMENT |
| LOW | txscript/sighash.go | 625 | // NOTE: This function is able to compute the sighash of scripts that contain a | COMMENT |
| LOW | txscript/standard.go | 192 | // NOTE: This function is only valid for version 0 opcodes. Since the function | COMMENT |
| LOW | txscript/standard.go | 232 | // NOTE: This function is only valid for version 0 scripts. The returned | COMMENT |
| LOW | txscript/standard.go | 308 | // NOTE: This function is only valid for version 0 scripts. It will always | COMMENT |
| LOW | txscript/standard.go | 320 | // NOTE: This function is only valid for version 0 scripts. Since the function | COMMENT |
| LOW | txscript/standard.go | 339 | // NOTE: This function is only valid for version 0 scripts. Since the function | COMMENT |
| LOW | txscript/standard.go | 528 | // NOTE: This function is only valid for version 0 scripts. It will always | COMMENT |
| LOW | txscript/standard.go | 632 | // NOTE: This function is only valid for version 0 scripts. Since the function | COMMENT |
| LOW | txscript/standard.go | 784 | // NOTE: This function is only valid for version 0 scripts. Since the function | COMMENT |
| LOW | txscript/standard.go | 871 | // NOTE: This function is only valid for version 0 scripts. Since the function | COMMENT |
| LOW | txscript/sigcache.go | 59 | // NOTE: This function is safe for concurrent access. Readers won't be blocked | COMMENT |
| LOW | txscript/sigcache.go | 74 | // NOTE: This function is safe for concurrent access. Writers will block | COMMENT |
| LOW | txscript/sign.go | 360 | // NOTE: This function is only valid for version 0 scripts. Since the function | COMMENT |
| LOW | txscript/sign.go | 482 | // NOTE: This function is only valid for version 0 scripts. Since the function | COMMENT |
| LOW | txscript/sign.go | 592 | // NOTE: This function is only valid for version 0 scripts. Since the function | COMMENT |
| LOW | txscript/script.go | 46 | // NOTE: This function is only valid for version 0 opcodes. Since the function | COMMENT |
| LOW | txscript/script.go | 154 | // NOTE: This function is only valid for version 0 scripts. Since the function | COMMENT |
| LOW | txscript/script.go | 184 | // NOTE: This function is only valid for version 0 scripts. Since the function | COMMENT |
| 10 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | btcjson/chainsvrresults.go | 521 | // Step 1: Create type aliases of the original struct. | COMMENT |
| LOW⚡ | btcjson/chainsvrresults.go | 524 | // Step 2: Create an anonymous struct with raw replacements for the special | COMMENT |
| LOW⚡ | btcjson/chainsvrresults.go | 535 | // Step 3: Unmarshal the data into the anonymous struct. | COMMENT |
| LOW⚡ | btcjson/chainsvrresults.go | 540 | // Step 4: Convert the raw fields to the desired types | COMMENT |
| LOW⚡ | btcjson/walletsvrresults.go | 72 | // Step 1: Create type aliases of the original struct, including the | COMMENT |
| LOW⚡ | btcjson/walletsvrresults.go | 77 | // Step 2: Create an anonymous struct with raw replacements for the special | COMMENT |
| LOW⚡ | btcjson/walletsvrresults.go | 90 | // Step 3: Unmarshal the data into the anonymous struct. | COMMENT |
| LOW⚡ | btcjson/walletsvrresults.go | 95 | // Step 4: Convert the raw fields to the desired types | COMMENT |
| LOW⚡ | btcjson/jsonrpc.go | 107 | // Step 1: Create a type alias of the original struct. | COMMENT |
| LOW⚡ | btcjson/jsonrpc.go | 110 | // Step 2: Create an anonymous struct with raw replacements for the special | COMMENT |
| LOW⚡ | btcjson/jsonrpc.go | 120 | // Step 3: Unmarshal the data into the anonymous struct. | COMMENT |
| LOW⚡ | btcjson/jsonrpc.go | 126 | // Step 4: Convert the raw fields to the desired types | COMMENT |
| LOW⚡ | peer/p2pdowngrader_test.go | 169 | // Step 1: Mark A, B, C. | COMMENT |
| LOW⚡ | peer/p2pdowngrader_test.go | 175 | // Step 2: Mark A again. This should move A to the front | COMMENT |
| LOW⚡ | peer/p2pdowngrader_test.go | 179 | // Step 3: Mark D. This should evict B (which is now the | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | wire/msgtx.go | 114 | // ┌─────────┬────────────────────┬─────────────┬─────┐ | COMMENT |
| MEDIUM⚡ | wire/msgtx.go | 117 | // └─────────┴────────────────────┴─────────────┴─────┘ | COMMENT |
| MEDIUM⚡ | wire/msgtx.go | 121 | // ┌── FLAG ─────────────┬────────┐ | COMMENT |
| MEDIUM⚡ | wire/msgtx.go | 124 | // └─────────────────────┴────────┘ | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | wire/msgtx.go | 733 | // the transaction encoding format within r MUST NOT utilize the new | COMMENT |
| MEDIUM | txscript/engine_debug_test.go | 27 | // We use a simple script that will utilize both the stack and alt | COMMENT |
| MEDIUM | txscript/sighash.go | 470 | // We'll utilize this buffer throughout to incrementally calculate | COMMENT |
| MEDIUM | blockchain/chain.go | 796 | // we'll fetch it as is so the indexers can utilize if needed. | COMMENT |
| MEDIUM | blockchain/compress.go | 435 | // Essentially the compression is achieved by splitting the value into an | COMMENT |
| MEDIUM | blockchain/indexers/addrindex.go | 569 | // P2WSH outputs utilize a 32-byte data push created by hashing | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | database/doc.go | 78 | As discussed above, all of the functions which are used to manipulate key/value | CODE |
| MEDIUM | txscript/sigcache.go | 88 | // starting point of Go's map iteration. It's worth noting that | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | txscript/template.go | 206 | // Example usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/conf.py | 16 | CODE |