Skip to content

Commit

Permalink
Merge branch 'master' into feat/gnoweb-rework
Browse files Browse the repository at this point in the history
  • Loading branch information
gfanton authored Dec 7, 2024
2 parents 547c4e8 + ac899c8 commit 45276d6
Show file tree
Hide file tree
Showing 26 changed files with 231 additions and 68 deletions.
25 changes: 17 additions & 8 deletions contribs/gnodev/cmd/gnodev/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,18 +63,20 @@ type devCfg struct {
webRemoteHelperAddr string

// Node Configuration
minimal bool
verbose bool
noWatch bool
noReplay bool
maxGas int64
chainId string
serverMode bool
unsafeAPI bool
minimal bool
verbose bool
noWatch bool
noReplay bool
maxGas int64
chainId string
chainDomain string
serverMode bool
unsafeAPI bool
}

var defaultDevOptions = &devCfg{
chainId: "dev",
chainDomain: "gno.land",
maxGas: 10_000_000_000,
webListenerAddr: "127.0.0.1:8888",
nodeRPCListenerAddr: "127.0.0.1:26657",
Expand Down Expand Up @@ -219,6 +221,13 @@ func (c *devCfg) RegisterFlags(fs *flag.FlagSet) {
"set node ChainID",
)

fs.StringVar(
&c.chainDomain,
"chain-domain",
defaultDevOptions.chainDomain,
"set node ChainDomain",
)

fs.BoolVar(
&c.noWatch,
"no-watch",
Expand Down
2 changes: 1 addition & 1 deletion contribs/gnodev/cmd/gnodev/setup_node.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ func setupDevNodeConfig(
balances gnoland.Balances,
pkgspath []gnodev.PackagePath,
) *gnodev.NodeConfig {
config := gnodev.DefaultNodeConfig(cfg.root)
config := gnodev.DefaultNodeConfig(cfg.root, cfg.chainDomain)

config.Logger = logger
config.Emitter = emitter
Expand Down
13 changes: 8 additions & 5 deletions contribs/gnodev/pkg/dev/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,10 @@ type NodeConfig struct {
NoReplay bool
MaxGasPerBlock int64
ChainID string
ChainDomain string
}

func DefaultNodeConfig(rootdir string) *NodeConfig {
func DefaultNodeConfig(rootdir, domain string) *NodeConfig {
tmc := gnoland.NewDefaultTMConfig(rootdir)
tmc.Consensus.SkipTimeoutCommit = false // avoid time drifting, see issue #1507
tmc.Consensus.WALDisabled = true
Expand All @@ -65,6 +66,7 @@ func DefaultNodeConfig(rootdir string) *NodeConfig {
DefaultDeployer: defaultDeployer,
BalancesList: balances,
ChainID: tmc.ChainID(),
ChainDomain: domain,
TMConfig: tmc,
SkipFailingGenesisTxs: true,
MaxGasPerBlock: 10_000_000_000,
Expand Down Expand Up @@ -487,7 +489,7 @@ func (n *Node) rebuildNode(ctx context.Context, genesis gnoland.GnoGenesisState)
}

// Setup node config
nodeConfig := newNodeConfig(n.config.TMConfig, n.config.ChainID, genesis)
nodeConfig := newNodeConfig(n.config.TMConfig, n.config.ChainID, n.config.ChainDomain, genesis)
nodeConfig.GenesisTxResultHandler = n.genesisTxResultHandler
// Speed up stdlib loading after first start (saves about 2-3 seconds on each reload).
nodeConfig.CacheStdlibLoad = true
Expand Down Expand Up @@ -566,10 +568,10 @@ func (n *Node) genesisTxResultHandler(ctx sdk.Context, tx std.Tx, res sdk.Result
return
}

func newNodeConfig(tmc *tmcfg.Config, chainid string, appstate gnoland.GnoGenesisState) *gnoland.InMemoryNodeConfig {
func newNodeConfig(tmc *tmcfg.Config, chainid, chaindomain string, appstate gnoland.GnoGenesisState) *gnoland.InMemoryNodeConfig {
// Create Mocked Identity
pv := gnoland.NewMockedPrivValidator()
genesis := gnoland.NewDefaultGenesisConfig(chainid)
genesis := gnoland.NewDefaultGenesisConfig(chainid, chaindomain)
genesis.AppState = appstate

// Add self as validator
Expand All @@ -583,10 +585,11 @@ func newNodeConfig(tmc *tmcfg.Config, chainid string, appstate gnoland.GnoGenesi
},
}

return &gnoland.InMemoryNodeConfig{
cfg := &gnoland.InMemoryNodeConfig{
PrivValidator: pv,
TMConfig: tmc,
Genesis: genesis,
VMOutput: os.Stdout,
}
return cfg
}
6 changes: 3 additions & 3 deletions contribs/gnodev/pkg/dev/node_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ func TestNewNode_NoPackages(t *testing.T) {
logger := log.NewTestingLogger(t)

// Call NewDevNode with no package should work
cfg := DefaultNodeConfig(gnoenv.RootDir())
cfg := DefaultNodeConfig(gnoenv.RootDir(), "gno.land")
cfg.Logger = logger
node, err := NewDevNode(ctx, cfg)
require.NoError(t, err)
Expand Down Expand Up @@ -66,7 +66,7 @@ func Render(_ string) string { return "foo" }
logger := log.NewTestingLogger(t)

// Call NewDevNode with no package should work
cfg := DefaultNodeConfig(gnoenv.RootDir())
cfg := DefaultNodeConfig(gnoenv.RootDir(), "gno.land")
cfg.PackagesPathList = []PackagePath{pkgpath}
cfg.Logger = logger
node, err := NewDevNode(ctx, cfg)
Expand Down Expand Up @@ -475,7 +475,7 @@ func generateTestingPackage(t *testing.T, nameFile ...string) PackagePath {
}

func createDefaultTestingNodeConfig(pkgslist ...PackagePath) *NodeConfig {
cfg := DefaultNodeConfig(gnoenv.RootDir())
cfg := DefaultNodeConfig(gnoenv.RootDir(), "gno.land")
cfg.PackagesPathList = pkgslist
return cfg
}
Expand Down
15 changes: 15 additions & 0 deletions gno.land/cmd/gnoland/testdata/addpkg_domain.txtar
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
gnoland start

# addpkg with anotherdomain.land
! gnokey maketx addpkg -pkgdir $WORK -pkgpath anotherdomain.land/r/foobar/bar -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1
stdout 'TX HASH:'
stderr 'invalid package path'
stderr 'invalid domain: anotherdomain.land/r/foobar/bar'

# addpkg with gno.land
gnokey maketx addpkg -pkgdir $WORK -pkgpath gno.land/r/foobar/bar -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1
stdout 'OK!'

-- bar.gno --
package bar
func Render(path string) string { return "hello" }
18 changes: 16 additions & 2 deletions gno.land/cmd/gnoland/testdata/genesis_params.txtar
Original file line number Diff line number Diff line change
@@ -1,14 +1,28 @@
# test for https://github.com/gnolang/gno/pull/3003
# Test for #3003, #2911.

gnoland start

# Query and validate official parameters.
# These parameters should ideally be tested in a txtar format to ensure that a
# default initialization of "gnoland" provides the expected default values.

# Verify the default chain domain parameter for Gno.land
gnokey query params/vm/gno.land/r/sys/params.vm.chain_domain.string
stdout 'data: "gno.land"$'

# Test custom parameters to confirm they return the expected values and types.

gnokey query params/vm/gno.land/r/sys/params.test.foo.string
stdout 'data: "bar"$'

gnokey query params/vm/gno.land/r/sys/params.test.foo.int64
stdout 'data: "-1337"'

gnokey query params/vm/gno.land/r/sys/params.test.foo.uint64
stdout 'data: "42"'

gnokey query params/vm/gno.land/r/sys/params.test.foo.bool
stdout 'data: true'
# XXX: bytes

# TODO: Consider adding a test case for a byte array parameter

4 changes: 2 additions & 2 deletions gno.land/cmd/gnoland/testdata/simulate_gas.txtar
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ gnoland start

# simulate only
gnokey maketx call -pkgpath gno.land/r/simulate -func Hello -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test -simulate only test1
stdout 'GAS USED: 50299'
stdout 'GAS USED: 51299'

# simulate skip
gnokey maketx call -pkgpath gno.land/r/simulate -func Hello -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test -simulate skip test1
stdout 'GAS USED: 50299' # same as simulate only
stdout 'GAS USED: 51299' # same as simulate only


-- package/package.gno --
Expand Down
2 changes: 1 addition & 1 deletion gno.land/genesis/genesis_params.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

## gnovm
["gno.land/r/sys/params.vm"]
# TODO: chain_domain.string = "gno.land"
chain_domain.string = "gno.land"
# TODO: max_gas.int64 = 100_000_000
# TODO: chain_tz.string = "UTC"
# TODO: default_storage_allowance.string = ""
Expand Down
9 changes: 8 additions & 1 deletion gno.land/pkg/gnoland/node_inmemory.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,11 @@ func NewMockedPrivValidator() bft.PrivValidator {
}

// NewDefaultGenesisConfig creates a default configuration for an in-memory node.
func NewDefaultGenesisConfig(chainid string) *bft.GenesisDoc {
func NewDefaultGenesisConfig(chainid, chaindomain string) *bft.GenesisDoc {
// custom chain domain
var domainParam Param
_ = domainParam.Parse("gno.land/r/sys/params.vm.chain_domain.string=" + chaindomain)

return &bft.GenesisDoc{
GenesisTime: time.Now(),
ChainID: chainid,
Expand All @@ -46,6 +50,9 @@ func NewDefaultGenesisConfig(chainid string) *bft.GenesisDoc {
AppState: &GnoGenesisState{
Balances: []Balance{},
Txs: []TxWithMetadata{},
Params: []Param{
domainParam,
},
},
}
}
Expand Down
4 changes: 2 additions & 2 deletions gno.land/pkg/sdk/vm/gas_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ func TestAddPkgDeliverTx(t *testing.T) {
assert.True(t, res.IsOK())

// NOTE: let's try to keep this bellow 100_000 :)
assert.Equal(t, int64(92825), gasDeliver)
assert.Equal(t, int64(93825), gasDeliver)
}

// Enough gas for a failed transaction.
Expand All @@ -95,7 +95,7 @@ func TestAddPkgDeliverTxFailed(t *testing.T) {
gasDeliver := gctx.GasMeter().GasConsumed()

assert.False(t, res.IsOK())
assert.Equal(t, int64(2231), gasDeliver)
assert.Equal(t, int64(3231), gasDeliver)
}

// Not enough gas for a failed transaction.
Expand Down
45 changes: 30 additions & 15 deletions gno.land/pkg/sdk/vm/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ func NewVMKeeper(
bank: bank,
prmk: prmk,
}

return vmk
}

Expand Down Expand Up @@ -192,6 +193,7 @@ func loadStdlibPackage(pkgPath, stdlibDir string, store gno.Store) {
}

m := gno.NewMachineWithOptions(gno.MachineOptions{
// XXX: gno.land, vm.domain, other?
PkgPath: "gno.land/r/stdlibs/" + pkgPath,
// PkgPath: pkgPath, XXX why?
Store: store,
Expand Down Expand Up @@ -226,20 +228,22 @@ func (vm *VMKeeper) getGnoTransactionStore(ctx sdk.Context) gno.TransactionStore
}

// Namespace can be either a user or crypto address.
var reNamespace = regexp.MustCompile(`^gno.land/(?:r|p)/([\.~_a-zA-Z0-9]+)`)

const sysUsersPkgParamPath = "gno.land/r/sys/params.sys.users_pkgpath.string"
var reNamespace = regexp.MustCompile(`^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/(?:r|p)/([\.~_a-zA-Z0-9]+)`)

// checkNamespacePermission check if the user as given has correct permssion to on the given pkg path
func (vm *VMKeeper) checkNamespacePermission(ctx sdk.Context, creator crypto.Address, pkgPath string) error {
var sysUsersPkg string
vm.prmk.GetString(ctx, sysUsersPkgParamPath, &sysUsersPkg)
sysUsersPkg := vm.getSysUsersPkgParam(ctx)
if sysUsersPkg == "" {
return nil
}
chainDomain := vm.getChainDomainParam(ctx)

store := vm.getGnoTransactionStore(ctx)

if !strings.HasPrefix(pkgPath, chainDomain+"/") {
return ErrInvalidPkgPath(pkgPath) // no match
}

match := reNamespace.FindStringSubmatch(pkgPath)
switch len(match) {
case 0:
Expand All @@ -248,9 +252,6 @@ func (vm *VMKeeper) checkNamespacePermission(ctx sdk.Context, creator crypto.Add
default:
panic("invalid pattern while matching pkgpath")
}
if len(match) != 2 {
return ErrInvalidPkgPath(pkgPath)
}
username := match[1]

// if `sysUsersPkg` does not exist -> skip validation.
Expand All @@ -263,6 +264,7 @@ func (vm *VMKeeper) checkNamespacePermission(ctx sdk.Context, creator crypto.Add
pkgAddr := gno.DerivePkgAddr(pkgPath)
msgCtx := stdlibs.ExecContext{
ChainID: ctx.ChainID(),
ChainDomain: chainDomain,
Height: ctx.BlockHeight(),
Timestamp: ctx.BlockTime().Unix(),
OrigCaller: creator.Bech32(),
Expand Down Expand Up @@ -320,6 +322,7 @@ func (vm *VMKeeper) AddPackage(ctx sdk.Context, msg MsgAddPackage) (err error) {
memPkg := msg.Package
deposit := msg.Deposit
gnostore := vm.getGnoTransactionStore(ctx)
chainDomain := vm.getChainDomainParam(ctx)

// Validate arguments.
if creator.IsZero() {
Expand All @@ -332,6 +335,9 @@ func (vm *VMKeeper) AddPackage(ctx sdk.Context, msg MsgAddPackage) (err error) {
if err := msg.Package.Validate(); err != nil {
return ErrInvalidPkgPath(err.Error())
}
if !strings.HasPrefix(pkgPath, chainDomain+"/") {
return ErrInvalidPkgPath("invalid domain: " + pkgPath)
}
if pv := gnostore.GetPackage(pkgPath, false); pv != nil {
return ErrPkgAlreadyExists("package already exists: " + pkgPath)
}
Expand Down Expand Up @@ -363,6 +369,7 @@ func (vm *VMKeeper) AddPackage(ctx sdk.Context, msg MsgAddPackage) (err error) {
// Parse and run the files, construct *PV.
msgCtx := stdlibs.ExecContext{
ChainID: ctx.ChainID(),
ChainDomain: chainDomain,
Height: ctx.BlockHeight(),
Timestamp: ctx.BlockTime().Unix(),
OrigCaller: creator.Bech32(),
Expand Down Expand Up @@ -461,8 +468,10 @@ func (vm *VMKeeper) Call(ctx sdk.Context, msg MsgCall) (res string, err error) {
// Make context.
// NOTE: if this is too expensive,
// could it be safely partially memoized?
chainDomain := vm.getChainDomainParam(ctx)
msgCtx := stdlibs.ExecContext{
ChainID: ctx.ChainID(),
ChainDomain: chainDomain,
Height: ctx.BlockHeight(),
Timestamp: ctx.BlockTime().Unix(),
OrigCaller: caller.Bech32(),
Expand Down Expand Up @@ -531,11 +540,12 @@ func (vm *VMKeeper) Run(ctx sdk.Context, msg MsgRun) (res string, err error) {
gnostore := vm.getGnoTransactionStore(ctx)
send := msg.Send
memPkg := msg.Package
chainDomain := vm.getChainDomainParam(ctx)

// coerce path to right one.
// the path in the message must be "" or the following path.
// this is already checked in MsgRun.ValidateBasic
memPkg.Path = "gno.land/r/" + msg.Caller.String() + "/run"
memPkg.Path = chainDomain + "/r/" + msg.Caller.String() + "/run"

// Validate arguments.
callerAcc := vm.acck.GetAccount(ctx, caller)
Expand All @@ -561,6 +571,7 @@ func (vm *VMKeeper) Run(ctx sdk.Context, msg MsgRun) (res string, err error) {
// Parse and run the files, construct *PV.
msgCtx := stdlibs.ExecContext{
ChainID: ctx.ChainID(),
ChainDomain: chainDomain,
Height: ctx.BlockHeight(),
Timestamp: ctx.BlockTime().Unix(),
OrigCaller: caller.Bech32(),
Expand Down Expand Up @@ -722,10 +733,12 @@ func (vm *VMKeeper) QueryEval(ctx sdk.Context, pkgPath string, expr string) (res
return "", err
}
// Construct new machine.
chainDomain := vm.getChainDomainParam(ctx)
msgCtx := stdlibs.ExecContext{
ChainID: ctx.ChainID(),
Height: ctx.BlockHeight(),
Timestamp: ctx.BlockTime().Unix(),
ChainID: ctx.ChainID(),
ChainDomain: chainDomain,
Height: ctx.BlockHeight(),
Timestamp: ctx.BlockTime().Unix(),
// OrigCaller: caller,
// OrigSend: send,
// OrigSendSpent: nil,
Expand Down Expand Up @@ -788,10 +801,12 @@ func (vm *VMKeeper) QueryEvalString(ctx sdk.Context, pkgPath string, expr string
return "", err
}
// Construct new machine.
chainDomain := vm.getChainDomainParam(ctx)
msgCtx := stdlibs.ExecContext{
ChainID: ctx.ChainID(),
Height: ctx.BlockHeight(),
Timestamp: ctx.BlockTime().Unix(),
ChainID: ctx.ChainID(),
ChainDomain: chainDomain,
Height: ctx.BlockHeight(),
Timestamp: ctx.BlockTime().Unix(),
// OrigCaller: caller,
// OrigSend: jsend,
// OrigSendSpent: nil,
Expand Down
Loading

0 comments on commit 45276d6

Please sign in to comment.