Hi all, I'm mostly active in the parent discussion group, but I am working on an alternative client in python, so I should be spending more time here. In recent days, I have realized that alternative clients could seriously disrupt BTC network unless their is very high standards for what it does. What I'm concerned about is someone making a really great GUI (like I plan to), that has a subtle vulnerabilities that the base group of developers have tried so hard to avoid (which I
don't plan to do). The last thing we want is to have 30% of users switch to a client that has a scripting bug in it that evaluates certain scripts to true that should be false, then the block chain starts getting messy with hundreds of invalid blocks and "reversed" transactions.
So, of course, I would ask if there is an existing description like what I ask for. If not, or if it's not complete, I would like to start one here. I want to create a living, master
checklist for developers to use, that they need to conform to before declaring their client "correct." This would include flood defense techniques, community-agreed transaction fee schedules, scripting unit-tests, network broadcast/forwarding rules, etc. I recognize a lot of this is in the C++ source code, but that's not the best way to document the standard...
I will start here with a short a short list of questions, and I'd like to get feedback concerning what is needed for a new client to be considered safe & "correct."
-- Node connection protocols: node-discovery techniques, node-cycling, suggested IP-rules, backwards-compatibility handling
-- Scripting:
- Would like to see a list of OP_KEYWORDs to be supported by the scripting engine (are they all the non-"Currently Disabled" words on the scirpting wiki?)
- Would like to see/create a set of reasonably-complex unit-test scripts that can be used to check the scripting engine, including most required keywords
- Tests would look like (scriptBinaryTest1, True), (scriptBinaryTest2, True), (scriptBinaryTest3, False), etc,
-- Reduced-memory nodes
- If a node is not intended to hold the entire blockchain, how should its network-protocols be adjusted?
- What classes of nodes can we define, and what are the associated capabilities:
-- A node that only holds it's own transaction list should only connect for getting information, not forwarding transactions or blocks (or maybe forwarding blocks, but not transactions?)
-- A reduced-footprint node should identify itself in some way on the network -- and other nodes would be aware and pick it's peers diversely... how?
-- Flood-disconnect conditions:
-What conditions should be applied before disconnecting a node (besides the bug currently disconnecting those downloading the block chain)
-What conditions determine whether a broadcast transaction is forwarded to other nodes/peers? Blocks forwarded?
- Does a node have to be able to check validity of all blocks/transactions to forward them?
- If a node is a reduced-memory-footprint node (not holding the entire blockchain), should it forward transaction even if it can't verify they are valid?
-- Transaction Fees:
- What is the current acceptable fee schedule?
- How much flexibility will we allow for developers to implement their own fee schedule?
- If a transaction fee is not included where we think it should be, should it be forwarded to other nodes?
-- Other:
-What are the timeout rules for peer nodes?
-What are the timestamping rules for creating new blocks (I know there's a median calculation based on a bunch of peers)
-Would like to see a list of checks required before declaring a transaction valid. A developer could easily remember to check the merkle tree root, but not that sum(TxIn)==sum(TxOut)
I know I'm forgetting a ton of stuff, but that's why this is a discussion and not a monologue
-Eto