We use the modified inclusive protocol
in Ethereum for rewards system[8] and the longest chain rule
for a chain-selection system.
There is an Ethereum contract that stores all the other Ethereum chain's block headers relayed—submitted by users, or relayers. As you know, each block contains committed transactions. Given a block header, anyone will be able to verify if a transaction is included or not with merkle-proof. Now we can offer a transfer services from ETH_1 to ETH_2.
Ghost contract is able to treat blockchain reorganization(a.k.a. reorg) problem using the longest chain rule. Maybe it is able to treat two sides reorg because not relayer but the smart contract selects confirmed block...?
Ethereum Header[1]
Also you can see block header features in web3.js—Ethereum JavaScript API.
export interface BlockHeader {
number: number;
hash: string;
parentHash: string;
nonce: string;
sha3Uncles: string;
logsBloom: string;
transactionRoot: string;
stateRoot: string;
receiptRoot: string;
miner: string;
extraData: string;
gasLimit: number;
gasUsed: number;
timestamp: number;
}
export interface Block extends BlockHeader {
transactions: Transaction[];
size: number;
difficulty: number;
totalDifficulty: number;
uncles: string[];
}
GHOST Protocol[2]
The GHOST(Greedy Heaviest Observed SubTree) protocol is designed for higher security under short block interval(time). GHOST includes uncle blocks' rewards of 87.5% and nephew's reward of 12.5% to solve centralization. But the Ethereum version of Ghost only goes down seven levels in the height of the blockchain.
These are some rules that GHOST in Ethereum has to follow[3].
- A block must specify its parents and its number of Uncles.
- An Uncle included in a block must be a direct child of the new block and less than seven blocks below it in terms of height
- It cannot be the direct ancestor of the block being formed.
- An Uncle must have a valid block header.
- An Uncle must be different from all other Uncles in previous blocks and the block being formed.
- For every Uncle included in the block the miner gets an additional 3.125% and the miner of of the Uncle receives 93.75% of a standard block reward.
Inclusive Protocol[4]
In the current Bitcoin protocol, every block form a tree due to forks in the network. But, in Inclusivce protocol, each block references a subset of previous blocks so they form a DAG(Directed Acyclic Graph).
Inclusive-F, the Inclusive version of the chain selection rule, is defined like below algorithm.
You can see the details in this paper[4].
Rougly in Inclusive,
- A new block references multiple predecessors.
- Non-conflicting transactions of blocks outside the main chain are included in the ledger. Also these blocks' miners receive some transaction fees.
- Miners of blocks outside the main chain receive some fraction of mining rewards.
However, Ethereum use a modified version of the Inclusive protocol. In Ethereum,
- A new block references multiple predecessors (a parent and 0 or more uncles).
- While transactions in uncle blocks are not included in the ledger nor do their miners receive transaction fees.
- But uncle blocks' miners do receive some fraction of mining rewards[5].
Dose Ethereum abandon both GHOST protocol and Inclusive protocol?[7]
- around 24 min. in video.
- He said "Today's Ethereum is just following the longest chain rule".
Yes. Ethereum abandons both things but adopts the longest chain rule.
Ethereum does use neither GHOST protocol
nor Inclusive protocol
. Today's Ethereum is just following the longest chain
rule[5][6][7].
Nick Johnson who is core developer for the Ethereum Foundation said:
- Ethereum determines the longest chain based on the total difficulty, which is embedded in the block header. Ties are broken randomly.
...
// If the total difficulty is higher than our known, add it to the canonical chain
// Second clause in the if statement reduces the vulnerability to selfish mining.
// Please refer to http://www.cs.cornell.edu/~ie53/publications/btcProcFC.pdf
if externTd.Cmp(localTd) > 0 || (externTd.Cmp(localTd) == 0 && mrand.Float64() < 0.5) {
// Reorganise the chain if the parent is not the head block
if block.ParentHash() != self.currentBlock.Hash() {
if err := self.reorg(self.currentBlock, block); err != nil {
return NonStatTy, err
}
}
self.insert(block) // Insert the block as the new head of the chain
status = CanonStatTy
} else {
status = SideStatTy
}
...
- Total difficulty is the simple sum of block difficulty values without explicitly counting uncles. Difficulty is computed based on parent difficulty and timestamp, block timestamp, and block number, again without reference to uncles.
externTd := new(big.Int).Add(block.Difficulty(), ptd)
expd := CalcDifficulty(config, header.Time.Uint64(), parent.Time.Uint64(), parent.Number, parent.Difficulty)
- All of these except tiebreaking are consensus-critical, and so can be expected to be the same across all clients.
See the details of the above code here.
Each smart contract maintains state in its own permanent storage. Storage is extremely sparsely populated, and there’s no need to store the zeros. A key/value store mapping 32-byte keys to 32-byte values will do the job nicely. An absent key is simply defined as mapping to the value zero.
Because zeros don’t take up any space, storage can be reclaimed by setting a value to zero. This is incentivized in smart contracts with a gas refund when you change a value to zero.
-
There are no deleting a mapping in solidity. The only way to clear the data is to overwriting. Therefore, you have to concern about the gas consumption issues.
-
Although there is a gas refund system in EVM, it can make loss that overwriting consumes more gas than refund one[12].
[1] G. Wood, "Ethereum a secure decentralised generalised transaction ledger", 2014.
[2] Sompolinsky Y., Zohar A., "Secure High-Rate Transaction Processing in Bitcoin", 2015.
[3] https://www.cryptocompare.com/coins/guides/what-is-the-ghost-protocol-for-ethereum/
[4] https://fc15.ifca.ai/preproceedings/paper_101.pdf
[5] https://ethereum.stackexchange.com/questions/38121/why-did-ethereum-abandon-the-ghost-protocol
[6] https://ethereum.stackexchange.com/questions/13378/what-is-the-exact-longest-chain-rule-implemented-in-the-ethereum-homestead-p
[7] https://www.youtube.com/watch?v=57DCYtk0lWI
[8] https://github.com/ethereum/go-ethereum/blob/master/consensus/ethash/consensus.go#L186
[9] https://stackoverflow.com/questions/48515633/deleting-mapping-from-mapping-in-solidity
[10] https://programtheblockchain.com/posts/2018/03/09/understanding-ethereum-smart-contract-storage/
[11] https://stackoverflow.com/questions/48515633/deleting-mapping-from-mapping-in-solidity
[12] https://ethereum.stackexchange.com/questions/64217/gas-usage-higher-when-using-the-delete-keyword