Rather than quizzes, I've been working on enumerating some programming exercises for people to do if they want to start Bitcoin programming.
I was thinking that a nice open source project would be to build a node validator. This would not have to be fast (or capable to handling 1000+ connections).
You would start the validator and then start your node-under-test with checkpoints disabled and an addnode=localhost:12345 (is there a "disable blacklist option"?).
The validator would listen on that port and when it gets a connection, it would make a 2nd connection to the node-under-test.
The validator would feed it transactions and blocks and see how it responds on the 2nd connection. If the node-under-test forwards a bad tx or fails to forward a valid one, then it would fail that test.
It could go through a sequence and test all functionality that a node is supposed to perform. It could also check the "protocol guidelines", so make sure the node acts "socially responsibly".
Things like bandwidth limiting of forwarding transactions could be an issue. However, in many cases, receiving the inv message (tx or block) would be sufficient to indicate if the node planned to forward it.
One of the tests could be to see if the node limits bandwidth per client.
Once finished, it would display a list of tests and the result.
The benefit is that it would be a way for new clients to be tested in a systematic way. It wouldn't matter what language the new client was programmed in, since the test uses TCP connections.
Another project would be a "gatekeeper" for miners.
This would be a piece of software that only forwards inv messages for transactions and blocks which are forwarded by a group of test nodes.
The setup would be
Internet <---->
<----> <----> <---->
The passthrough node would connect to the internet. It would guarantee that each of the test nodes gets the exact same ordering of blocks, but do no checking other than that.
When a new block is found, it would be processed by the test nodes and when verified, they would send an inv to the gatekeeper. The gatekeeper would only request the block, when the last test node sends an inv for it. It then pulls it from one of them and forwards it (unchecked) to the mining node.
This means that blocks and transactions which aren't accepted by all test nodes wouldn't be sent to the miner.
The test nodes could be the latest versions of the reference client and a few other popular clients.
This slows things down for the mining node.
The passthrough could act as a switch and normally forward all messages to the mining node directly. If the gatekeeper detects disagreement between the test nodes, then it would order the passthrough node to stop forwarding to the mining node. It would also send an email/text to the admin.
This prevents the miner from following a building on a fork which is not accepted by some of the other clients.