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

feat: add genesis packages with transaction signing #3280

Merged
Merged
Show file tree
Hide file tree
Changes from 46 commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
aa15626
feat: add genesis packages with transaction signing
Villaquiranm Dec 5, 2024
169e2a3
fix linter
Villaquiranm Dec 5, 2024
069c01b
Merge branch 'master' into feat/sign-transactions-genesis
Villaquiranm Dec 6, 2024
b46af72
Merge branch 'master' of github.com:gnolang/gno into feat/sign-transa…
Villaquiranm Dec 9, 2024
4eb4f8a
fix tests
Villaquiranm Dec 9, 2024
8a72345
Merge branch 'master' of github.com:gnolang/gno into feat/sign-transa…
Villaquiranm Dec 12, 2024
90e0c0c
testing fix
Villaquiranm Dec 12, 2024
af86152
sign packages by default with test1 account
Villaquiranm Dec 12, 2024
46d6129
Merge branch 'master' of github.com:gnolang/gno into feat/sign-transa…
Villaquiranm Dec 12, 2024
bf39fe7
Add test
Villaquiranm Dec 12, 2024
66b1725
remove temporary fix on gnostart
Villaquiranm Dec 12, 2024
5b4aadf
change default name to dev
Villaquiranm Dec 12, 2024
98f9ae0
change back to tendermit_test
Villaquiranm Dec 12, 2024
d70fa9b
do not check verification on gnodev tests
Villaquiranm Dec 12, 2024
ed0784f
Merge branch 'master' of github.com:gnolang/gno into feat/sign-transa…
Villaquiranm Dec 17, 2024
ed1c3c6
configure genesis transaction verification depending on service
Villaquiranm Dec 17, 2024
1ea0bca
Merge branch 'master' of github.com:gnolang/gno into feat/sign-transa…
Villaquiranm Dec 17, 2024
8dfb9bf
Fix tests
Villaquiranm Dec 17, 2024
6c8775f
Merge branch 'master' of github.com:gnolang/gno into feat/sign-transa…
Villaquiranm Dec 17, 2024
037f832
Merge branch 'master' into feat/sign-transactions-genesis
Villaquiranm Dec 18, 2024
76f3fdd
Merge branch 'master' into feat/sign-transactions-genesis
Villaquiranm Dec 18, 2024
c72fe3c
fix txtar tests
Villaquiranm Dec 18, 2024
d0715e9
fix TestCallSingle_Integration test
Villaquiranm Dec 18, 2024
6bc9df9
Merge branch 'master' into feat/sign-transactions-genesis
Villaquiranm Dec 19, 2024
94ad25b
Merge branch 'master' into feat/sign-transactions-genesis
Villaquiranm Dec 19, 2024
2bddc48
Fix tests
Villaquiranm Dec 19, 2024
8b27abe
add comment on gnoHome config
Villaquiranm Dec 19, 2024
a0d0b9c
Merge branch 'master' of github.com:gnolang/gno into feat/sign-transa…
Villaquiranm Dec 20, 2024
5aec227
Merge branch 'master' into feat/sign-transactions-genesis
Villaquiranm Dec 20, 2024
bb2f53f
Merge branch 'master' into feat/sign-transactions-genesis
Villaquiranm Dec 20, 2024
3c887a9
make tidy
Villaquiranm Dec 20, 2024
6e8c63f
Merge branch 'master' into feat/sign-transactions-genesis
Villaquiranm Dec 23, 2024
9430d13
Merge branch 'master' into feat/sign-transactions-genesis
Villaquiranm Dec 23, 2024
64cf627
Merge branch 'master' into feat/sign-transactions-genesis
Villaquiranm Dec 25, 2024
bbc1055
Merge branch 'master' into feat/sign-transactions-genesis
Villaquiranm Dec 30, 2024
0394a1b
Merge branch 'master' into feat/sign-transactions-genesis
Villaquiranm Jan 2, 2025
7f1fbc9
Merge branch 'master' into feat/sign-transactions-genesis
Villaquiranm Jan 6, 2025
c967c2f
Solve comments
Villaquiranm Jan 6, 2025
14c6906
Merge branch 'master' into feat/sign-transactions-genesis
Villaquiranm Jan 7, 2025
09dce43
fix more comments :)
Villaquiranm Jan 7, 2025
9f59ccb
make tidy
Villaquiranm Jan 7, 2025
e33600f
sign load packages on integration tests
Villaquiranm Jan 7, 2025
2a67769
improve SignTx function
Villaquiranm Jan 8, 2025
30c5a42
Merge branch 'master' of github.com:gnolang/gno into feat/sign-transa…
Villaquiranm Jan 8, 2025
7a134ab
fix build
Villaquiranm Jan 8, 2025
cfcc35d
improve check
Villaquiranm Jan 8, 2025
6df2bc9
Merge branch 'master' into feat/sign-transactions-genesis
Villaquiranm Jan 9, 2025
e0bb164
remove creator from LoadPackages func
Villaquiranm Jan 9, 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
2 changes: 2 additions & 0 deletions contribs/gnodev/pkg/dev/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -489,6 +489,8 @@ func (n *Node) rebuildNode(ctx context.Context, genesis gnoland.GnoGenesisState)
// Speed up stdlib loading after first start (saves about 2-3 seconds on each reload).
nodeConfig.CacheStdlibLoad = true
nodeConfig.Genesis.ConsensusParams.Block.MaxGas = n.config.MaxGasPerBlock
// Genesis verification is always false with Gnodev
nodeConfig.SkipGenesisVerification = true

