An alternative full node bitcoin implementation written in Go (golang)
This report presents the forensic synthetic code analysis of btcsuite/btcd, a Go project with 6,693 GitHub stars. SynthScan v2.0 examined 208,212 lines of code across 632 source files, recording 714 pattern matches distributed across 8 syntactic categories. The overall adjusted score of 3.8 places this repository in the Likely human-written band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 714 distinct pattern matches across 8 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | log.go | 41 | // Loggers per subsystem. A single backend logger is created and all subsystem | 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 | channels[lastGenerated] = c | COMMENT |
| LOW | rpcserver.go | 1641 | COMMENT | |
| LOW | rpcserver.go | 4141 | // this only applies to standard clients. Websocket clients have their own | COMMENT |
| LOW | rpcserver.go | 4421 | } | COMMENT |
| LOW | rpcserver.go | 4701 | // IsTxRelayDisabled returns whether or not the peer has disabled | COMMENT |
| LOW | rpcserver.go | 4721 | // permanent flag indicates whether or not to make the peer persistent | COMMENT |
| LOW | rpcserver.go | 4761 | // BroadcastMessage sends the provided message to all currently | COMMENT |
| LOW | rpcserver.go | 4781 | // The interface contract requires that all of these methods are safe for | COMMENT |
| LOW | rpcserver.go | 4801 | // current tip is reached, up to a max of wire.MaxBlockHeadersPerMsg | COMMENT |
| LOW | rpcwebsocket.go | 121 | // websockets. It allows websocket clients to register for notifications they | COMMENT |
| LOW | rpcwebsocket.go | 1181 | COMMENT | |
| LOW | rpcwebsocket.go | 1221 | // and therefore is allowed to communicated over the websocket. | COMMENT |
| LOW | rpcwebsocket.go | 1421 | // done, the read of the next request should not be blocked by | COMMENT |
| LOW | rpcwebsocket.go | 1741 | return | COMMENT |
| LOW | rpcwebsocket.go | 2601 | Message: "Database error: " + err.Error(), | 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 | |
| LOW | database/error.go | 161 | if s := errorCodeStrings[e]; s != "" { | COMMENT |
| LOW | database/example_test.go | 41 | COMMENT | |
| 555 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 | 1147 | // NOTE: This function is exported in order to allow txscript to compute the | COMMENT |
| LOW | wire/msgtx.go | 1162 | // 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 | 866 | // 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 | 328 | // NOTE: This function is only valid for version 0 scripts. Since the function | COMMENT |
| LOW | txscript/sign.go | 450 | // NOTE: This function is only valid for version 0 scripts. Since the function | COMMENT |
| LOW | txscript/sign.go | 554 | // 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 | 129 | // ┌─────────┬────────────────────┬─────────────┬─────┐ | COMMENT |
| MEDIUM⚡ | wire/msgtx.go | 132 | // └─────────┴────────────────────┴─────────────┴─────┘ | COMMENT |
| MEDIUM⚡ | wire/msgtx.go | 136 | // ┌── FLAG ─────────────┬────────┐ | COMMENT |
| MEDIUM⚡ | wire/msgtx.go | 139 | // └─────────────────────┴────────┘ | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | wire/msgtx.go | 718 | // 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 |