Commit 6ec16006 authored by George Hotz's avatar George Hotz

writing the json checkpoints

parent 3e9acb85
......@@ -51,7 +51,6 @@ func TestCompareUnicornEvm(t *testing.T) {
uniram := make(map[uint32](uint32))
ministart := time.Now()
go RunUnicorn(fn, uniram, false, func(step int, mu uc.Unicorn, ram map[uint32](uint32)) {
SyncRegs(mu, ram)
cuni <- RegSerialize(ram)
done.Lock()
done.Unlock()
......
package main
import "fmt"
import (
"fmt"
"io/ioutil"
uc "github.com/unicorn-engine/unicorn/bindings/go/unicorn"
)
func main() {
root := fmt.Sprintf("/tmp/eth/%d", 13284469)
// step 1, generate the checkpoints every million steps using unicorn
ram := make(map[uint32](uint32))
LoadMappedFile("../mipigo/minigeth", ram, 0)
LoadMappedFile(fmt.Sprintf("/tmp/eth/%d/input", 13284469), ram, 0xB0000000)
ZeroRegisters(ram)
mu := GetHookedUnicorn(root, ram, func(step int, mu uc.Unicorn, ram map[uint32](uint32)) {
if step%1000000 == 0 {
trieroot := RamToTrie(ram)
dat := TrieToJson(trieroot)
fn := fmt.Sprintf("%s/checkpoint_%d.json", root, step)
fmt.Printf("writing %s len %d\n", fn, len(dat))
ioutil.WriteFile(fn, dat, 0644)
}
})
check(mu.MemMap(0, 0x80000000))
LoadMappedFileUnicorn(mu, "../mipigo/minigeth.bin", ram, 0)
LoadMappedFileUnicorn(mu, fmt.Sprintf("%s/input", root), ram, 0xB0000000)
mu.Start(0, 0x5ead0004)
// step 2 (optional), validate each 1 million chunk in EVM
// step 3 (super optional) validate each 1 million chunk on chain
......
package main
import (
"bytes"
"encoding/binary"
"encoding/gob"
"encoding/json"
"fmt"
"sort"
......@@ -24,15 +22,6 @@ type Jtree struct {
Preimages map[common.Hash][]byte `json:"preimages"`
}
// TODO: replace with JSON
func SerializeTrie(root common.Hash) []byte {
b := new(bytes.Buffer)
e := gob.NewEncoder(b)
check(e.Encode(root))
check(e.Encode(Preimages))
return b.Bytes()
}
func TrieToJson(root common.Hash) []byte {
b, err := json.Marshal(Jtree{Preimages: Preimages, Root: root})
check(err)
......
......@@ -17,9 +17,9 @@ func TestTrie(t *testing.T) {
root := RamToTrie(ram)
//ParseNode(root, 0)
dat := SerializeTrie(root)
dat := TrieToJson(root)
fmt.Println("serialized length is", len(dat))
ioutil.WriteFile("/tmp/eth/ramtrie", dat, 0644)
ioutil.WriteFile("/tmp/eth/ramtrie.json", dat, 0644)
}
func printRoot(ram map[uint32](uint32)) {
......
......@@ -149,6 +149,7 @@ func GetHookedUnicorn(root string, ram map[uint32](uint32), callback func(int, u
}, 0, 0x80000000)
mu.HookAdd(uc.HOOK_CODE, func(mu uc.Unicorn, addr uint64, size uint32) {
SyncRegs(mu, ram)
callback(steps, mu, ram)
steps += 1
}, 0, 0x80000000)
......@@ -157,6 +158,12 @@ func GetHookedUnicorn(root string, ram map[uint32](uint32), callback func(int, u
return mu
}
func LoadMappedFileUnicorn(mu uc.Unicorn, fn string, ram map[uint32](uint32), base uint32) {
dat, _ := ioutil.ReadFile(fn)
LoadData(dat, ram, base)
mu.MemWrite(uint64(base), dat)
}
// reimplement simple.py in go
func RunUnicorn(fn string, ram map[uint32](uint32), checkIO bool, callback func(int, uc.Unicorn, map[uint32](uint32))) {
root := "/tmp/eth/13284469"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment