Skip to content

Instantly share code, notes, and snippets.

@ajtowns
Last active April 12, 2018 07:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ajtowns/bdc91590471559b5c73682fdfa712b15 to your computer and use it in GitHub Desktop.
Save ajtowns/bdc91590471559b5c73682fdfa712b15 to your computer and use it in GitHub Desktop.
bitcoin PRs, nits and reviews

Improving PR review for three sorts of proposals

Type 1 PRs: small changes

  • PRs making small changes should generally only include a few commits and be pretty self-contained.

  • PRs making a small change to the code base should go through four phases:

    • Concept review
    • WIP
    • Final review
    • Ready to merge

    These phases should be documented by labels, allowing easy querying of PRs by phase. Managing/tracking these phases should be doable manually by repo maintainers. (Alternatively, or additionally, this could be managed by a project board)

  • Concept review aims to see if the PR is worth further work by other contributors.

    • If the proposal receives "ConceptNAK" or "-1", the author should almost certainly abandon or at least substantially revise the PR.
    • If the proposal receives three "ConceptACK" or "+1" approvals, it should move into the WIP phase.
    • (A "utACK" or "testedACK" approval may also be provided; this implies a "ConceptACK" approval)
    • Otherwise, in this phase, contributors may provide feedback on the concept, and may use apache style votes to do so.
  • The WIP phase is to ensure PRs meet bitcoin's coding standards

    • Detailed review should occur here
    • Suggestions, including code style nits, should be welcomed
    • Intensive review (long running tests, eg) should be deferred to the next phase
    • Commits may be squashed or reordered regularly during this phase to make the history as understandable as possible
    • PRs should accumulate "utACK" approvals during this phase
    • Code should move from WIP phase to Final review once it has been stable for at least a few days, all automated tests pass, and all outstanding suggestions have been incorporated or otherwise responded to.
  • The Final review phase is to allow for intensive testing/review

    • Rationale: Some reviews are high-cost -- eg, checking performance of IBD, or doing detailed security review -- and it would be inconvenient to do them multiple times while a PR is rebased for relatively trivial reasons. The Final review phase indicates the code isn't expected to be rebased further.
    • During this phase code changes should not occur, with improvements deferred to later PRs
    • If code changes are needed, they should be made by adding commits, not rebasing
    • If rebasing is needed, the PR should be moved back to WIP phase
    • PRs should accumulate "testedACK" approvals during this phase, and they should note the commit hash that they're approving
    • PRs should move to the "Ready for merge" phase once they have accumulated a few "testedACK" approvals for the current commit.
  • Ready for merge phase is to allow repository maintainers to easily find PRs to merge

    • Generally PRs should only sit in this phase for a short time before they are merged
    • PRs may need to move back to Final review or WIP phase if bugs are found, or if they conflict with another ready to merge PR.

Type 2 PRs: trivial changes

  • For changes that don't affect generated code (whitespace, variable names, etc)
  • Should be filed with "[trivial]" or "TRIVIAL:" in the PR title
  • Start off in "Concept review" but once acked go straight to "Ready to merge"

Type 3 PRs: massive changes

  • Rationale: Because intensive review of very large changes is likely to find problems and thus require further development, it is important to minimise the cost of iterative intensive review.

  • Large PRs may go through the same three initial phases (Concept review, WIP and final review) as small changes.

  • However, because large PRs will often have been developed independently prior to even being proposed as a PR, the Concept review and WIP phases may have essentially already occurred, and prior collaborators may be able to provide "ConceptACK" and "utACK" approval essentially immediately.

  • When further development is required as a result of intensive reviews found during the "Final review" phase, then:

    • New commits should always be added on top of the already reviewed commits, in order to minimise the amount of additional review required
    • An additional rebase-only PR may be opened, implementing the same changes but allowing changes to be reordered or squashed
    • The final tree of the rebase PR must be maintained to be identical to the main PR
    • Once testing is complete, the original PR has achieved sufficient "testedACK" approvals, and the rebase PR's tree is identical to the approved tree, the rebased PR should be moved into Ready to merge and the original PR closed.
  • This should be extremely rare. An example of this is the segwit consensus changes, see PR#7910 (original PR) and PR#8149 (rebase only).

Automation

It's probably possible to manage these semi-automatically by a probot bot that updates labels based on comments on PRs, or that syncs a project to the labels. Such a bot shouldn't increase notification spam. It should only require write perms on PRs and projects, which shouldn't be much of a security risk (it wouldn't be able to auto merge eg).

GitHub apparently supports a PR being assigned to up to 10 people, so possibly could manage this by assigning PRs to reviewers, and make the transitions be:

  • Concept review to WIP: manually by repo admin, once there's sufficient reviewers; PR is assigned to reviewers here too
  • WIP to Final review: automatically once all PR assignees have utACKed or done an approving review, and the PR has idled for a few days
  • Final review to ready to merge: once all PR assigness have testedACKed the current commit, and there hasn't been a testedNAK of the current commit

