Skip to content
This repository has been archived by the owner on Aug 31, 2024. It is now read-only.

Commit

Permalink
use stateReaderWriter
Browse files Browse the repository at this point in the history
  • Loading branch information
Lawliet-Chan committed Jan 29, 2024
1 parent af23ae0 commit 7cbcd82
Show file tree
Hide file tree
Showing 4 changed files with 522 additions and 60 deletions.
28 changes: 14 additions & 14 deletions cairoVM/cairo.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (

"github.com/NethermindEth/juno/core"
"github.com/NethermindEth/juno/core/felt"
"github.com/NethermindEth/juno/db/pebble"
"github.com/NethermindEth/juno/rpc"
"github.com/NethermindEth/juno/utils"
"github.com/NethermindEth/juno/vm"
Expand All @@ -28,19 +27,20 @@ func NewCairoVM(cfg *Config) (*Cairo, error) {
if err != nil {
return nil, err
}
db, err := pebble.NewMem()
if err != nil {
return nil, err
}
txn, err := db.NewTransaction(true)
if err != nil {
return nil, err
}
state := core.NewState(txn)
cairoFiles := make(map[string]string)
cairoFiles["data/genesis/NoValidateAccount.sierra.json"] = "data/genesis/NoValidateAccount.casm.json"
cairoFiles["data/genesis/erc20.sierra.json"] = "data/genesis/erc20.casm.json"
err = SetGenesis(state, cairoFiles)
//db, err := pebble.NewMem()
//if err != nil {
// return nil, err
//}
//txn, err := db.NewTransaction(true)
//if err != nil {
// return nil, err
//}
//state := core.NewState(txn)
//cairoFiles := make(map[string]string)
//cairoFiles["data/genesis/NoValidateAccount.sierra.json"] = "data/genesis/NoValidateAccount.casm.json"
//cairoFiles["data/genesis/erc20.sierra.json"] = "data/genesis/erc20.casm.json"

state, err := BuildGenesis([]string{"data/genesis/NoValidateAccount.sierra.json", "data/genesis/erc20.sierra.json"})
if err != nil {
return nil, err
}
Expand Down
154 changes: 111 additions & 43 deletions cairoVM/genesis.go
Original file line number Diff line number Diff line change
@@ -1,67 +1,135 @@
package cairoVM

import (
"encoding/json"
"fmt"
"github.com/NethermindEth/juno/adapters/sn2core"
"github.com/NethermindEth/juno/blockchain"
"github.com/NethermindEth/juno/core"
"github.com/NethermindEth/juno/core/felt"
"github.com/NethermindEth/starknet.go/contracts"
"github.com/NethermindEth/starknet.go/hash"
"github.com/NethermindEth/juno/db"
"github.com/NethermindEth/juno/starknet"
"os"
)

func init() {
blockchain.RegisterCoreTypesToEncoder()
}

func SetGenesis(state *core.State, cairoFiles map[string]string) error {
//func SetGenesis(state *core.State, cairoFiles map[string]string) error {
//
// declaredClasses := make(map[felt.Felt]core.Class)
// deployedContracts := make(map[felt.Felt]*felt.Felt)
// declaredV1Classes := make(map[felt.Felt]*felt.Felt)
// nonces := make(map[felt.Felt]*felt.Felt)
// var (
// class core.Class
// classHash *felt.Felt
// compiledClassHash *felt.Felt
// err error
// )
//
// var addr uint64 = 0
//
// for sierraFileName, casmFileName := range cairoFiles {
// class, classHash, err = adaptClassAndHash(sierraFileName)
// if err != nil {
// return err
// }
// fmt.Println("genesis classHash = ", classHash.String())
// declaredClasses[*classHash] = class
// addrFelt := new(felt.Felt).SetUint64(addr)
// deployedContracts[*addrFelt] = classHash
// casmClass, err := contracts.UnmarshalCasmClass(casmFileName)
// if err != nil {
// return err
// }
// compiledClassHash = hash.CompiledClassHash(*casmClass)
//
// declaredV1Classes[*classHash] = compiledClassHash
//
// nonces[*addrFelt] = &felt.Zero
// addr++
// }
//
// newRoot, err := new(felt.Felt).SetString("0x56f007b0f69daa75af325ecfa0d717bfd4d72bfa102151912fe4a15b9dfd30f")
// if err != nil {
// return err
// }
//
// return state.Update(0, core.EmptyStateDiff(), declaredClasses)
//}

declaredClasses := make(map[felt.Felt]core.Class)
deployedContracts := make(map[felt.Felt]*felt.Felt)
declaredV1Classes := make(map[felt.Felt]*felt.Felt)
nonces := make(map[felt.Felt]*felt.Felt)
var (
class core.Class
classHash *felt.Felt
compiledClassHash *felt.Felt
err error
)
// contractsData: map[address]classHash
func BuildGenesis(classesPaths []string) (*blockchain.PendingStateWriter, error) {
classes, err := loadClasses(classesPaths)
if err != nil {
return nil, err
}
genesisState := blockchain.NewPendingStateWriter(core.EmptyStateDiff(), make(map[felt.Felt]core.Class), core.NewState(db.NewMemTransaction()))

var addr uint64 = 0
var addr uint64
for classHash, class := range classes {
// Sets pending.newClasses, DeclaredV0Classes, (not DeclaredV1Classes)
if err = genesisState.SetContractClass(&classHash, class); err != nil {
return nil, fmt.Errorf("declare class: %v", err)
}

for sierraFileName, casmFileName := range cairoFiles {
class, classHash, err = adaptClassAndHash(sierraFileName)
if err != nil {
return err
if cairo1Class, isCairo1 := class.(*core.Cairo1Class); isCairo1 {
if err = genesisState.SetCompiledClassHash(&classHash, cairo1Class.Compiled.Hash()); err != nil {
return nil, fmt.Errorf("set compiled class hash: %v", err)
}
addrFelt := new(felt.Felt).SetUint64(addr)
err = genesisState.SetClassHash(addrFelt, &classHash)
if err != nil {
return nil, err
}
addr++
}
fmt.Println("genesis classHash = ", classHash.String())
declaredClasses[*classHash] = class
addrFelt := new(felt.Felt).SetUint64(addr)
deployedContracts[*addrFelt] = classHash
casmClass, err := contracts.UnmarshalCasmClass(casmFileName)
}

//for addrFelt, classHash := range contractsData {
// err = genesisState.SetClassHash(&addrFelt, &classHash)
// if err != nil {
// return nil, err
// }
//}

//stateDiff, newClasses := genesisState.StateDiffAndClasses()
//return state.Update(0, stateDiff, newClasses)
return genesisState, nil
}

// return map[classHash]Class
func loadClasses(classes []string) (map[felt.Felt]core.Class, error) {
classMap := make(map[felt.Felt]core.Class)
for _, classPath := range classes {
bytes, err := os.ReadFile(classPath)
if err != nil {
return err
return nil, fmt.Errorf("read class file: %v", err)
}
compiledClassHash = hash.CompiledClassHash(*casmClass)

declaredV1Classes[*classHash] = compiledClassHash
var response *starknet.ClassDefinition
if err = json.Unmarshal(bytes, &response); err != nil {
return nil, fmt.Errorf("unmarshal class: %v", err)
}

nonces[*addrFelt] = &felt.Zero
addr++
}
var coreClass core.Class
if response.V0 != nil {
if coreClass, err = sn2core.AdaptCairo0Class(response.V0); err != nil {
return nil, err
}
} else if compiledClass, cErr := starknet.Compile(response.V1); cErr != nil {
return nil, cErr
} else if coreClass, err = sn2core.AdaptCairo1Class(response.V1, compiledClass); err != nil {
return nil, err
}

newRoot, err := new(felt.Felt).SetString("0x56f007b0f69daa75af325ecfa0d717bfd4d72bfa102151912fe4a15b9dfd30f")
if err != nil {
return err
classhash, err := coreClass.Hash()
if err != nil {
return nil, fmt.Errorf("calculate class hash: %v", err)
}
classMap[*classhash] = coreClass
}

return state.Update(0, &core.StateUpdate{
BlockHash: &felt.Zero,
NewRoot: newRoot,
OldRoot: &felt.Zero,
StateDiff: &core.StateDiff{
Nonces: nonces,
DeployedContracts: deployedContracts,
DeclaredV1Classes: declaredV1Classes,
},
}, declaredClasses)
return classMap, nil
}
119 changes: 118 additions & 1 deletion data/genesis/NoValidateAccount.sierra.json
Original file line number Diff line number Diff line change
Expand Up @@ -1126,5 +1126,122 @@
}
]
},
"abi": "[ { \"type\": \"function\", \"name\": \"__validate_declare__\", \"inputs\": [ { \"name\": \"class_hash\", \"type\": \"core::felt252\" } ], \"outputs\": [ { \"type\": \"core::felt252\" } ], \"state_mutability\": \"view\" }, { \"type\": \"struct\", \"name\": \"core::starknet::account::Call\", \"members\": [ { \"name\": \"to\", \"type\": \"core::starknet::contract_address::ContractAddress\" }, { \"name\": \"selector\", \"type\": \"core::felt252\" }, { \"name\": \"calldata\", \"type\": \"core::array::Array::<core::felt252>\" } ] }, { \"type\": \"function\", \"name\": \"__validate__\", \"inputs\": [ { \"name\": \"calls\", \"type\": \"core::array::Array::<core::starknet::account::Call>\" } ], \"outputs\": [ { \"type\": \"core::felt252\" } ], \"state_mutability\": \"external\" }, { \"type\": \"struct\", \"name\": \"core::array::Span::<core::felt252>\", \"members\": [ { \"name\": \"snapshot\", \"type\": \"@core::array::Array::<core::felt252>\" } ] }, { \"type\": \"function\", \"name\": \"__execute__\", \"inputs\": [ { \"name\": \"calls\", \"type\": \"core::array::Array::<core::starknet::account::Call>\" } ], \"outputs\": [ { \"type\": \"core::array::Array::<core::array::Span::<core::felt252>>\" } ], \"state_mutability\": \"external\" }, { \"type\": \"constructor\", \"name\": \"constructor\", \"inputs\": [ { \"name\": \"public_key_\", \"type\": \"core::felt252\" } ] }, { \"type\": \"function\", \"name\": \"__validate_deploy__\", \"inputs\": [ { \"name\": \"class_hash\", \"type\": \"core::felt252\" }, { \"name\": \"contract_address_salt\", \"type\": \"core::felt252\" }, { \"name\": \"public_key_\", \"type\": \"core::felt252\" } ], \"outputs\": [ { \"type\": \"core::felt252\" } ], \"state_mutability\": \"view\" }, { \"type\": \"event\", \"name\": \"account::account::Account::Event\", \"kind\": \"enum\", \"variants\": [] } ]"
"abi": [
{
"type": "function",
"name": "__validate_declare__",
"inputs": [
{
"name": "class_hash",
"type": "core::felt252"
}
],
"outputs": [
{
"type": "core::felt252"
}
],
"state_mutability": "view"
},
{
"type": "struct",
"name": "core::starknet::account::Call",
"members": [
{
"name": "to",
"type": "core::starknet::contract_address::ContractAddress"
},
{
"name": "selector",
"type": "core::felt252"
},
{
"name": "calldata",
"type": "core::array::Array::<core::felt252>"
}
]
},
{
"type": "function",
"name": "__validate__",
"inputs": [
{
"name": "calls",
"type": "core::array::Array::<core::starknet::account::Call>"
}
],
"outputs": [
{
"type": "core::felt252"
}
],
"state_mutability": "external"
},
{
"type": "struct",
"name": "core::array::Span::<core::felt252>",
"members": [
{
"name": "snapshot",
"type": "@core::array::Array::<core::felt252>"
}
]
},
{
"type": "function",
"name": "__execute__",
"inputs": [
{
"name": "calls",
"type": "core::array::Array::<core::starknet::account::Call>"
}
],
"outputs": [
{
"type": "core::array::Array::<core::array::Span::<core::felt252>>"
}
],
"state_mutability": "external"
},
{
"type": "constructor",
"name": "constructor",
"inputs": [
{
"name": "public_key_",
"type": "core::felt252"
}
]
},
{
"type": "function",
"name": "__validate_deploy__",
"inputs": [
{
"name": "class_hash",
"type": "core::felt252"
},
{
"name": "contract_address_salt",
"type": "core::felt252"
},
{
"name": "public_key_",
"type": "core::felt252"
}
],
"outputs": [
{
"type": "core::felt252"
}
],
"state_mutability": "view"
},
{
"type": "event",
"name": "account::account::Account::Event",
"kind": "enum",
"variants": []
}
]
}
Loading

0 comments on commit 7cbcd82

Please sign in to comment.