Sporkage is just putting the rules you mention into action. Same as if they were hardcoded in the first place.
Of course they had to be hardcoded in the first place for the spork to even work, but the fact that the software can be influenced by an external "switch" that can be turned on or off at any time is not in the spirit of cryptocurrencies. I am fine with it for betas/RCs/development/whatever, but the final product should definitely not have any spork switches.
I don't believe enforcement was ever difficult to implement, I think the problems resulted from the payment/election code sometimes causing different nodes to believe different masternodes should be paid. So when enforcement was switched on (via hard fork), little forks started emerging because there wasn't consensus.
That is what I understand to have been happening; could've been something else though.
This is certainly believable, and I guess it would be a problem if a given miners/pools "chose" the same MNs over and over again, excluding other MNs.
1. However, it is better for them to be paying MNs than not at all.
Personally I've always thought the "election" process was convoluted and prone to error (given that not all MNs can necessarily always be seen by all nodes on the network) and that the coinbase transaction should simply pay the MNs who provably performed the mixing during that particular block. Split it up among them proportionately. The clients will choose which MNs to send to at random; or if they mess with the code to always favor certain MNs, that's fine too (although they will probably be losing some privacy if they choose to always use their own MN = shooting themselves in the foot = hopefully nobody is so stupid as to do this). The MNs are paid for providing a service, and if they provide that service in a given block, then they should be paid in that block. JM2C
1. I believe this should have been a fairly easy "enforcement" switch to code, but in reality wouldn't have done too much. I believe the cause of the forking to have been nodes thinking different MNs should be paid, and rejecting the blocks that paid, but didn't pay the "right" node. However, just making so 20% had to be split off or the block rejected would allow the miner to just pay themselves in a separate transaction.
I think you have an interesting idea in doing that PoSvc thing (which I believe "flare" has talked about at dct): you should be able to determine which masternode signed each denomination transaction included in the block.
It sounds very cool and elegant at first, but it too has vectors that must be considered. Nothing stops you from choosing a masternode; they just sit around waiting for inputs. So you could constantly denominate the smallest # of inputs (to minimize fees) using your own node, which would nearly guarantee its inclusion in every block for payment. This only wouldn't make sense if fees were higher than the payout.
Additionally, what happens if no denominate transaction occurs in a particular block? Is the mining node then able to keep the entire reward for himself? What then happens if he simply refused to include those transactions in his block (I'm not sure how you can force them to include transactions?).
Several other ideas are rolling around in my head, mostly in relation to masternodes somehow/sometimes having block minting authority. I need to think about it some more though.
Ok, good points.... keeping up a synchronized, agreed-upon list of MNs throughout the network is the real crux here. Especially since it definitely needs to account for MNs dropping out of the network from time to time. Which shouldn't really happen, but it will happen for various reasons. So yeah, that idea definitely has some flaws that would be hard to work through.
How about this. Each block, a group of MNs is "nominated" by the block hash. The hash simply matches a few bits of the MN's public address... target this so that each block hash should "nominate" 5-10 MNs on average. Then all of the nominated MNs will be required to create "ping" transactions and push them to the network within 2 blocks. These transactions will be included in these next 2 blocks. Take the hash of the 2nd block after the original "nomination" block, and use it to determine the winner (among the nominees who have correctly "pinged" back) of the MN prize that will be generated by the coinbase transaction in the next, 3rd block. If for some reason a block hash doesn't match any MNs (or no MNs happen to "ping" in time -- which is equivalent in result), then there would be a fallback option such as awarding the prize to a different MN that wasn't chosen in the previous block, but was nominated and "pinged" back correctly.
This gets rid of the problem of having to keep a current, up-to-date list of all MNs throughout the network. The MNs themselves are responsible for letting the network know that they are out there by the "ping" transactions, and they can be called upon at any time due to the random nature of the nomination process, so therefore they must be ready to quickly respond at any time. If they miss a "ping" then they will be penalized by not being eligible for the reward the next time they are nominated. All MN-payment-eligible addresses will have their public addresses in the blockchain immediately prior (1 or 2 blocks) to the block which pays them out, and the reward will be awarded to one of the nominees in a deterministic fashion, which eliminates confusion and rejection of blocks due to nodes not being aware of a particular MN on the network.
There might be some problems that crop up with this process due to orphan blocks. Perhaps the ping-response-time should be set to 5 or even 10 blocks instead of 2. But I have been chewing on this kind of idea for a while now, and I think it could work for the MNs.