It does seem possible! Proof of concept: probot code and example PR.

What this means for people:

  • Submitters:

    1. Submit a PR
    2. Convince some people it's worthwhile, get ConceptACKs, see it's moved into WIP
    3. Wait for comments and reviews, respond to them, until it's moved into Final Review.
    4. Wait for testedACKs or serious bug reports. Respond to any concerns.
    5. Watch it go into Ready to Merge.
    6. Watch it get merrged.
  • Reviewers:

    1. Skim PRs in "Concept Review" phase, give feedback on approach. If you're willing to review it in detail, provide a ConceptACK.
    2. Look through PRs in "WIP" phase, give suggestions on code style, try it out, suggest improvements, etc. Give a utACK if things look good.
    3. Analyse PRs in "Final Review" phase, make absolutely sure merging won't make bitcoin objectively worse. Give a testedACK if things look good. Raise hell if they don't.
  • Repo maintainers:

    1. Label new PRs as "Concept Review"
    2. Close PRs that get ConceptNAKs.
    3. Switch label from "Concept Review" to "WIP" if PR has received some ConceptACKs.
    4. (automatable) Switch label from "WIP" to "Final review" if PR has received utACK/testedACKs
    5. (automatable) Switch label from "Final review" to "Ready to merge" if sufficient testedACKs have been received and the PR has been in "Final review" for some minimum time.
    6. Merge "Ready to merge" PRs.
    7. If PR is stalling due to the author not fixing problems, ping the author, and then close the PR
    8. If PR is stalling due to lack of ACKs, despite reported suggestions having been fixed, use assign/request review to people to upgrade their ACKs (concept->ut, ut->tested). (Note, PRs may still stall indefinitely in Concept Review phase)
