Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add flag to init account state from genesis json file for fakenet #424

Draft
wants to merge 2 commits into
base: develop
Choose a base branch
from

Conversation

hadv
Copy link
Contributor

@hadv hadv commented Feb 8, 2023

to more convenient for running testing by using fakenet, we introduce the --init genesis.json flag to be able allocate some account and pre-compiled contract for testing.

the genesis json file example

{
  "alloc": {
    "cf49fda3be353c69b41ed96333cd24302da4556f": {
      "balance": "0x123450000000000000000"
    },
    "0161e041aad467a890839d5b08b138c1e6373072": {
      "balance": "0x123450000000000000000"
    },
    "87da6a8c6e9eff15d703fc2773e32f6af8dbe301": {
      "balance": "0x123450000000000000000"
    },
    "b97de4b8c857e4f6bc354f226dc3249aaee49209": {
      "balance": "0x123450000000000000000"
    },
    "c5065c9eeebe6df2c2284d046bfc906501846c51": {
      "balance": "0x123450000000000000000"
    },
    "0000000000000000000000000000000000000314": {
      "balance": "0x0",
      "code": "0x60606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063a223e05d1461006a578063abd1a0cf1461008d578063abfced1d146100d4578063e05c914a14610110578063e6768b451461014c575b610000565b346100005761007761019d565b6040518082815260200191505060405180910390f35b34610000576100be600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506101a3565b6040518082815260200191505060405180910390f35b346100005761010e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506101ed565b005b346100005761014a600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610236565b005b346100005761017960048080359060200190919080359060200190919080359060200190919050506103c4565b60405180848152602001838152602001828152602001935050505060405180910390f35b60005481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b919050565b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050565b7f6031a8d62d7c95988fa262657cd92107d90ed96e08d8f867d32f26edfe85502260405180905060405180910390a17f47e2689743f14e97f7dcfa5eec10ba1dff02f83b3d1d4b9c07b206cbbda66450826040518082815260200191505060405180910390a1817fa48a6b249a5084126c3da369fbc9b16827ead8cb5cdc094b717d3f1dcd995e2960405180905060405180910390a27f7890603b316f3509577afd111710f9ebeefa15e12f72347d9dffd0d65ae3bade81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18073ffffffffffffffffffffffffffffffffffffffff167f7efef9ea3f60ddc038e50cccec621f86a0195894dc0520482abf8b5c6b659e4160405180905060405180910390a28181604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a05b5050565b6000600060008585859250925092505b935093509390505600a165627a7a72305820aaf842d0d0c35c45622c5263cbb54813d2974d3999c8c38551d7c613ea2bc1170029",
      "storage": {
        "0x0000000000000000000000000000000000000000000000000000000000000000": "0x1234",
        "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9": "0x01"
      }
    },
    "0000000000000000000000000000000000000315": {
      "balance": "0x9999999999999999999999999999999",
      "code": "0x60606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063ef2769ca1461003e575b610000565b3461000057610078600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061007a565b005b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051809050600060405180830381858888f1935050505015610106578173ffffffffffffffffffffffffffffffffffffffff167f30a3c50752f2552dcc2b93f5b96866280816a986c0c0408cb6778b9fa198288f826040518082815260200191505060405180910390a25b5b50505600a165627a7a72305820637991fabcc8abad4294bf2bb615db78fbec4edff1635a2647d3894e2daf6a610029"
    }
  }
}

to run fakenet with a genesis file

opera --fakenet=1/1 --init=genesis.json

Copy link
Contributor

@rus-alex rus-alex left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let me explain the points:

... create test accounts and contracts at the beginning of the test, not by genesis.

Ethereum/hive uses that way along with genesis.json (see example). I just suggest to use single approach, not both.

... to see full account history in the test scenario and don't keep genesis state in mind.

The same idea described at ethereum/hive, and I don't know why they move some test contracts to the genesis.json as binary blobs without sources. Looks like ethreum/hive is immature yet.

So I prefer to change hive go-opera tests but don't change go-opera for testing.

Here is the some ready snippets for you :

}

func FakeGenesisStoreWithRulesAndStart(num idx.Validator, balance, stake *big.Int, rules opera.Rules, epoch idx.Epoch, block idx.Block) *genesisstore.Store {
func FakeGenesisStoreWithRulesAndStart(num idx.Validator, balance, stake *big.Int, rules opera.Rules, epoch idx.Epoch, block idx.Block, g *core.Genesis) *genesisstore.Store {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No needs to use whole core.Genesis when you need core.Genesis.Alloc only.
Anyway ethreum core.Genesis is foreign struct for go-opera, no reasons to use it at all. Let's keep fake genesis as simple as possible (i.e. as it is).
The way I suggest is create test accounts and contracts at the beginning of the test, not by genesis. It is more clean to see full account history in the test scenario and don't keep genesis state in mind.

@hadv hadv marked this pull request as draft February 10, 2023 04:15
@hadv
Copy link
Contributor Author

hadv commented Feb 10, 2023

Let me explain the points:

... create test accounts and contracts at the beginning of the test, not by genesis.

Ethereum/hive uses that way along with genesis.json (see example). I just suggest to use single approach, not both.

... to see full account history in the test scenario and don't keep genesis state in mind.

The same idea described at ethereum/hive, and I don't know why they move some test contracts to the genesis.json as binary blobs without sources. Looks like ethreum/hive is immature yet.

So I prefer to change hive go-opera tests but don't change go-opera for testing.

okay, I understand your concern. By the way, I still open to change smth that can be easier for testing and much compatibility with hive-node to save effort to change smth big on hive go-opera.

Currently, I just use the genesis for init account but we might need to add some rule config as well to test the fork/upgrade chain.

I think they use contracts on genesis block as they noted here (tbh, I still cannot figure out why they need to fund account from a vault smart contract like that neither). using contract blob in genesis It's not kind of immature, it's supported by ethereum so they re-use in hive for testing purpose.

// vault creates accounts for testing and funds them. An instance of the vault contract is
// deployed in the genesis block. When creating a new account using createAccount, the
// account is funded by sending a transaction to this contract.
//
// The purpose of the vault is allowing tests to run concurrently without worrying about

Here is the some ready snippets for you :

Deploy a new smart contract for testing is not hard, but the goal of the rpc test is to check the JSON RPC API only. And hive is end-2-end testing so we didn't do like unit test as snippets code.

By the way, I change the PR as draft to discuss more and will update later.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants