All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.ethereum.core.Genesis Maven / Gradle / Ivy

Go to download

Java implementation of the Ethereum protocol adapted to use for Hedera Smart Contract Service

The newest version!
/*
 * Copyright (c) [2016] [  ]
 * This file is part of the ethereumJ library.
 *
 * The ethereumJ library is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * The ethereumJ library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with the ethereumJ library. If not, see .
 */
package org.ethereum.core;

import org.ethereum.config.SystemProperties;
import org.ethereum.db.ByteArrayWrapper;
import org.ethereum.util.ByteUtil;

import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;

/**
 * The genesis block is the first block in the chain and has fixed values according to
 * the protocol specification. The genesis block is 13 items, and is specified thus:
 * 

* ( zerohash_256 , SHA3 RLP () , zerohash_160 , stateRoot, 0, 2^22 , 0, 0, 1000000, 0, 0, 0, SHA3 (42) , (), () ) *

* - Where zerohash_256 refers to the parent hash, a 256-bit hash which is all zeroes; * - zerohash_160 refers to the coinbase address, a 160-bit hash which is all zeroes; * - 2^22 refers to the difficulty; * - 0 refers to the timestamp (the Unix epoch); * - the transaction trie root and extradata are both 0, being equivalent to the empty byte array. * - The sequences of both uncles and transactions are empty and represented by (). * - SHA3 (42) refers to the SHA3 hash of a byte array of length one whose first and only byte is of value 42. * - SHA3 RLP () value refers to the hash of the uncle lists in RLP, both empty lists. *

* See Yellow Paper: http://www.gavwood.com/Paper.pdf (Appendix I. Genesis Block) */ public class Genesis extends Block { private Map premine = new HashMap<>(); public static byte[] ZERO_HASH_2048 = new byte[256]; public static byte[] DIFFICULTY = BigInteger.valueOf(2).pow(17).toByteArray(); public static long NUMBER = 0; private static Block instance; public Genesis(byte[] parentHash, byte[] unclesHash, byte[] coinbase, byte[] logsBloom, byte[] difficulty, long number, long gasLimit, long gasUsed, long timestamp, byte[] extraData, byte[] mixHash, byte[] nonce){ super(parentHash, unclesHash, coinbase, logsBloom, difficulty, number, ByteUtil.longToBytesNoLeadZeroes(gasLimit), gasUsed, timestamp, extraData, mixHash, nonce, null, null); } public static Block getInstance() { return SystemProperties.getDefault().getGenesis(); } public static Genesis getInstance(SystemProperties config) { return config.getGenesis(); } public Map getPremine() { return premine; } public void setPremine(Map premine) { this.premine = premine; } public void addPremine(ByteArrayWrapper address, AccountState accountState) { premine.put(address, new PremineAccount(accountState)); } public static void populateRepository(Repository repository, Genesis genesis) { for (ByteArrayWrapper key : genesis.getPremine().keySet()) { final Genesis.PremineAccount premineAccount = genesis.getPremine().get(key); final AccountState accountState = premineAccount.accountState; repository.createAccount(key.getData()); repository.setNonce(key.getData(), accountState.getNonce()); repository.addBalance(key.getData(), accountState.getBalance()); if (premineAccount.code != null) { repository.saveCode(key.getData(), premineAccount.code); } } } /** * Used to keep addition fields. */ public static class PremineAccount { public byte[] code; public AccountState accountState; public byte[] getStateRoot() { return accountState.getStateRoot(); } public PremineAccount(AccountState accountState) { this.accountState = accountState; } public PremineAccount() { } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy