Specifically though, I wanted a two stage function. Each node's announcement transaction is sent prior to building the block it ends up in. So, the hash of the block becomes dependent on the announcements. Therefore, no node can "optimize" his announcement transaction in order to have the fittest hash. The variable he must optimize against cannot yet be known. (I'm not completely sure I have the specified the example correctly. But that was the concept.)
Is there some benefit to getting the winning hash other than being the block that gets accepted? The hash is somehow based on the transaction log, right? So have the transactions in an alphanumeric order. Thus the only way to change the hash is to add or remove transactions. Difficult to do if everyone's watching. Very difficult to know if your 256-bit hash is going to be the best or not vs an 8-bit hash.
That is where non-anonymity comes it. Nodes can become known by choice. This does not automatically make their announcements any more trusted than anonymous announcements. It does however make these individuals identifiable to those who ALREADY trust/distrust them through business or personal relationships.
What about people who don't have any business with the network yet? Or haven't had any for some time?
Silly Example Bitcoin Tangent:
Say the NSA decides to mount a secret chain forking attack on bitcoin. So at the next difficulty change, they secretly begin building their own secret fork containing nothing but empty transaction blocks. Say they borrow one of those new GPU based super computing clusters the national science foundation sponsors. So at the end of two weeks, they have a 2050 block empty chain, to inject in and override bitcoins existing 2016 block transaction fork.
I have a little more faith in the intelligence of the NSA should they attempt to attack the bitcoin network. If the primary objective is to take down the network, all they need to do is attack the chain directly. I believe we've already discussed this. Transactions will slow or fail to get confirmed at all, recent history will be constantly re-written, and miners will make a lot less money, furthering the ease of the attack. They will not attempt to re-write long past history.
So what happens? Momentary chaos. All the exchanges stop trading. Everyone jumps on IRC and decides the new empty chain is a scam. They "lock in" the most recent block from the 2016 block chain, (issue new clients if they have to) and everyone just goes on ignoring the NSA chain. Or everyone decides, No damage done. No double spends. We'll just re-run all the transactions on top of the NSA chain and start trading again once we are caught back up.
How is causing the complete cessation of the network "no damage done"? Do you think if visa went down for a day that there would be "no damage done"? And if the developers are going to lock in a block, they are absolutely going to have to issue a new client that EVERYONE will need. And if they build on the NSA chain, all the miners who mined in those 2016 blocks just lost all of their money. That is a lot more than no damage done. And fuck relying on the developers to fix these problems. The network should be able to handle it itself. Relying on the developers to fix every major problem is such a pussy way out. And oh, hey look, it can just be done again for something as useless as a block checkpoint.
There really isn't a fundamental 51% issue.
There absolutely, unequivocally is.
Say the NSA tries the same trick. One fork has zero announcements from known parties. The other fork had a consistent chain of announcements. The basic rule says, "NEVER blindly trust a fork that everybody you know has vanished from." So every client just ignores the NSA fork, and there is zero chaos.
I'm aware we both have a solution to the 51% attack because hash power doesn't secure the network. That doesn't mean there aren't other issues that need to be ROCK SOLIDLY addressed.
So back to the exchanges for a moment. Keep in mind that exchanges DON'T trust each other. But they do have to monitor each other. Every exchange needs to be notified within seconds if the other exchanges disagree with their opinion of history. It doesn't initially matter who is right and who is wrong. If there is a fork, they MUST take human action.
LAME.
If there are 10 exchanges trading on the same chain, if one exchange sees the nine other announce on a different block, he has to follow or stop trading. That is a human decision. Maybe his node is faulty and made the wrong decision. Maybe all the others are malicious. Either way, it is fool hardy for him to pretend nothing wonky is happening.
LAME. What does this exchange tell its peers? "Something is going on right now lol, so anything you do here might not be reflected on the rest of the network. GL"
If 5 exchange announce on one block and 5 announce on another block, everyone has to stop trading until they can figure out what is happening. (Is this a bug? An NSA attack?) But the point is, they get the notice within seconds. The exchanges don't blindly follow each other out of trust. They monitor each other out of DISTRUST and based on a self-preservation requirement to do so.
Who says everyone has to stop trading? It's decentralized. If 5 are malicious, do you think they are going to tell their peers that they're malicious?
This should serve in every case where nobody is deliberately trying to subvert the consensus. But in cases where somebody is, the exchanges will immediately negotiate their differences, or there will be a nuclear exchange war.
I think you have a bit more fleshing out to do. Nuclear exchange war, while sounding cool, is not a solution to a 51% attack, it's another problem.
Merchants at a minimum need to stop considering their transactions as "confirmed" until things settle down.
A confirmation should be absolute.
They don't have to see 100% consensus in exchanges. Merchants just need to confirm their exchange isn't going rogue. And they need to see that their trading partners and competitors are all announcing onto the same block. It's the 99% strength in numbers thing. Until they are sure, they simply avoid announcing their commitment to any given block.
And do what, sit with their thumbs up their asses in the mean time? They are, apparently, waiting on somebody more trusted than them to figure out what is going on when that more trusted person may well be the cause of the problem.
Clients, on the other hand, may not care about exchanges at all. They simply want to know if they can buy something from Apple, McDonald's or whoever. If they STOP seeing announcements from the folks they have traded with in the past (easy to implement). Or don't see an announcement from a new merchant they want to trade with (also easy to implement). Then they should wait until the system settles. They simply periodically ping the merchants they use, asking each for their latest block announcement. Once they see consensus among their merchants, everything should be good to go.
Sounds far too complicated to me. What if the client wants to use a merchant they've never used before? Or a new client like I asked before? I don't see any manner for fork resolution other than "human intervention". You're gonna have to come up with something better than that if you want to convince people that this is a better option than a bunch of terahashes.