Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
ee9fbe1
New feature 25 "Deterministic Finality and Ride V9" added.
alexeykiselev Sep 22, 2025
547e9da
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Sep 24, 2025
bb070a1
Added bls signature methods (#1812)
esuwu Sep 29, 2025
59507b9
Added block finality schemas (#1833)
esuwu Sep 29, 2025
95c9e0f
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Sep 30, 2025
c01d622
Ride version 9 added. (#1761)
alexeykiselev Sep 30, 2025
7273f85
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Sep 30, 2025
29fdea9
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Oct 6, 2025
f33a9d2
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Oct 10, 2025
4bf39f1
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Oct 10, 2025
bb7402c
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Oct 15, 2025
72ac0fe
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Oct 15, 2025
c5d3bd5
Protobuf schemas updated to support CommitToGeneration transaction sn…
alexeykiselev Oct 15, 2025
af84eee
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Oct 29, 2025
f201259
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Nov 1, 2025
5ace672
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Nov 5, 2025
6997f12
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Nov 6, 2025
b815c4e
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Nov 18, 2025
46dba65
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Nov 20, 2025
0ee716d
Protobuf schemas submodule updated to the latest commit.
alexeykiselev Nov 21, 2025
b5ccda4
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Nov 25, 2025
68ff378
Restore -exclude-generated flag for gosec.
alexeykiselev Nov 25, 2025
c60d6cf
Merged from master
esuwu Dec 4, 2025
9526746
Merged from master
esuwu Dec 4, 2025
dc5359b
Returned exclude generated
esuwu Dec 4, 2025
999363d
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Dec 5, 2025
caae0de
Merge branch 'master' into determenistic-finality-feature
nickeskov Dec 9, 2025
ecf096f
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Dec 10, 2025
7b47f39
Protobuf code regenerated.
alexeykiselev Dec 10, 2025
a4c2fb9
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Dec 11, 2025
d4f42cf
Protobuf schemas updated and code regenerated.
alexeykiselev Dec 15, 2025
6149756
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Dec 15, 2025
099db31
Merge branch 'master' into determenistic-finality-feature
nickeskov Dec 15, 2025
1463fa0
Add commit to generation transaction (#1841)
alexeykiselev Dec 16, 2025
8d9c3fd
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Dec 16, 2025
87af3f3
Add generation balance validation (#1938)
alexeykiselev Dec 16, 2025
6c8360e
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Dec 17, 2025
9320382
Fix semgrep issues (#1946)
alexeykiselev Dec 17, 2025
56620d6
Fix generation commitment atomic snapshot JSON representation. (#1949)
nickeskov Dec 18, 2025
8377e30
Fix generation commitment atomic atomic snapshot from protobuf (#1950)
nickeskov Dec 18, 2025
f814f38
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Dec 18, 2025
7284746
Add commit to generation transaction to ride v9 (#1953)
alexeykiselev Dec 29, 2025
a11e5aa
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Dec 29, 2025
ee8babd
Fix gosec issues. Original errors wrapped.
alexeykiselev Dec 29, 2025
3f4519f
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Jan 19, 2026
dbf124b
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Jan 19, 2026
5f2e490
Backport missing LibV9 switch branches from PR #1957. (#1967)
alexeykiselev Jan 26, 2026
eae7196
Scala-compatible way of BLS keys generation added. (#1971)
alexeykiselev Jan 27, 2026
4b5b1b7
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Feb 5, 2026
bf284d7
P-256 signature verification with Ride V9 (#1957)
nickeskov Feb 9, 2026
62bedbe
Go version updated to 1.25. (#1985)
alexeykiselev Feb 10, 2026
f1fafa1
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Feb 14, 2026
4881ec9
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Feb 16, 2026
1396934
Complexities of SHA256 functions updated for RideV9. (#1990)
alexeykiselev Feb 16, 2026
ec904d4
Support Finality and Block Endorsements (#1852)
esuwu Feb 17, 2026
b8f32c6
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Feb 19, 2026
705cc5c
Added the lower bound finalization calculation, even if finalization …
esuwu Feb 20, 2026
22dd0f3
Cleared endorsement pool caches for rollbacks
esuwu Feb 20, 2026
0f99416
Broken linter directive removed.
alexeykiselev Feb 24, 2026
6249ae7
Signing a CommitToGeneration transaction using API without providing …
alexeykiselev Feb 25, 2026
a3be1f3
Added function to combine FinalizationVoting structures. (#2012)
alexeykiselev Feb 27, 2026
4a192c9
Finality forks fix (#2013)
esuwu Feb 27, 2026
528c99b
Modify Ride function SecP256Verify so it accepts message and calculat…
alexeykiselev Feb 27, 2026
44b3b37
Fix bug with 'resetDeposits' method: newest method should be used.
nickeskov Mar 6, 2026
41e821c
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Mar 10, 2026
78a9e73
Update circl to v1.6.3. Update exp to latest version.
alexeykiselev Mar 10, 2026
bd950d0
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Mar 12, 2026
f6f472b
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Mar 19, 2026
b597986
Fix bug with EOF error in 'prepareFinalizationVerification'.
nickeskov Mar 23, 2026
ccc7487
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Mar 24, 2026
a9d019b
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Mar 25, 2026
33c9773
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Mar 26, 2026
e1a3964
Added delayed finalization (#2017)
esuwu Mar 26, 2026
224a6bf
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Mar 27, 2026
522fe19
New event BlockEndorsementEvent added to all states. (#2045)
alexeykiselev Mar 29, 2026
4f5342c
Utility to create CommitToGeneration transactions added. (#2044)
alexeykiselev Mar 31, 2026
6f6bc8b
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Mar 31, 2026
4545807
Merge branch 'master' into determenistic-finality-feature
nickeskov Apr 6, 2026
83ec0e7
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Apr 9, 2026
b3afef4
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Apr 13, 2026
aeef4e4
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Apr 13, 2026
bf64777
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Apr 15, 2026
fea0c10
Generators set (#2055)
alexeykiselev Apr 16, 2026
6517b06
Merge branch 'master' into determenistic-finality-feature
alexeykiselev Apr 16, 2026
a9ae9e4
Add simple finality itest (#2063)
alexeykiselev Apr 17, 2026
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 .github/workflows/go.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,19 @@ jobs:
with:
version: latest
args: -c .golangci.yml

# Strict linter configuration, only checking new code from pull requests.
- name: golangci-lint-strict
run: golangci-lint run -c .golangci-strict.yml --new-from-rev=origin/master

# Check for modern Go code patterns
- name: modernize check
run: go run golang.org/x/tools/gopls/internal/analysis/modernize/cmd/modernize@v0.20.0 ./...
- name: Run modernize
shell: bash
run: |
set +o pipefail
go run golang.org/x/tools/go/analysis/passes/modernize/cmd/modernize@latest ./... 2>&1 | \
grep -vE '\.(pb|gen)\.go|mock|_string.go|^exit status|^go: downloading' | \
{ output=$(cat); [ -n "$output" ] && { echo "$output"; exit 1; } || exit 0; }

build:
name: ubuntu
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/security.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,15 @@ jobs:
uses: securego/gosec@223e19b8856e00f02cc67804499a83f77e208f3c # v2.25.0
with:
# with '-no-fail' we let the report trigger content trigger a failure using the GitHub Security features.
args: "-no-fail -fmt sarif -out gosec.sarif ./..."
args: "-no-fail -exclude-generated -fmt sarif -out gosec.sarif ./..."
- name: Transform gosec SARIF to meet SARIF 2.1.0 schema requirements
# Produces SARIF file has two incompatibilities with SARIF 2.1.0 schema all of them are in `fixes` object:
# 1. Field `description` contains only `markdown` property, but `text` property is mandatory.
# 2. Property `artifactChanges` must be non-empty array with valid `artifactChange` object.
# To fix those issues the first part of jq query copies content of `markdown` field into `text` field
# if it's not present. In the second part if the `fixes` object has null array as `artifactChanges` the empty
# valid `artifactChange` object inserted.
# After fix of mentioned gosec issues this step can be removed.
# After fix of mentioned gosec issues this step can be removed.
run: |
set -e
jq 'walk(if type=="object" and has("markdown") and (.text == null or .text == "") then .text = .markdown else . end) | (.runs[].results[]? .fixes[]? .artifactChanges) |= (if . == null then [{"artifactLocation": { "uri": "" }, "replacements": [{"deletedRegion": {"byteOffset": 0, "byteLength": 0 }}]}] else . end)' gosec.sarif > gosec_fixed.sarif
Expand Down
1 change: 1 addition & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
[submodule "pkg/grpc/protobuf-schemas"]
path = pkg/grpc/protobuf-schemas
url = https://github.com/wavesplatform/protobuf-schemas
branch = deterministic-finality
4 changes: 4 additions & 0 deletions .golangci-strict.yml
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,10 @@ linters:
- github.com/jmoiron/sqlx
usetesting:
os-setenv: true
revive:
rules:
- name: var-naming
disable: true
exclusions:
generated: lax
presets:
Expand Down
5 changes: 5 additions & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
version: "2"
linters:
enable:
- exhaustive
settings:
cyclop:
max-complexity: 30
package-average: 10
errcheck:
check-type-assertions: false
exhaustive:
check:
- switch
exhaustruct:
exclude:
- ^net/http.Client$
Expand Down
3 changes: 3 additions & 0 deletions .semgrepignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,6 @@ cmd/wmd/internal/swagger/

# Ignore testdata folders
pkg/state/testdata/

# Ignore generated files
**/*.pb.go
Comment thread Dismissed
22 changes: 21 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,27 @@ dist-convert: release-convert
@cd ./build/bin/darwin-amd64/; tar pzcvf ../../dist/convert_$(VERSION)_macOS-amd64.tar.gz ./convert*
@cd ./build/bin/darwin-arm64/; tar pzcvf ../../dist/convert_$(VERSION)_macOS-arm64.tar.gz ./convert*

dist: clean dist-chaincmp dist-importer dist-node dist-wallet dist-compiler
build-commit-native:
@go build -o build/bin/native/commit ./cmd/commit
build-commit-linux:
@CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o build/bin/linux-amd64/commit ./cmd/commit
build-commit-darwin-amd64:
@CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o build/bin/darwin-amd64/commit ./cmd/commit
build-commit-darwin-arm64:
@CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -o build/bin/darwin-arm64/commit ./cmd/commit
build-commit-windows:
@CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o build/bin/windows-amd64/commit.exe ./cmd/commit

release-commit: ver build-commit-linux build-commit-darwin-amd64 build-commit-darwin-arm64 build-commit-windows

dist-commit: release-commit
@mkdir -p build/dist
@cd ./build/; zip -j ./dist/commit_$(VERSION)_Windows-amd64.zip ./bin/windows-amd64/commit*
@cd ./build/bin/linux-amd64/; tar pzcvf ../../dist/commit_$(VERSION)_Linux-amd64.tar.gz ./commit*
@cd ./build/bin/darwin-amd64/; tar pzcvf ../../dist/commit_$(VERSION)_macOS-amd64.tar.gz ./commit*
@cd ./build/bin/darwin-arm64/; tar pzcvf ../../dist/commit_$(VERSION)_macOS-arm64.tar.gz ./commit*

dist: clean dist-chaincmp dist-importer dist-node dist-wallet dist-compiler dist-convert dist-commit

build: vendor ver build-chaincmp-native build-blockcmp-native build-node-native build-importer-native build-wallet-native build-rollback-native build-compiler-native build-statehash-native build-convert-native

Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -206,3 +206,4 @@ make release-node

* [chaincmp](https://github.com/wavesplatform/gowaves/blob/master/cmd/chaincmp/README.md) - utility to compare blockchains on few nodes
* [wmd](https://github.com/wavesplatform/gowaves/blob/master/cmd/wmd/README.md) - service to provide a market data for Waves DEX transactions
* [commit](https://github.com/wavesplatform/gowaves/blob/master/cmd/commit/README.md) - utility to create CommitToGeneration transactions
39 changes: 39 additions & 0 deletions cmd/commit/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Utility `commit`

The `commit` utility creates `CommitToGeneration` transaction with signed proof of possession (PoP) and
writes it's JSON to stdout.

## Command Line Options

```
-height uint
Height of generation period start
-private-key string
Waves private key in Base58 encoding
-fee uint
Transaction fee in wavelets (default: 0.1 Waves)
-timestamp string
Transaction timestamp. Accepts:
(empty) current time in UNIX milliseconds
HH today at the given hour, e.g. "14"
HH:MM today at the given hour and minute, e.g. "14:30"
HH:MM:SS today at the given time, e.g. "14:30:45"
+<duration> current time shifted forward, e.g. "+1h", "+30m"
-<duration> current time shifted backward, e.g. "-30m"
```

## Example

```bash
./commit -private-key <base58-private-key> -height 1000000
```

The transaction JSON is written to stdout and can be piped to `convert` utility for signing and
later to the node broadcast endpoint:

```bash
./commit -private-key <base58-private-key> -height <height> | \
./convert -private-key <base58-private-key> -to-json | \
curl -X POST -H 'Content-Type: application/json' --data-binary @- \
https://<node-host>/transactions/broadcast
```
139 changes: 139 additions & 0 deletions cmd/commit/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
package main

import (
"errors"
"flag"
"fmt"
"io"
"os"
"strings"
"time"

"github.com/ccoveille/go-safecast/v2"

"github.com/wavesplatform/gowaves/pkg/crypto"
"github.com/wavesplatform/gowaves/pkg/state"
)

const baseFee = state.CommitmentFeeInFeeUnits * state.FeeUnit

type config struct {
height uint32
sk crypto.SecretKey
pk crypto.PublicKey
fee uint64
timestamp uint64
}

func (c *config) parse(args []string) error {
if len(args) < 1 {
return errors.New("invalid number of arguments")
}
fs := flag.NewFlagSet(args[0], flag.ContinueOnError)
fs.SetOutput(io.Discard) // suppress automatic output; we print usage ourselves below
var (
height uint64
privateKey string
fee uint64
ts string
)
fs.Uint64Var(&height, "height", 0, "Height of generation period start")
fs.StringVar(&privateKey, "private-key", "", "Waves private key in Base58")
fs.Uint64Var(&fee, "fee", baseFee, "Transaction fee (default: 0.1 Waves)")
fs.StringVar(&ts, "timestamp", "",
"Transaction timestamp (default: current time), can be absolute (e.g. '15:04') or relative "+
"(e.g. '+1h30m' or '-45s')")
if err := fs.Parse(args[1:]); err != nil {
fs.SetOutput(os.Stderr)
fs.Usage()
return err
}

if height == 0 {
return errors.New("option -height is required and must be positive")
}
h, err := safecast.Convert[uint32](height)
if err != nil {
return err
}
c.height = h

if len(privateKey) == 0 {
return errors.New("option -private-key is required")
}
sk, err := crypto.NewSecretKeyFromBase58(privateKey)
if err != nil {
return fmt.Errorf("failed to parse private key: %w", err)
}
c.sk = sk
c.pk = crypto.GeneratePublicKey(sk)

if fee < baseFee {
return fmt.Errorf("option -fee must be equal or more than base fee %d", baseFee)
}
c.fee = fee

timestamp, tsErr := parseTimestamp(ts)
if tsErr != nil {
return tsErr
}
c.timestamp = timestamp
return nil
}

func parseTimestamp(ts string) (uint64, error) {
now := time.Now()
if len(ts) == 0 {
ms, err := safecast.Convert[uint64](now.UnixMilli())
if err != nil {
return 0, fmt.Errorf("failed to get current timestamp: %w", err)
}
return ms, nil
}
if strings.HasPrefix(ts, "+") || strings.HasPrefix(ts, "-") {
return parseTimestampShift(ts, now)
}
return parseTimeString(ts, now)
}

func parseTimestampShift(ts string, now time.Time) (uint64, error) {
d, err := time.ParseDuration(ts)
if err != nil {
return 0, fmt.Errorf("invalid time shift: %w", err)
}
ms, convErr := safecast.Convert[uint64](now.Add(d).UnixMilli())
if convErr != nil {
return 0, fmt.Errorf("invalid timestamp from time shift %q: %w", ts, convErr)
}
return ms, nil
}

func parseTimeString(ts string, now time.Time) (uint64, error) {
const (
layoutHours = "15"
layoutMinutes = "15:04"
layoutSeconds = "15:04:05"
)
var layout string
switch strings.Count(ts, ":") {
case 0:
layout = layoutHours
case 1:
layout = layoutMinutes
case 2:
layout = layoutSeconds
default:
return 0, fmt.Errorf("invalid timestamp format %q", ts)
}
t, err := time.Parse(layout, ts)
if err != nil {
return 0, fmt.Errorf("invalid timestamp %q: %w", ts, err)
}
y, m, d := now.Date()
combined := time.Date(y, m, d, t.Hour(), t.Minute(), t.Second(), 0, now.Location())
ms, convErr := safecast.Convert[uint64](combined.UnixMilli())
if convErr != nil {
return 0, fmt.Errorf("failed to convert timestamp: %w", convErr)
}
return ms, nil
}
Loading
Loading