Before I post my revisions, let's touch base on the NXT scheme. My understanding is that, regardless of stake, the first valid PoS block received by a node which meets the target is the winner. It's just that the target is harder, and in general will be met later for small stakes than large ones. If a node receives a valid block, before it has launched its own, then it won't launch. I would imagine that in such a scheme, relatively few blocks launch, but if two are launched near simultaneously (or which become valid near simultaniously) in distant parts of the network, then the likelihood of a fork with both branches being built on is high. How do you propose to eliminate side-chains?
With my scheme, a lot more PoS blocks will be launched, and even more PoS without a block, so the level of network chatter will be higher, but the voting will ensure that side-chains will very quickly become moribund, and will die when the recent stake value of the main chain gets high enough.
When reading the following be careful to distinguish between the Stake Value (SV) of an account (ASV), the SV of a block (BSV), and the SV of a chain (CSV). These will all have different definitions. There will be two kinds of PoS, those that come with an associated block (PoS+B) and those that don't (PoS-B). I'm also not going to consider timing issues as my goal here is just to get the idea across.
The timing can be solved by having nodes not care about the hours or minutes, only the seconds, and by having nodes periodically poll their peers for the latters' view of Elastic Network Time (ENT) and taking the average (appropriately defined. If one peer is 01 and another is 57 then their average is 59). Over time the nodes should converge.
Assume that we want to regard as confirmed any block once it is N blocks deep into the blockchain.
My new idea is similar to my old one, in that for each block, there is a refectory period followed by a bidding period.
I suggest a change in terminology. Call this the voting period rather than the bidding period. I think this more clearly reflects what is going on.
As before, each node discards any invalid PoS (i.e., those that violate the protocol, or those that do not extend a live chain) on sight, along with its block if it has one, and for each live chain, if it receives more than one valid PoS+B extending that chain, it regards the block with the highest ASV as the (local) winner.
If a PoS+B is ineligable to extend the chain due to that account already having won too recently, then it will not win, but could still participate collaterally.
It also keeps track of every other (valid) PoS - with or without block - it receives. (It could discard the blocks of losing PoS+B, so long as it has a way to recover them from other nodes, if necessary.) Nodes should discard or reject a PoS-B whenever it has decided to retain at least the PoS of a PoS+B from the same account.
At the start of the bidding period, a node should launch a PoS+B, for any account it controls with ASV greater than x% of the ASV of the account it regards as having won the last block. Because ASVs are likely to obey
Zipf's law, x could probably be set quite low without causing flooding. Other nodes may have a different view of the winner of the last block, so a PoS+B might legitimately be launched, but rejected by other nodes who do not think its ASV is high enough. (Nevertheless, a node should retain an otherwise valid PoS+B from an account it judges to have insufficient ASV for as long as it is the highest ASV PoS+B it has seen. As soon as it sees another with a higher value, it can discard the lower one.)
In addition, the node should try to create a PoS-B for every account it controls with ASV > 0,
Or ASV > some threshold.
including accounts for which it has launched PoS+B. (The duplication is necessary because, as stated above legitimately submitted PoS+B may be rejected by other nodes due to insufficient ASV.) Unlike PoS+B, PoS-B will have to pass a hash value test which depends upon the account's ASV as with NXT. If successful, these are also launched at the start of bidding. Valid PoS-B are never rejected on grounds of insufficient ASV.
I would abandon this hash value test. for reasons given in my earlier reply to Dink. Also the last sentence would no longer apply though the stake threshold for a PoS-B would be less than for a PoS+B.
Finally, as a last resort, if a node has neither launched a block nor received a (valid) one (including otherwise valid blocks from accounts with insufficient SV) then it should launch a PoS+B for its highest SV account according to the delay schedule described in my previous suggestion.
All launched PoS (both PoS+B and PoS-B) should extend the chain with the greatest CSV, according to the launching node.
The end result of all of this, is that so long as a node controls at least one account with ASV > 0, there will be at least one chain extended by a PoS+B. Any chain not so extended dies. Also a chain dies if it's CSV is less than y% of the CSV of the winning chain.
Sidechains should be allowed to develop a few blocks, to test the network's view on them, before killing them off.
Apart from the addition of PoS-B, The new scheme differs from the previous in that an account's ASV is no longer the time integral of its balance. Instead it is equal to the lowest balance that the account has had during the last N blocks. An account that was created or which has won a block fewer than N blocks ago has an ASV of zero.
The block extending a chain has a BSV equal to it's own ASV plus the ASV of all other PoS+B and PoS-B extending the same chain. Call these other contributors of ASV to the BSV "collateral support". No account's ASV is counted more than once in the past N blocks, so if any of the PoS, including the winning PoS+B has already contributed collaterally to the BSV of an earlier block in the chain, then it is not counted again. Nor, if a block is added to a collateral supporter, does the new block add to the collateral support. In other words, collateral support is given to sisters, not aunts. The CSV is the sum of the last N blocks' BSVs.
The idea behind collateral support is that the main chain will benefit from honest PoS more than any side-chain, including a side-chain being built by an attacker. (If the attacker's chain benefits more, then it is the main chain by definition.) Moreover an attacker can gain nothing by diverting his resources into his own collateral sybils, since this will just take away ASV from his winning blocks. This is a zero-sum game for him. PoS-B allows every account-holder with any ASV at all a chance to contribute collaterally to blockchain security, though they can never win a block unless their ASV is enough to allow them to launch a PoS+B. Every PoS, with or without block, will need to has all the PoW supporting it's predecessor.
To summarise: PoS+B need to meet an ASV threshold, but not a hash threshold. BoS-B need to meet a hash threshold, but no ASV threshold. Note that the attack I describe above is defeated. A PoS miner cannot PoW his PoS+B because there is no hash target to meet. Neither can he PoW his PoS-B because there is no block to diddle.
This is slick, but again I think the whole hash target thing in these scheme would result in tiny accounts getting to stake, while larger accounts can't.
If a fork persists longer than N blocks, then we increase N by 1 per block so that it always covers at least as far back as the fork point.
For clarity, leave N fixed, and let M be the number of blocks back to the earliest live fork point, or M=N if larger.
To maintain the fork, an attacker will have to bring ever more resources to bear. Or increase his chain's CSV past that of the main chain, at which point it takes over as the main chain. To do this, he will need to own N account each with a higher balance than anyone else. If we ever see the same N accounts winning over and over, we could increase N even if we don't see a fork.
I have a different way to prevent the same N accounts winning over and over again. For any given chain, order the PoS+B trying to extend it by ASV. Then the one with the Highest ASV wins straight away so long as it hasn't already won in the last M blocks. Else if it won n blocks ago with n<=M, multiply its ASV by n/N, and move on to the next. If the PoS+B with the next highest ASV hasn't won in the last M or 2N blocks (whichever is greater), then it wins straight away. Else if it won n
If no block wins straight away choose a block which has won the least number of times during the last M blocks. Usually this number will be zero. If there are several blocks tying on this metric, use the modified ASV as the tie-breaker.
With this scheme, larger stakes will win the block more often, but, so long as there is an alternative, never more than once since transaction confirmation or the oldest live fork point. Smaller stakes get to win occasionally.