#!/usr/bin/env python3
import os
import sys
import re
from multiprocessing import Pool
from github import Github
cack_re = re.compile(r'\bconcept\s*ACK\b', re.IGNORECASE)
ack_re = re.compile(r'\b(ut|t|tested|)\s*ACK\b', re.IGNORECASE)
merge_re = re.compile(r'\b(ut|t|tested|)\s*ACK\s+([a-f0-9]{6,40})\b', re.IGNORECASE)
nak_re = re.compile(r'\b(NAK|NACK)\b', re.IGNORECASE)
wip_re = re.compile(r'\bWIP\b', re.IGNORECASE)
def handle_pr(pr):
sha = pr.head.sha
issue = btc.get_issue(pr.number)
comments = issue.get_comments()
pr_user = pr.user.login
user_acks = {}
for c in comments:
u = c.user.login
if u == pr_user: continue
if c.user.type == 'Bot': continue
cack = cack_re.search(c.body)
ack = ack_re.search(c.body)
merge = merge_re.search(c.body)
nak = nak_re.search(c.body)
if merge:
assert ack is not None
if merge and not sha.startswith(merge.groups()[1]):
merge = None
if nak:
user_acks[u] = 'NAK'
elif merge:
user_acks[u] = 'commitACK'
elif cack:
user_acks[u] = 'conceptACK'
elif ack:
user_acks[u] = 'ACK'
r = ['']
counts = {}
for k in 'NAK commitACK ACK conceptACK'.split(' '):
u = sorted(u for u in user_acks if user_acks[u] == k)
counts[k] = len(u)
if u:
r.append(k+":")
r.append(",".join(u))
unknown_conflicts = 0
if not pr.mergeable:
#if pr.mergeable is None:
# # see if github's worked out if it's mergeable yet
#---DISABLED, because github takes a while to work this out, so it's useless to retry quickly
# pr = btc.get_pull(pr.number)
if pr.mergeable == False:
mergeable = False
r.append("CONFLICTS")
else:
mergeable = True
if pr.mergeable is None:
r.append("Conflicts?")
unknown_conflicts = 1
if r == [''] or r == ['', 'CONFLICTS'] or r == ['', 'Conflicts?']:
phase = 'concept-new'
r = []
elif counts['NAK'] > 0:
if counts['ACK'] == 0 and counts['commitACK'] == 0 and counts['conceptACK'] == 0:
phase = 'veto'
else:
phase = 'veto-controversial'
elif counts['commitACK'] > 1 and mergeable:
phase = 'merge'
elif mergeable and (counts['commitACK'] == 1 or counts['ACK'] > 1):
phase = 'review'
elif (counts['commitACK'] >= 1 or counts['ACK'] > 1):
phase = 'wip'
elif counts['ACK'] == 1 and counts['conceptACK'] > 0:
phase = 'wip'
elif counts['conceptACK'] > 2:
phase = 'wip'
else:
phase = 'concept'
if phase in ['review', 'merge'] and wip_re.search(pr.title):
phase = 'wip'
return (phase, pr.number, pr.user.login, " ".join(r), pr.title, unknown_conflicts)
gh_login = os.environ.get('GITHUB_LOGIN', None)
if gh_login is None:
print("This command exceeds github's un-authenticated rate limit.")
print("In order to use it, obtain a personal access token from")
print(" https://github.com/settings/tokens")
print("and set GITHUB_LOGIN to your github username, and")
print("GITHUB_PASSWORD to your token.")
sys.exit(1)
gh_password = os.environ.get('GITHUB_PASSWORD', None)
assert gh_password is not None
gh = Github(gh_login, gh_password, per_page=100)
btc = gh.get_repo('bitcoin/bitcoin')
pulls = btc.get_pulls(state = 'open')
PHASES = ["veto", "veto-controversial", "concept-new", "concept", "wip", "review", "merge"]
with Pool(16) as pool:
prs = [pr for pr in pulls]
results = pool.imap(handle_pr, prs)
phase_prs = {p:[] for p in PHASES}
for r in results:
phase_prs[r[0]].append(r[1:])
unknown_conflicts = 0
for p in PHASES:
if not phase_prs[p]:
continue
print("\n%s: (%d PRs)" % (p, len(phase_prs[p])))
for num,login,acks,title,unk_conf in phase_prs[p]:
print(" %5d by:%s%s -- %s" % (num,login,acks,title))
unknown_conflicts += unk_conf
sys.stdout.flush()
if unknown_conflicts:
print("\n%d UNKNOWN CONFLICTS, maybe rerun" % (unknown_conflicts))
veto: (5 PRs)
11653 by:NicolasDorier NAK: luke-jr CONFLICTS -- [RPC] Add utility getsignaturehash
10593 by:luke-jr NAK: sdaftuar CONFLICTS -- Relax punishment for peers relaying invalid blocks and headers
10574 by:practicalswift NAK: luke-jr -- Remove includes in .cpp files for things the corresponding .h file already included
10040 by:JohnDolittle NAK: petertodd CONFLICTS -- wallet: use headers chain for anti fee sniping
9749 by:luke-jr NAK: sdaftuar CONFLICTS -- If -spkreuse=0, ensure transactions in mempool always have unique scriptPubKeys
veto-controversial: (7 PRs)
11802 by:luke-jr NAK: TheBlueMatt conceptACK: jonasschnelli -- RPC/Wallet: Refuse to dumpprivkey for derived addresses
11614 by:astanway NAK: jonasschnelli conceptACK: promag CONFLICTS -- ZMQ: Add decodedtx topic for JSON tx publishing
11517 by:martinus NAK: laanwj conceptACK: theuni -- Tests: Improve benchmark precision
10980 by:NicolasDorier NAK: sipa conceptACK: jtimon CONFLICTS -- [Refactor] Decouple CKeyStore from CWatchOnlyStore
10877 by:kallewoof NAK: promag conceptACK: jnewbery -- [rpc] Verbose flags for chaining and scripting
10563 by:achow101 NAK: laanwj conceptACK: jgarzik CONFLICTS -- Remove safe mode
8751 by:afk11 NAK: jnewbery conceptACK: MarcoFalke,TheBlueMatt,dcousens,laanwj -- RPC: Add parameter to addmultisigaddress / createmultisig to sort public keys
concept-new: (83 PRs)
11845 by:wjcloud -- Add gitian PGP key: wjcloud
11843 by:JavadSM -- Use python not 'python2'
11818 by:jnewbery -- I accidentally [deliberately] killed it [the ComparisonTestFramework]
11817 by:jnewbery -- [tests] Change bip68-112-113-p2p to use BitcoinTestFramework
11803 by:luke-jr -- Bugfix: RPC/Wallet: Include HD key metadata in dumpwallet
11796 by:ajtowns -- [tests] Functional test naming convention
11795 by:practicalswift -- net: Avoid locking cs_vNodes twice when calling FindNode(...). Add NodeExists(...).
11790 by:eklitzke -- Add pixmaps for testnet and regtest
11785 by:vii -- Prevent file-descriptor exhaustion from RPC layer
11775 by:TheBlueMatt -- Move fee estimator into validationinterface/cscheduler thread
11774 by:ajtowns -- [WIP] [tests] Rename functional tests
11773 by:jnewbery -- [tests] Change p2p-fullblocktest to use BitcoinTestFramework
11772 by:jnewbery -- [tests] Change invalidblockrequest to use BitcoinTestFramework
11761 by:Sjors -- [WIP] [docs] initial QT documentation
11759 by:jsarenik -- Docs: reflow the text and add better markup
11750 by:Elbandi -- Multiselect in coincontrol treewidget and display selected count
11748 by:merehap -- [Tests] Adding unit tests for GetDifficulty in blockchain.cpp.
11734 by:practicalswift -- rpc: Work around Clang thread safety analysis quirks
11733 by:practicalswift -- qt: Remove redundant locks
11726 by:MeshCollider -- Cleanups + nit fixes for walletdir PR
11711 by:fanquake -- bitcoin_qt.m4: Minor fixes and clean-ups.
11666 by:NicolasDorier -- [RPC] Add utility signinput
11658 by:luke-jr -- During IBD, when doing pruning, prune 10% extra to avoid pruning again soon after
11652 by:practicalswift -- Add missing locks to init.cpp (in AppInitMain + ThreadImport) and validation.cpp
11640 by:ryanofsky -- Make LOCK, LOCK2, TRY_LOCK work with CWaitableCriticalSection
11639 by:TheBlueMatt -- Rewrite the interface between validation and net_processing wrt DoS
11625 by:ryanofsky -- Add BitcoinApplication & RPCConsole tests
11616 by:jonasschnelli -- Update ban-state in case of dirty-state during periodic sweep
11563 by:promag -- Improve CheckBlockIndex performance
11545 by:instagibbs -- [wallet] Support CMV signing of 17~20 key template
11535 by:practicalswift -- Avoid unintentional unsigned integer wraparounds
11523 by:JeremyRubin -- [Refactor] CValidation State
11494 by:ajtowns -- Clarify BIP9 behaviour when nTimeout <= 0
11484 by:pedrobranco -- Optional update rescan option in importmulti RPC
11426 by:jtimon -- BIP90: Make buried deployments slightly more easily extensible
11402 by:promag -- [wallet] Use shared pointer for wallet instances
11383 by:luke-jr -- Basic Multiwallet GUI support
11359 by:esotericnonsense -- Add a pruning 'high water mark' to reduce the frequency of pruning events
11354 by:danra -- Coins DB: Improve handling of FRESH child with non-DIRTY parent in CCoinsViewCa…
11342 by:danra -- Sanity assert GetAncestor() != nullptr where appropriate
11291 by:dongsam -- Fix string concatenation to os.path.join and add exception case
11273 by:Xekyo -- WIP: Ignore old format estimation file
11231 by:danra -- Improve netaddress implementation
11194 by:theuni -- fees: optimize decay
11120 by:instagibbs -- [RPC] verifytxoutproof returns object including blockhash
11082 by:luke-jr -- Add new bitcoin_rw.conf file that is used for settings modified by this software itself
11020 by:kallewoof -- [wallet] getbalance: Add option to include non-mempool UTXOs
10975 by:practicalswift -- [script] Return early if no valid opcodes found in CountWitnessSigOps(...)
10947 by:NicolasDorier -- [Wallet] Bare segwit scriptPubKey should not considered change by the wallet
10896 by:TheBlueMatt -- Optimize compact reconstruction somewhat
10823 by:greenaddress -- Allow all mempool txs to be replaced after a configurable timeout (default 6h)
10800 by:theuni -- build: add lto configure option
10794 by:jonasschnelli -- Add simple light-client mode (RPC only)
10738 by:theuni -- net: drop custom CNode refcounting in favor of smart pointers
10730 by:luke-jr -- Move script flag to/from-string logic from tests to script/interpreter
10694 by:practicalswift -- Remove redundant code in MutateTxSign(CMutableTransaction&, const std::string&)
10638 by:practicalswift -- [rpc] Clarify pblock assumption via an assertion
10637 by:achow101 -- Coin Selection with Murch's algorithm
10585 by:kallewoof -- [WIP] PoW connection slots
10520 by:gentlejack -- 0.14
10437 by:sanch0panza -- [WIP] Implement BIP135 (generalized versionbits)
10434 by:sipa -- [WIP] 3072-bit MuHash based hash_serialized
10387 by:jonasschnelli -- Implement BIP159, define and signal NODE_NETWORK_LIMITED (pruned peers)
10386 by:kallewoof -- [wallet] Optional '-avoidreuse' flag which defaults to not reusing addresses in sends
10367 by:kallewoof -- [test] Test abortrescan command.
10350 by:CodeShark -- Added support for MSG_FILTERED_WITNESS_BLOCK messages.
10216 by:NicolasDorier -- [Wallet] FundRawTransaction can accept pre-set inputs whose parent is not yet broadcasted
10149 by:gentlejack -- gentlejack
10145 by:JeremyRubin -- Separate Contextual checks and handling & switch on enum in net_processing.cpp
10051 by:rubensayshi -- adhere to `-whitelist` for outbound connection
9938 by:JeremyRubin -- Lock-Free CheckQueue
9858 by:jameshilliard -- remove TestBlockValidity from CreateNewBlock critical path
9849 by:luke-jr -- Qt: Network Watch tool
9504 by:achow101 -- [RPC] dumpmasterprivkey command
9422 by:luke-jr -- Refactor mempool.dat to be extensible, and store missing info
9384 by:ryanofsky -- CCoinsViewCache code cleanup & deduplication
9381 by:ryanofsky -- Remove CWalletTx merging logic from AddToWallet
9332 by:ryanofsky -- Let wallet importmulti RPC accept labels for standard scriptPubKeys
9298 by:jonasschnelli -- [Wallet] use CHDPubKey, don't store child priv keys in db, derive on the fly
8735 by:jonasschnelli -- [Wallet] add option for a custom extended master privat key (xpriv)
8471 by:luke-jr -- Key origin metadata, with HD wallet support
8469 by:Christewart -- [POC] Introducing property based testing to Core
7949 by:jonasschnelli -- [RPC] Add RPC long poll notifications
concept: (75 PRs)
11849 by:jnewbery ACK: MeshCollider -- [tests] fix example_test
11839 by:instagibbs ACK: MarcoFalke -- don't attempt mempool entry for wallet transactions on startup if alr…
11836 by:hkjn conceptACK: sipa -- Rename rpcuser.py to rpcauth.py
11835 by:practicalswift ACK: MarcoFalke -- Add Travis check for unused Python imports
11797 by:hkjn ACK: laanwj -- trivial: Mention that wallet needs to be enabled for gettransaction
11771 by:jnewbery ACK: jamesob -- [tests] Change invalidtxrequest to use BitcoinTestFramework
11770 by:joemphilips conceptACK: jonasschnelli,laanwj -- [REST] add a rest endpoint for estimatesmartfee, docs, and test
11762 by:practicalswift ACK: promag -- Avoid locking mutexes that are already held by the same thread
11739 by:sdaftuar conceptACK: TheBlueMatt,gmaxwell -- RFC: Enforce SCRIPT_VERIFY_P2SH and SCRIPT_VERIFY_WITNESS from genesis
11689 by:practicalswift ACK: promag -- mempool: Fix missing locking in CTxMemPool::check(…) and CTxMemPool::setSanityCheck(…)
11678 by:achow101 conceptACK: jonasschnelli,promag -- [wallet] Don't shut down after encrypting the wallet
11667 by:MeshCollider conceptACK: jonasschnelli,laanwj -- Add scripts to dumpwallet RPC
11660 by:luke-jr conceptACK: jonasschnelli -- RPC: Internal named params
11634 by:practicalswift ACK: promag -- wallet: Add missing cs_wallet/cs_KeyStore locks to wallet
11630 by:sipa conceptACK: MeshCollider -- Simplify Base32 and Base64 conversions
11604 by:TheBlueMatt conceptACK: practicalswift,theuni -- [net] Remove ForNode/ForEachNode
11596 by:practicalswift ACK: TheBlueMatt -- Add missing cs_main locks when accessing chainActive
11577 by:practicalswift conceptACK: sipa -- Fix warnings (-Wsign-compare) when building with DEBUG_ADDRMAN
11558 by:sipsorcery ACK: laanwj -- Minimal code changes to allow msvc compilation
11516 by:practicalswift ACK: laanwj -- crypto: Add test cases covering the relevant HMAC-SHA{256,512} key length boundaries
11497 by:achow101 conceptACK: MeshCollider CONFLICTS -- Hide accounts system behind deprecation switch
11491 by:mess110 conceptACK: jonasschnelli -- [gui] Add proxy icon in statusbar
11485 by:MeshCollider conceptACK: jnewbery -- Add `available` field to listwallets RPC
11482 by:AmirAbrams ACK: promag -- Use CPrivKey typedef for keydata in CKey
11413 by:kallewoof conceptACK: esotericnonsense,jonasschnelli -- [wallet] [rpc] sendtoaddress: Add explicit feerate option to sendtoaddress
11398 by:jl2012 conceptACK: jtimon,sdaftuar CONFLICTS -- Hardcode CSV and SEGWIT deployment
11387 by:theuni conceptACK: jonasschnelli CONFLICTS -- net: remove more CConnman globals
11386 by:runn1ng conceptACK: promag CONFLICTS -- RPC: Consistently use UniValue.pushKV instead of push_back(Pair())
11372 by:sipa ACK: laanwj -- Address encoding cleanup
11256 by:esotericnonsense conceptACK: laanwj,morcos -- RPC: add weight to mempool entry output
11227 by:theuni conceptACK: laanwj CONFLICTS -- WIP: switch to libevent for node socket handling
11226 by:practicalswift conceptACK: TheBlueMatt,laanwj -- [WIP] Add Clang thread safety analysis annotations: GUARDED_BY(lock) / EXCLUSIVE_LOCKS_REQUIRED(lock)
11200 by:achow101 ACK: promag -- Allow for aborting rescans and canceling showProgress dialogs
11178 by:MeshCollider ACK: sipa -- Add iswitness parameter to decode- and fundrawtransaction RPCs
11085 by:dooglus ACK: MeshCollider CONFLICTS -- Add 'sethdseed' RPC to initialize or replace HD seed.
11041 by:promag conceptACK: jonasschnelli,laanwj CONFLICTS -- Add LookupBlockIndex
11019 by:kallewoof conceptACK: NicolasDorier -- [wallet] Abandon transactions that fail to go into the mempool
10994 by:ajtowns conceptACK: laanwj -- Add option to avoid warning on certain network upgrades
10984 by:TheBlueMatt conceptACK: jonasschnelli -- Allow 2 simultaneous (compact-)block downloads
10973 by:ryanofsky conceptACK: jonasschnelli -- Refactor: separate wallet from node
10839 by:practicalswift ACK: TheBlueMatt -- Don't use pass by reference to const for cheaply-copied types (bool, char, etc.)
10785 by:sipa conceptACK: jonasschnelli,laanwj -- Serialization improvements
10762 by:jnewbery conceptACK: TheBlueMatt,jonasschnelli CONFLICTS -- [WIP] [wallet] Remove Wallet dependencies from init.cpp
10757 by:jtimon conceptACK: jnewbery -- RPC: Introduce getblockstats to plot things
10742 by:practicalswift conceptACK: TheBlueMatt CONFLICTS -- scripted-diff: Use scoped enumerations (C++11, "enum class")
10740 by:jnewbery conceptACK: Sjors CONFLICTS -- [wallet] dynamic loading/unloading of wallets
10729 by:luke-jr conceptACK: jtimon -- Wrap EvalScript in a ScriptExecution class
10708 by:narula conceptACK: jonasschnelli CONFLICTS -- Connecttrace fewer blocks
10692 by:TheBlueMatt conceptACK: practicalswift CONFLICTS -- Make mapBlockIndex and chainActive and all CBlockIndex*es const outside of validation/CChainState
10669 by:jtimon ACK: MeshCollider -- Pow: Introduce MaybeGenerateProof
10657 by:str4d ACK: sipa -- Utils: Improvements to ECDSA key-handling code
10615 by:luke-jr conceptACK: jnewbery CONFLICTS -- RPC: Allow rpcauth configs to specify a 4th parameter naming a specific wallet (multiwallet RPC support)
10605 by:ryanofsky ACK: sipa -- [dotnotmerge] Add AssertLockHeld assertions in CWallet::ListCoins
10579 by:achow101 ACK: jnewbery -- [RPC] Split signrawtransaction into wallet and non-wallet RPC command
10554 by:somdoron conceptACK: laanwj -- ZMQ: add publishers for wallet transactions.
10443 by:ryanofsky conceptACK: jnewbery,paveljanik -- Add fee_est tool for debugging fee estimation code
10360 by:instagibbs conceptACK: morcos CONFLICTS -- [WIP] [Wallet] Target effective value during transaction creation
10353 by:luke-jr conceptACK: dcousens CONFLICTS -- Refactor script interpreter flags to use new CScriptFlags class for stricter checking
10271 by:fanquake ACK: jtimon -- Use std::thread::hardware_concurrency, instead of Boost, to determine available cores
10244 by:ryanofsky conceptACK: jonasschnelli,laanwj -- Refactor: separate gui from wallet and node
10202 by:NicolasDorier conceptACK: jonasschnelli CONFLICTS -- [Wallet] FundRawTransaction can fund a transaction with preset inputs found in the CoinView
10102 by:ryanofsky conceptACK: dcousens,laanwj CONFLICTS -- bitcoin-qt: spawn bitcoind and communicate over pipe (Experimental, WIP, Depends on #10244)
9806 by:droark conceptACK: jtimon,sidhujag CONFLICTS -- txoutsbyaddress index (take 3)
9753 by:ryanofsky conceptACK: theuni -- Add static_assert to prevent VARINT(<signed value>)
9719 by:rebroad ACK: jtimon -- Allow abort of ConnectBlock() when shutdown requested.
9680 by:ryanofsky conceptACK: jonasschnelli,laanwj -- Unify CWalletTx construction
9566 by:theuni conceptACK: jtimon CONFLICTS -- threading: use std::chrono for timestamps
9537 by:luke-jr ACK: ryanofsky CONFLICTS -- Wallet: Refactor ReserveKeyFromKeyPool for safety
9483 by:jonasschnelli conceptACK: jtimon CONFLICTS -- Complete hybrid full block SPV mode
9443 by:jl2012 conceptACK: laanwj,petertodd CONFLICTS -- Repairing the large-work fork warning system
9037 by:EthanHeilman ACK: sipa -- net: Add test-before-evict discipline to addrman
8755 by:jl2012 conceptACK: TheBlueMatt CONFLICTS -- Implement excessive sighashing protection policy with tight sighash estimation
8745 by:jonasschnelli conceptACK: jnewbery,laanwj CONFLICTS -- [PoC] Add wallet inspection and modification tool "bitcoin-wallet-tool"
8501 by:jonasschnelli conceptACK: jtimon CONFLICTS -- Add mempool statistics collector
7533 by:luke-jr conceptACK: jameshilliard,paveljanik CONFLICTS -- RPC: sendrawtransaction: Allow the user to ignore/override specific rejections
wip: (31 PRs)
11708 by:MeshCollider ACK: NicolasDorier conceptACK: jonasschnelli CONFLICTS -- Add P2SH-P2WSH support to signrawtransaction and listunspent RPC
11687 by:ryanofsky conceptACK: MeshCollider,laanwj,sipa -- External wallet files
11605 by:Sjors ACK: MarcoFalke conceptACK: TheBlueMatt,instagibbs,jonasschnelli,petertodd -- [Wallet] Enable RBF by default in QT
11599 by:ryanofsky ACK: practicalswift conceptACK: promag -- scripted-diff: Small locking rename
11583 by:TheBlueMatt conceptACK: MeshCollider,laanwj,practicalswift -- Do not make it trivial for inbound peers to generate log entries
11536 by:ryanofsky conceptACK: MeshCollider,jonasschnelli,laanwj -- Rename account to label where appropriate
11526 by:sipsorcery ACK: ryanofsky conceptACK: laanwj -- Visual Studio build configuration for Bitcoin Core.
11471 by:jonasschnelli ACK: laanwj conceptACK: Sjors -- [Qt] Optimize SendToSelf rendering with a single non-change output
11457 by:theuni conceptACK: JeremyRubin,TheBlueMatt,jonasschnelli,practicalswift -- Introduce BanMan
11400 by:jl2012 commitACK: MarcoFalke CONFLICTS -- [wallet] Remove segwit status check
11320 by:dooglus commitACK: jonasschnelli ACK: TheBlueMatt,jnewbery conceptACK: laanwj,luke-jr CONFLICTS -- Include the wallet name in log messages relating to wallets
11220 by:Sjors ACK: MarcoFalke conceptACK: JeremyRubin,sdaftuar,sipa -- Check specific validation error in miner tests
11089 by:luke-jr ACK: MeshCollider,instagibbs CONFLICTS -- Enable various p2sh-p2wpkh functionality
10996 by:ajtowns conceptACK: MeshCollider,laanwj,sipa -- Add per-network config file network.conf
10619 by:pavlosantoniou commitACK: benma,jtimon,practicalswift CONFLICTS -- [rpc]Avoid possibility of NULL pointer dereference in getblockchaininfo(...)
10583 by:achow101 ACK: jnewbery conceptACK: jtimon,laanwj -- [RPC] Split part of validateaddress into getaddressinfo
10470 by:mchrostowski commitACK: jonasschnelli ACK: RHavar CONFLICTS -- Fix for listsinceblock not filtering conflicted transactions
10366 by:kallewoof conceptACK: MarcoFalke,jtimon,practicalswift CONFLICTS -- [test] Remove all * imports
10279 by:TheBlueMatt ACK: jtimon conceptACK: ryanofsky,sipa -- Add a CChainState class to validation.cpp to take another step towards clarifying internal interfaces
10160 by:jnewbery ACK: promag conceptACK: NicolasDorier -- Add updatepeer RPC
9991 by:NicolasDorier ACK: EthanHeilman,JeremyRubin,jnewbery,nopara73 conceptACK: jonasschnelli CONFLICTS -- listreceivedbyaddress Filter Address
9728 by:NicolasDorier ACK: instagibbs conceptACK: jonasschnelli CONFLICTS -- Can create External HD wallet with -externalhd
9662 by:jonasschnelli ACK: NicolasDorier,laanwj,ryanofsky CONFLICTS -- Add `-disablehot` mode: a sane mode for watchonly-wallets
9608 by:jtimon ACK: dcousens conceptACK: jnewbery,theuni CONFLICTS -- Net: Divide ProcessMessage in smaller functions
9245 by:luke-jr conceptACK: TheBlueMatt,laanwj,rebroad CONFLICTS -- Drop IO priority to idle while reading blocks for getblock requests
9167 by:morcos commitACK: ryanofsky ACK: gmaxwell conceptACK: jonasschnelli CONFLICTS -- IsAllFromMe
8994 by:jtimon conceptACK: Sjors,btcdrak,jnewbery,rustyrussell CONFLICTS -- Testchains: Introduce custom chain whose constructor...
8723 by:jonasschnelli ACK: jmcorgan conceptACK: jtimon CONFLICTS -- [Wallet] Add support for flexible BIP32/HD keypath-scheme
8695 by:pstratem ACK: gmaxwell,rebroad CONFLICTS -- [Net] Retry feeler connection if OpenNetworkConnection fails in under 1ms.
8654 by:jl2012 ACK: NicolasDorier,btcdrak,sipa CONFLICTS -- Reuse sighash computations across evaluation (rebase of #4562)
7729 by:laanwj ACK: TheBlueMatt,andrewbaine,jnewbery,jonasschnelli,jtimon conceptACK: achow101,sipa CONFLICTS -- rpc: introduce 'label' API for wallet
review: (28 PRs)
11842 by:kallewoof commitACK: promag -- [build] Add missing stuff to clean-local
11831 by:TheBlueMatt commitACK: sipa ACK: MeshCollider -- Always return true if AppInitMain got to the end
11824 by:TheBlueMatt commitACK: achow101 ACK: jamesob -- Block ActivateBestChain to empty validationinterface queue
11806 by:Varunram commitACK: fanquake ACK: theuni -- [Build]: Modify error if boost lib is not found
11765 by:aaron-hanson commitACK: promag conceptACK: jonasschnelli -- [REST] added blockhash api, tests and documentation
11754 by:practicalswift commitACK: promag -- wallet: Add missing cs_wallet locks when accessing m_last_block_processed
11742 by:MarcoFalke commitACK: jonasschnelli conceptACK: NicolasDorier -- rpc: Add testmempoolaccept
11740 by:jonasschnelli ACK: laanwj,theuni -- Implement BIP159 NODE_NETWORK_LIMITED (pruned peers) *signaling only*
11694 by:practicalswift commitACK: TheBlueMatt -- rpc: Add missing cs_main lock in getblocktemplate(...)
11647 by:MarcoFalke commitACK: laanwj -- 0.15: Backports
11551 by:practicalswift commitACK: promag -- Fix unsigned integer wrap-around in GetBlockProofEquivalentTime
11515 by:promag commitACK: MarcoFalke -- Assert cs_main is held when retrieving node state
11512 by:TheBlueMatt commitACK: theuni -- Use GetDesireableServiceFlags in seeds, dnsseeds, fixing static seed adding
11475 by:mess110 commitACK: TheBlueMatt -- [rpc] mempoolinfo should take ::minRelayTxFee into account
11423 by:jl2012 commitACK: TheBlueMatt ACK: jonasschnelli conceptACK: NicolasDorier,jgarzik -- [Policy] Make OP_CODESEPARATOR and FindAndDelete in non-segwit scripts non-std
11415 by:achow101 commitACK: jnewbery conceptACK: jonasschnelli -- [RPC] Disallow using addresses in createmultisig
11403 by:sipa ACK: promag,theuni -- SegWit wallet support
11363 by:theuni commitACK: TheBlueMatt -- net: Split socket create/connect
11281 by:jonasschnelli ACK: achow101,laanwj -- Avoid permanent cs_main/cs_wallet lock during RescanFromTime
10699 by:sipa commitACK: TheBlueMatt ACK: laanwj -- Make all script validation flags backward compatible
10595 by:luke-jr commitACK: sipa -- Bugfix: RPC/Mining: Use pre-segwit sigops and limits, when working with non-segwit GBT clients
10594 by:luke-jr ACK: practicalswift,sipa -- Bugfix: net: Apply whitelisting criteria to outgoing connections
10519 by:achow101 ACK: MarcoFalke,promag,sipa -- [RPC] Remove waitforblock and waitfornewblock
10498 by:practicalswift ACK: MarcoFalke,benma -- Use static_cast instead of C-style casts for non-fundamental types
10267 by:kallewoof ACK: jnewbery,jtimon conceptACK: laanwj -- New -includeconf argument for including external configuration files
9502 by:jonasschnelli ACK: achow101,paveljanik,ryanofsky conceptACK: sdaftuar -- [Qt] Add option to pause/resume block downloads
9152 by:luke-jr commitACK: jonasschnelli ACK: jaromil conceptACK: laanwj -- Wallet/RPC: sweepprivkeys method to scan UTXO set and send to local wallet
8550 by:jonasschnelli ACK: Victorsueca,rebroad conceptACK: MarcoFalke,Mendeleyef,Sjors,jtimon,laanwj,paveljanik -- [Qt] Add interactive mempool graph
merge: (3 PRs)
11617 by:practicalswift commitACK: TheBlueMatt,promag -- Call FlushStateToDisk(...) regardless of fCheckForPruning
10677 by:instagibbs commitACK: fanquake,jonasschnelli -- RPC Docs: addmultisigaddress is intended for non-watchonly addresses
9598 by:practicalswift commitACK: TheBlueMatt,sipa -- Improve readability by removing redundant casts to same type (on all platforms)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment