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

isolation of contract execution #382

Open
wants to merge 107 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
107 commits
Select commit Hold shift + click to select a range
0cad2db
move VM files to another folder
kroggen Jun 18, 2024
cc89568
copy vm_callback.go
kroggen Jun 26, 2024
f998341
add VM pool
kroggen Jun 26, 2024
3099189
build vm_api from vm_callback (wip)
kroggen Jun 26, 2024
d2eeaa8
rename test file
kroggen Jun 26, 2024
c5a00c1
update vm.go (wip)
kroggen Jun 26, 2024
d5c0a96
update vm_callback.go
kroggen Jun 30, 2024
4e8a462
serialize data for crypto functions
kroggen Jun 30, 2024
31cff36
add vm_server.go and vm_server_messages.go
kroggen Jun 30, 2024
cd6d809
add vm/vm.go
kroggen Jul 1, 2024
484ee9f
rename luaSetDB -> luaSetVariable
kroggen Jul 25, 2024
004e437
add copy of db_module.c on contract folder
kroggen Jul 25, 2024
4f4c52b
separate vm messages
kroggen Jul 27, 2024
56d1848
aergoluac: separate luac module from util
kroggen Jul 28, 2024
e20c17e
aergoluac: separate luac module from util - 2
kroggen Jul 28, 2024
2774c3f
control view call at 'server' side
kroggen Jul 28, 2024
4a4f6c9
implement sql db functions
kroggen Jul 28, 2024
c3b9a79
fix vm_messages
kroggen Jul 28, 2024
2e12663
compile contract at vm instance
kroggen Jul 28, 2024
1237f97
getLuaExecContext -> checkLuaExecContext
kroggen Jul 28, 2024
21942e7
vm clients: service -> loading
kroggen Jul 29, 2024
3f7f78a
modify timeout functions
kroggen Jul 29, 2024
03280f0
remove luajit from aergosvr
kroggen Jul 29, 2024
59e2b21
fix compile
kroggen Jul 29, 2024
e9545d5
move drop event to state recovery
kroggen Jul 29, 2024
df6af0a
make state recovery before other operations
kroggen Jul 29, 2024
36fc85f
timeout handling on contract send and deploy
kroggen Jul 29, 2024
0761633
remove instruction count from call
kroggen Jul 29, 2024
ffad10d
use bool for luaL_hasuncatchablerror
kroggen Jul 29, 2024
8735785
db snapshot
kroggen Jul 29, 2024
f2c2caa
contract_module: reorganize and add comments
kroggen Jul 30, 2024
6fb33da
process function arguments
kroggen Jul 30, 2024
0d4498e
VM API results and errors
kroggen Jul 31, 2024
83d11d9
vm execution args
kroggen Aug 1, 2024
da7fb53
update makefiles
kroggen Aug 1, 2024
84b31c1
fixes to build aergovm
kroggen Aug 1, 2024
aa2c8e9
fixes to build aergosvr - partial
kroggen Aug 2, 2024
dbe9f36
gas limit + used gas
kroggen Aug 6, 2024
53145b0
no gas on query + process gas from call
kroggen Aug 6, 2024
ad45f75
send ready message when VM is ready
kroggen Aug 7, 2024
6343ef4
set timeout of 250 milliseconds
kroggen Aug 7, 2024
6ab3d70
checkDbExecContext
kroggen Aug 7, 2024
421aee8
makefile: rename vm to aergovm
kroggen Aug 7, 2024
6b8f876
fix build: aergoluac and vm_dummy
kroggen Aug 7, 2024
9a3691c
add tests for VM + fixes
kroggen Aug 7, 2024
5b5aa2e
add external tests for VM + fixes
kroggen Aug 8, 2024
44c58d1
use different paths to search for aergovm
kroggen Aug 8, 2024
4b96040
fix args and constructor handling
kroggen Aug 8, 2024
1202e19
fix loop
kroggen Aug 9, 2024
95bb987
fix parsing compile result
kroggen Aug 9, 2024
5a5aae8
add external test for compile and execute
kroggen Aug 9, 2024
3662f1d
fix segfault
kroggen Aug 9, 2024
6080b22
close connection gracefully + fixes
kroggen Aug 9, 2024
4ae04df
add hasParent argument to execute()
kroggen Aug 9, 2024
d3b7273
fix invalid number of arguments
kroggen Aug 9, 2024
9d4b057
fix db_msg binary serialization
kroggen Aug 9, 2024
d74794b
db_msg: store strings with null terminator
kroggen Aug 9, 2024
46bc63b
fix arguments for db module
kroggen Aug 12, 2024
08fc32d
fix error message for timeout
kroggen Aug 14, 2024
57658df
fix makefile for aergovm
kroggen Aug 14, 2024
32d7e74
check whether it is within a view function
kroggen Aug 14, 2024
68f1723
handle getAmount command
kroggen Aug 14, 2024
499ee0a
fix parsing used gas
kroggen Aug 15, 2024
3a7b5e6
fix error messages on tests
kroggen Aug 15, 2024
9448e01
rename some internal db functions
kroggen Aug 15, 2024
b23856f
fix deadlock: LMDB txn should be used on same thread
kroggen Aug 15, 2024
fda854b
fix db.exec and stmt.exec: return changes
kroggen Aug 15, 2024
7ba3207
db module: fix segfault
kroggen Aug 15, 2024
7e46e91
db module: fix rs.next()
kroggen Aug 15, 2024
fced614
db module: fix db.last_insert_rowid()
kroggen Aug 15, 2024
df45f87
db module: add error message for out of memory
kroggen Aug 15, 2024
8a24dcb
fix system.random()
kroggen Aug 15, 2024
8ac5332
add test for db module on VM side
kroggen Aug 15, 2024
cc9f014
db module: do not transfer decltypes to VM
kroggen Aug 15, 2024
a3086ed
db module: fix segfault
kroggen Aug 15, 2024
4816776
db module: do not add null terminator on Lua string
kroggen Aug 15, 2024
79e3630
db module: do not add null terminator on sqlite table
kroggen Aug 15, 2024
b36a72c
fix db.column_info()
kroggen Aug 15, 2024
56981f7
fix luaSetRecoveryPoint on query or view function
kroggen Aug 16, 2024
d28dfd3
performance on tests: flush VM instances less often
kroggen Aug 16, 2024
bf60892
fix tests: use fee on pubnet
kroggen Aug 16, 2024
cafd1c6
tests: process each hardfork version at a time
kroggen Aug 16, 2024
e9a543f
stop VM pool on exit
kroggen Aug 17, 2024
bdd2cf0
use limit of memory on VM
kroggen Aug 18, 2024
376d4b2
rename VM functions for clarity
kroggen Aug 18, 2024
a91b96f
move instruction count and timeout functions
kroggen Aug 18, 2024
087a464
remove numstateclosers and closelimit
kroggen Aug 21, 2024
424dfd9
set max call depth to 20
kroggen Aug 21, 2024
27a64f6
tests: process pubnet separate from privnet
kroggen Aug 22, 2024
8ec30b5
tests: some fixes
kroggen Aug 22, 2024
1c0aab2
stop early on TestMaxCallDepth
kroggen Aug 22, 2024
81ea220
set timeout on ctx
kroggen Aug 22, 2024
d911ca0
execution timeout: use block deadline for all contracts
kroggen Aug 23, 2024
f5d97a5
tests: use require for call, assert for query
kroggen Aug 23, 2024
dc4d79c
contract gas: use the same error messages
kroggen Aug 23, 2024
c60c629
fix VM pool
kroggen Aug 23, 2024
b30a1e6
increase performance of VM instance creation
kroggen Aug 23, 2024
b4bf0cf
add comments to timeout functions [skip ci]
kroggen Sep 2, 2024
ee9adb1
db module: release resources
kroggen Sep 2, 2024
cd2f8be
db module: release all resources at once
kroggen Sep 2, 2024
1657d5e
fix build
kroggen Feb 3, 2025
72df114
pass preErr to VM instance, as abiError
kroggen Feb 3, 2025
9620af9
fix tests for multicall
kroggen Feb 3, 2025
f263620
run most tests on pub and priv nets
kroggen Feb 3, 2025
911aed3
fix segfault on brick
kroggen Feb 4, 2025
788a7df
fix identation
kroggen Feb 4, 2025
2b09479
rename vm_dummy functions used on tests
kroggen Feb 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ if(CMAKE_BUILD_TYPE MATCHES "Debug")
set(GFLAG -tags Debug)
endif()

add_custom_target(build ALL DEPENDS aergocli aergosvr aergoluac brick)
add_custom_target(build ALL DEPENDS aergocli aergosvr aergovm aergoluac brick)

add_custom_target(aergocli GO111MODULE=on GOBIN=${BIN_DIR} go install ${GCFLAGS} -ldflags \"-X github.com/aergoio/aergo/v2/cmd/aergocli/cmd.githash=`git describe --tags`\" ./cmd/aergocli/...
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
Expand All @@ -25,6 +25,12 @@ add_custom_target(aergosvr GO111MODULE=on GOBIN=${BIN_DIR} go install ${GCFLAGS}
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
DEPENDS libtool)

add_custom_target(aergovm
COMMAND GO111MODULE=on GOBIN=${BIN_DIR} go install ${GCFLAGS} -ldflags \"-X main.githash=`git describe --tags` -X main.gitRevision=`git rev-parse --short HEAD` -X main.gitBranch=`git rev-parse --symbolic-full-name --abbrev-ref HEAD`\" ./contract/vm/...
COMMAND ${CMAKE_COMMAND} -E rename ${BIN_DIR}/vm ${BIN_DIR}/aergovm
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
DEPENDS libtool)

add_custom_target(polaris GO111MODULE=on GOBIN=${BIN_DIR} go install ${GCFLAGS} -ldflags \"-X main.githash=`git describe --tags`\" ./cmd/polaris/...
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})

