This would impact bots not-one-bit and would give humans four times as much wall clock time to solve. What am I missing?
Bots can generate 4, or 10, or more blocks in the time it takes for a human to solve one block. It's just no match. How would 4x wall clock help? or... how could you prevent bots from doing it faster?
Again these are two entirely separate issues. The intent of this patch would not be to slow the bots, but to give humans the same relative wall-clock time to solve. I'm using N=4 because it is simple to think about, and because currently the bots appear to be roughly 2 to 4 times as productive as humans.
If bots were 100 times as productive as humans, on average, then N "should" be 100, and things start to get a little goofy. The other (primary and unrelated) goal of slowing down the bots is something that needs to be addressed seperately.
As I said we could make N scale dynamically against the block rate, as well, to keep the ratio of "bot time" and "human time" roughly in check. However, right now I think even a fixed N=4 would be a huge improvement, and would roughly align with the (current) 2-4x overproduction of the bots. I do expect this overproduction to increase in time, but currently it seems to be fairly consistent judging from the spreadsheet and current block rates.
a bot can find a solution that takes 25 secs to find the coin in less than 1 second because it does not need to play in real time, and it's not limited by human reflexes.
I don't think any bot can currently find solutions consistently in under 1 second. This could change, but really just means an increase in the value of N to maintain the ratio of "bot reflex time" to "human reflex time"
Another problem: say there are 1000 blocks in the chain (each using the previous one for their map) and you choose to generate a map from block 998 and solve a new block that is 1001. And for the next 5 blocks, everyone just uses the last of the chain. So the blocks 999 and 1000 were never confirmed. All transactions that it had would need to be included in block 1001 or 1002. This would have to be enforced somehow by the protocol. Possible, but messy and not easy to code.
It's not as simple as a chain, because block 1001 points to block 998, but so does block 999,
Block 1001 would confirm block 998. Block 1002 would have work over block 1001, which refers to block 1000 as previous, which in turn refers to block 999 as previous, which in turn refers to block 998, and so on. So block 1002 would confirm not only block 1001 but every block already in the chain before it. Block 999 might never actually be used for work input at all, but as long as some block 1000+ *was* used for work input (and eventually one of them would have to be, since N is finite) it would be confirmed. Block 999 could never be changed once block 1000+ was worked over without also forming a whole new chain after it. If we are on block 1010 and I want to rewrite history in block 999 (which was never directly worked over) I need to create not only a new block 999 but 12 new blocks after it, to win longest chain, and I need to do so faster than the rest of the network can create new blocks ahead of me. (Or, in other words, I need to 51% attack.)
When you prove work over a block you are confirming and securing not only that block's contents, but the contents of every block predecessor to it as well. As long as a successor of a block is (eventually) proved over, that block is (eventually) proved over.