Thanks Mike, that's exactly the kind of detailed review I was looking
for. I think you're right an all points.
I'll simplify: I'll add a -banscore option (default 100), and if a
node accumulates more than -banscore misbehavior points it'll get
dropped and banned for -bantime (default 60*60*24) seconds.
I'll make bad signatures a banning offense, and I'll remove the
number-of-sigops and non-standard-transaction penalties.
I used a mutable field with const setter to avoid modifying a bunch of
methods to take non-const blocks/transactions instead of const; I
think it is appropriate because a block/transaction's DoS score is
really meta-data and not part of it's state.
I'll make GetTime() unit-test friendly as you suggest.