Expand All @@ -45,7 +51,8 @@ add_custom_target(mpdumpdiag GO111MODULE=on GOBIN=${BIN_DIR} go install ${GCFLAG

add_custom_target(deps DEPENDS libtool)

add_custom_target(check GO111MODULE=on go test -timeout 600s ./...
add_custom_target(check
COMMAND ${CMAKE_COMMAND} -E env AERGOVM_PATH=${BIN_DIR}/aergovm GO111MODULE=on go test -timeout 600s ./...
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
DEPENDS build)
add_custom_target(cover-check GO111MODULE=on go test -timeout 600s -coverprofile c.out ./...
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ endif

BUILD_RULES := \
deps \
aergocli aergosvr aergoluac polaris colaris brick mpdumpdiag\
aergocli aergosvr aergovm aergoluac polaris colaris brick mpdumpdiag \
libtool libtool-clean \
libluajit liblmdb libgmp \
libluajit-clean liblmdb-clean libgmp-clean \
Expand Down
5 changes: 3 additions & 2 deletions chain/chainservice.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ func (core *Core) GetGenesisInfo() *types.Genesis {
return core.cdb.GetGenesisInfo()
}

// Close closes chain & state DB.
// Close closes chain, state and contracts DBs and the VM pool
func (core *Core) Close() {
if core.sdb != nil {
core.sdb.Close()
Expand All @@ -163,6 +163,7 @@ func (core *Core) Close() {
core.cdb.Close()
}
contract.CloseDatabase()
contract.StopVMPool()
}

// InitGenesisBlock initialize chain database and generate specified genesis block if necessary
Expand Down Expand Up @@ -295,7 +296,7 @@ func NewChainService(cfg *cfg.Config) *ChainService {
contract.PubNet = pubNet
contract.TraceBlockNo = cfg.Blockchain.StateTrace
contract.SetStateSQLMaxDBSize(cfg.SQL.MaxDbSize)
contract.StartLStateFactory((cfg.Blockchain.NumWorkers+2)*(int(contract.MaxCallDepth(cfg.Hardfork.Version(math.MaxUint64)))+2), cfg.Blockchain.NumLStateClosers, cfg.Blockchain.CloseLimit)
contract.StartVMPool((cfg.Blockchain.NumWorkers + 2) * int(contract.MaxCallDepth(cfg.Hardfork.Version(math.MaxUint64))))
contract.InitContext(cfg.Blockchain.NumWorkers + 2)

// For a strict governance transaction validation.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
#include "_cgo_export.h"

lua_State *luac_vm_newstate() {
lua_State *L = luaL_newstate(3);
lua_State *L = luaL_newstate(5);
if (L == NULL) {
return NULL;
}
Expand Down
File renamed without changes.
131 changes: 131 additions & 0 deletions cmd/aergoluac/luac/luac.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
package luac

/*
#cgo CFLAGS: -I${SRCDIR}/../../../libtool/include/luajit-2.1
#cgo LDFLAGS: ${SRCDIR}/../../../libtool/lib/libluajit-5.1.a -lm

#include <stdlib.h>
#include <lualib.h>
#include "compile.h"
*/
import "C"
import (
"bufio"
"bytes"
"errors"
"fmt"
"io/ioutil"
"os"
"runtime"
"unsafe"

"github.com/aergoio/aergo/v2/cmd/aergoluac/encoding"
"github.com/aergoio/aergo/v2/cmd/aergoluac/util"
)

func NewLState() *C.lua_State {
L := C.luac_vm_newstate()
if L == nil {
runtime.GC()
L = C.luac_vm_newstate()
}
return L
}

func CloseLState(L *C.lua_State) {
if L != nil {
C.luac_vm_close(L)
}
}

func Compile(L *C.lua_State, code string) (util.LuaCode, error) {
cStr := C.CString(code)
defer C.free(unsafe.Pointer(cStr))
if errMsg := C.vm_loadstring(L, cStr); errMsg != nil {
return nil, errors.New(C.GoString(errMsg))
}
if errMsg := C.vm_stringdump(L); errMsg != nil {
return nil, errors.New(C.GoString(errMsg))
}
return dumpToBytes(L), nil
}

func CompileFromFile(srcFileName, outFileName, abiFileName string) error {
cSrcFileName := C.CString(srcFileName)
cOutFileName := C.CString(outFileName)
cAbiFileName := C.CString(abiFileName)
L := C.luac_vm_newstate()
defer C.free(unsafe.Pointer(cSrcFileName))
defer C.free(unsafe.Pointer(cOutFileName))
defer C.free(unsafe.Pointer(cAbiFileName))
defer C.luac_vm_close(L)

if errMsg := C.vm_compile(L, cSrcFileName, cOutFileName, cAbiFileName); errMsg != nil {
return errors.New(C.GoString(errMsg))
}
return nil
}

func DumpFromFile(srcFileName string) error {
cSrcFileName := C.CString(srcFileName)
L := C.luac_vm_newstate()
defer C.free(unsafe.Pointer(cSrcFileName))
defer C.luac_vm_close(L)

if errMsg := C.vm_loadfile(L, cSrcFileName); errMsg != nil {
return errors.New(C.GoString(errMsg))
}
if errMsg := C.vm_stringdump(L); errMsg != nil {
return errors.New(C.GoString(errMsg))
}

fmt.Println(encoding.EncodeCode(dumpToBytes(L)))
return nil
}

func DumpFromStdin() error {
fi, err := os.Stdin.Stat()
if err != nil {
return err
}
var buf []byte
if (fi.Mode() & os.ModeCharDevice) == 0 {
buf, err = ioutil.ReadAll(os.Stdin)
if err != nil {
return err
}
} else {
var bBuf bytes.Buffer
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
bBuf.WriteString(scanner.Text() + "\n")
}
if err = scanner.Err(); err != nil {
return err
}
buf = bBuf.Bytes()
}
srcCode := C.CString(string(buf))
L := C.luac_vm_newstate()
defer C.free(unsafe.Pointer(srcCode))
defer C.luac_vm_close(L)

if errMsg := C.vm_loadstring(L, srcCode); errMsg != nil {
return errors.New(C.GoString(errMsg))
}
if errMsg := C.vm_stringdump(L); errMsg != nil {
return errors.New(C.GoString(errMsg))
}
fmt.Println(encoding.EncodeCode(dumpToBytes(L)))
return nil
}

func dumpToBytes(L *C.lua_State) util.LuaCode {
var (
c, a *C.char
lc, la C.size_t
)
c = C.lua_tolstring(L, -2, &lc)
a = C.lua_tolstring(L, -1, &la)
return util.NewLuaCode(C.GoBytes(unsafe.Pointer(c), C.int(lc)), C.GoBytes(unsafe.Pointer(a), C.int(la)))
}
File renamed without changes.
File renamed without changes.
7 changes: 4 additions & 3 deletions cmd/aergoluac/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"os"

"github.com/aergoio/aergo/v2/cmd/aergoluac/util"
"github.com/aergoio/aergo/v2/cmd/aergoluac/luac"
"github.com/spf13/cobra"
)

Expand Down Expand Up @@ -44,15 +45,15 @@ func init() {
}
} else if payload {
if len(args) == 0 {
err = util.DumpFromStdin()
err = luac.DumpFromStdin()
} else {
err = util.DumpFromFile(args[0])
err = luac.DumpFromFile(args[0])
}
} else {
if len(args) < 2 {
return errors.New("2 arguments required: <srcfile> <bcfile>")
}
err = util.CompileFromFile(args[0], args[1], abiFile)
err = luac.CompileFromFile(args[0], args[1], abiFile)
}

return err
Expand Down
127 changes: 10 additions & 117 deletions cmd/aergoluac/util/luac_util.go → cmd/aergoluac/util/util.go
Original file line number Diff line number Diff line change
@@ -1,137 +1,25 @@
package util

/*
#cgo CFLAGS: -I${SRCDIR}/../../../libtool/include/luajit-2.1
#cgo LDFLAGS: ${SRCDIR}/../../../libtool/lib/libluajit-5.1.a -lm

#include <stdlib.h>
#include <lualib.h>
#include "compile.h"
*/
import "C"
import (
"bufio"
"bytes"
"encoding/binary"
"errors"
"fmt"
"io/ioutil"
"os"
"runtime"
"unsafe"

"github.com/aergoio/aergo/v2/internal/enc/hex"
"github.com/aergoio/aergo/v2/internal/enc/base58"
"github.com/aergoio/aergo/v2/cmd/aergoluac/encoding"
)

func NewLState() *C.lua_State {
L := C.luac_vm_newstate()
if L == nil {
runtime.GC()
L = C.luac_vm_newstate()
}
return L
}

func CloseLState(L *C.lua_State) {
if L != nil {
C.luac_vm_close(L)
}
}

func Compile(L *C.lua_State, code string) (LuaCode, error) {
cStr := C.CString(code)
defer C.free(unsafe.Pointer(cStr))
if errMsg := C.vm_loadstring(L, cStr); errMsg != nil {
return nil, errors.New(C.GoString(errMsg))
}
if errMsg := C.vm_stringdump(L); errMsg != nil {
return nil, errors.New(C.GoString(errMsg))
}
return dumpToBytes(L), nil
}

func CompileFromFile(srcFileName, outFileName, abiFileName string) error {
cSrcFileName := C.CString(srcFileName)
cOutFileName := C.CString(outFileName)
cAbiFileName := C.CString(abiFileName)
L := C.luac_vm_newstate()
defer C.free(unsafe.Pointer(cSrcFileName))
defer C.free(unsafe.Pointer(cOutFileName))
defer C.free(unsafe.Pointer(cAbiFileName))
defer C.luac_vm_close(L)

if errMsg := C.vm_compile(L, cSrcFileName, cOutFileName, cAbiFileName); errMsg != nil {
return errors.New(C.GoString(errMsg))
}
return nil
}

func DumpFromFile(srcFileName string) error {
cSrcFileName := C.CString(srcFileName)
L := C.luac_vm_newstate()
defer C.free(unsafe.Pointer(cSrcFileName))
defer C.luac_vm_close(L)

if errMsg := C.vm_loadfile(L, cSrcFileName); errMsg != nil {
return errors.New(C.GoString(errMsg))
}
if errMsg := C.vm_stringdump(L); errMsg != nil {
return errors.New(C.GoString(errMsg))
}

fmt.Println(encoding.EncodeCode(dumpToBytes(L)))
return nil
}

func DumpFromStdin() error {
fi, err := os.Stdin.Stat()
if err != nil {
return err
}
var buf []byte
if (fi.Mode() & os.ModeCharDevice) == 0 {
buf, err = ioutil.ReadAll(os.Stdin)
if err != nil {
return err
}
} else {
var bBuf bytes.Buffer
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
bBuf.WriteString(scanner.Text() + "\n")
}
if err = scanner.Err(); err != nil {
return err
}
buf = bBuf.Bytes()
}
srcCode := C.CString(string(buf))
L := C.luac_vm_newstate()
defer C.free(unsafe.Pointer(srcCode))
defer C.luac_vm_close(L)

if errMsg := C.vm_loadstring(L, srcCode); errMsg != nil {
return errors.New(C.GoString(errMsg))
}
if errMsg := C.vm_stringdump(L); errMsg != nil {
return errors.New(C.GoString(errMsg))
}
fmt.Println(encoding.EncodeCode(dumpToBytes(L)))
return nil
}

func dumpToBytes(L *C.lua_State) LuaCode {
var (
c, a *C.char
lc, la C.size_t
)
c = C.lua_tolstring(L, -2, &lc)
a = C.lua_tolstring(L, -1, &la)
return NewLuaCode(C.GoBytes(unsafe.Pointer(c), C.int(lc)), C.GoBytes(unsafe.Pointer(a), C.int(la)))
}
////////////////////////////////////////////////////////////////////////////////
// Decode
////////////////////////////////////////////////////////////////////////////////

// Decode decodes the payload from a hex string or a base58 string or a JSON string
// and writes the bytecode, abi and deploy arguments to files
func Decode(srcFileName string, payload string) error {
var decoded []byte
var err error
Expand Down Expand Up @@ -223,6 +111,11 @@ func DecodeFromStdin() error {
}


////////////////////////////////////////////////////////////////////////////////
// LuaCode and LuaCodePayload
// used to store bytecode, abi and deploy arguments
////////////////////////////////////////////////////////////////////////////////

type LuaCode []byte

const byteCodeLenLen = 4
Expand Down
2 changes: 1 addition & 1 deletion cmd/brick/context/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ func Open(private bool) {
err error
)
if privateNet {
chain, err = vm_dummy.LoadDummyChain()
chain, err = vm_dummy.LoadDummyChain(vm_dummy.SetPrivNet())
} else {
chain, err = vm_dummy.LoadDummyChain(vm_dummy.SetPubNet())
}
Expand Down
Loading
Loading