// recoverFromError handles panics and converts them to errors.
recoverFromError := func() {
Expand Down
112 changes: 86 additions & 26 deletions contribs/gnogenesis/internal/txs/txs_add_packages.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ import (
"errors"
"flag"
"fmt"
"os"

"github.com/gnolang/gno/tm2/pkg/crypto"
"github.com/gnolang/gno/tm2/pkg/crypto/keys"

"github.com/gnolang/gno/gno.land/pkg/gnoland"
"github.com/gnolang/gno/gno.land/pkg/gnoland/ugnot"
Expand All @@ -15,28 +16,45 @@ import (
"github.com/gnolang/gno/tm2/pkg/std"
)

var (
errInvalidPackageDir = errors.New("invalid package directory")
errInvalidDeployerAddr = errors.New("invalid deployer address")
const (
defaultAccount_Name = "test1"
defaultAccount_Address = "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"
defaultAccount_Seed = "source bonus chronic canvas draft south burst lottery vacant surface solve popular case indicate oppose farm nothing bullet exhibit title speed wink action roast"
defaultAccount_publicKey = "gpub1pgfj7ard9eg82cjtv4u4xetrwqer2dntxyfzxz3pq0skzdkmzu0r9h6gny6eg8c9dc303xrrudee6z4he4y7cs5rnjwmyf40yaj"
)

var errInvalidPackageDir = errors.New("invalid package directory")

// Keep in sync with gno.land/cmd/start.go
var (
defaultCreator = crypto.MustAddressFromString("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5") // test1
genesisDeployFee = std.NewFee(50000, std.MustParseCoin(ugnot.ValueString(1000000)))
)
var genesisDeployFee = std.NewFee(50000, std.MustParseCoin(ugnot.ValueString(1000000)))

type addPkgCfg struct {
txsCfg *txsCfg
deployerAddress string
txsCfg *txsCfg
keyName string
gnoHome string // default GNOHOME env var, just here to ease testing with parallel tests
insecurePasswordStdin bool
}

func (c *addPkgCfg) RegisterFlags(fs *flag.FlagSet) {
fs.StringVar(
&c.deployerAddress,
"deployer-address",
defaultCreator.String(),
"the address that will be used to deploy the package",
&c.keyName,
"key-name",
"",
"The package deployer key name or address contained on gnokey",
)

fs.StringVar(
&c.gnoHome,
"gno-home",
os.Getenv("GNOHOME"),
"the gno home directory",
)

fs.BoolVar(
&c.insecurePasswordStdin,
"insecure-password-stdin",
false,
"the gno home directory",
)
}

Expand Down Expand Up @@ -65,30 +83,46 @@ func execTxsAddPackages(
io commands.IO,
args []string,
) error {
var (
keyname = defaultAccount_Name
keybase keys.Keybase
pass string
)
// Load the genesis
genesis, loadErr := types.GenesisDocFromFile(cfg.txsCfg.GenesisPath)
if loadErr != nil {
return fmt.Errorf("unable to load genesis, %w", loadErr)
genesis, err := types.GenesisDocFromFile(cfg.txsCfg.GenesisPath)
if err != nil {
return fmt.Errorf("unable to load genesis, %w", err)
}

// Make sure the package dir is set
if len(args) == 0 {
return errInvalidPackageDir
}

var (
creator = defaultCreator
err error
)

// Check if the deployer address is set
if cfg.deployerAddress != defaultCreator.String() {
creator, err = crypto.AddressFromString(cfg.deployerAddress)
if cfg.keyName != "" {
keyname = cfg.keyName
keybase, err = keys.NewKeyBaseFromDir(cfg.gnoHome)
if err != nil {
return fmt.Errorf("unable to load keybase: %w", err)
}
pass, err = io.GetPassword("Enter password.", cfg.insecurePasswordStdin)
if err != nil {
return fmt.Errorf("cannot read password: %w", err)
}
} else {
keybase = keys.NewInMemory()
_, err := keybase.CreateAccount(defaultAccount_Name, defaultAccount_Seed, "", "", 0, 0)
if err != nil {
return fmt.Errorf("%w, %w", errInvalidDeployerAddr, err)
return fmt.Errorf("unable to create account: %w", err)
}
}

info, err := keybase.GetByNameOrAddress(keyname)
if err != nil {
return fmt.Errorf("unable to find key in keybase: %w", err)
}

creator := info.GetAddress()
parsedTxs := make([]gnoland.TxWithMetadata, 0)
for _, path := range args {
// Generate transactions from the packages (recursively)
Expand All @@ -97,6 +131,10 @@ func execTxsAddPackages(
return fmt.Errorf("unable to load txs from directory, %w", err)
}

if err := signTxs(txs, keybase, genesis.ChainID, keyname, pass); err != nil {
return fmt.Errorf("unable to sign txs, %w", err)
}

parsedTxs = append(parsedTxs, txs...)
}

Expand All @@ -117,3 +155,25 @@ func execTxsAddPackages(

return nil
}

func signTxs(txs []gnoland.TxWithMetadata, keybase keys.Keybase, chainID, keyname string, password string) error {
for index, tx := range txs {
// Here accountNumber and sequenceNumber are set to 0 because they are considered as 0 on genesis transactions.
signBytes, err := tx.Tx.GetSignBytes(chainID, 0, 0)
if err != nil {
return fmt.Errorf("unable to load txs from directory, %w", err)
}
signature, publicKey, err := keybase.Sign(keyname, password, signBytes)
if err != nil {
return fmt.Errorf("unable sign tx %w", err)
}
txs[index].Tx.Signatures = []std.Signature{
{
PubKey: publicKey,
Signature: signature,
},
}
}

return nil
}
Loading
Loading