Skip to content

Commit

Permalink
Merge pull request #444 from iotaledger/debug/metadata
Browse files Browse the repository at this point in the history
Fixes for REST API, RMC and visualizer
  • Loading branch information
karimodm authored Oct 19, 2023
2 parents c98efdf + 3d04adb commit 926bf11
Show file tree
Hide file tree
Showing 25 changed files with 159 additions and 107 deletions.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion components/dashboard/frontend/build/index.html
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<!doctype html> <html> <head> <meta charset="utf-8"> <title>iota-core Dashboard</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"/> </head> <body> <div id="root"></div> <script type="text/javascript" src="/app/a1e7322de4eb5154c0c3.js"></script><script type="text/javascript" src="/app/vendor.146c9687b00ba21e0070.js"></script><script type="text/javascript" src="/app/app.9e5b91b17efd1cc0a4d0.js"></script></body> </html>
<!doctype html> <html> <head> <meta charset="utf-8"> <title>iota-core Dashboard</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"/> </head> <body> <div id="root"></div> <script type="text/javascript" src="/app/a1e7322de4eb5154c0c3.js"></script><script type="text/javascript" src="/app/vendor.146c9687b00ba21e0070.js"></script><script type="text/javascript" src="/app/app.991aa07a823b10139416.js"></script></body> </html>
4 changes: 2 additions & 2 deletions components/dashboard/frontend/src/app/misc/Payload.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
export enum PayloadType {
TaggedData = 5,
Transaction = 6,
TaggedData = 0,
Transaction = 1,
Faucet = 3,
}

Expand Down
25 changes: 12 additions & 13 deletions components/dashboard/visualizer.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/iotaledger/iota-core/pkg/daemon"
"github.com/iotaledger/iota-core/pkg/model"
"github.com/iotaledger/iota-core/pkg/protocol/engine/blocks"
"github.com/iotaledger/iota-core/pkg/protocol/engine/mempool"
"github.com/iotaledger/iota-core/pkg/protocol/engine/tipmanager"
iotago "github.com/iotaledger/iota.go/v4"
)
Expand Down Expand Up @@ -81,22 +82,20 @@ func sendTipInfo(block *blocks.Block, isTip bool) {

func runVisualizer(component *app.Component) {
if err := component.Daemon().BackgroundWorker("Dashboard[Visualizer]", func(ctx context.Context) {

deps.Protocol.MainEngineInstance().Ledger.MemPool().OnSignedTransactionAttached(func(signedTransactionMetadata mempool.SignedTransactionMetadata) {
signedTransactionMetadata.OnSignaturesValid(func() {
transactionMetadata := signedTransactionMetadata.TransactionMetadata()
transactionMetadata.OnAccepted(func() {
attachmentID := transactionMetadata.EarliestIncludedAttachment()
sendTxAccepted(attachmentID, true)
})
})
})

unhook := lo.Batch(
deps.Protocol.Events.Engine.BlockDAG.BlockAttached.Hook(func(block *blocks.Block) {
sendVertex(block, false)

signedTransaction, hasTx := block.SignedTransaction()
if hasTx {
txMetadata, exists := deps.Protocol.MainEngineInstance().Ledger.MemPool().TransactionMetadata(lo.PanicOnErr(signedTransaction.Transaction.ID()))
if exists {
txMetadata.OnAccepted(func() {
sendTxAccepted(block.ID(), true)
})
}
}
// if block.ID().Slot() > slot.Index(currentSlot.Load()) {
// currentSlot.Store(int64(block.ID().Slot()))
// }
}, event.WithWorkerPool(component.WorkerPool)).Unhook,
deps.Protocol.Events.Engine.BlockGadget.BlockConfirmed.Hook(func(block *blocks.Block) {
sendVertex(block, block.IsConfirmed())
Expand Down
17 changes: 4 additions & 13 deletions components/restapi/core/accounts.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (

"github.com/labstack/echo/v4"

"github.com/iotaledger/hive.go/core/safemath"
"github.com/iotaledger/hive.go/ierrors"
"github.com/iotaledger/hive.go/lo"
"github.com/iotaledger/inx-app/pkg/httpserver"
Expand All @@ -23,28 +22,20 @@ func congestionForAccountID(c echo.Context) (*apimodels.CongestionResponse, erro
return nil, err
}

slot := deps.Protocol.MainEngineInstance().SyncManager.LatestCommitment().Slot()
commitment := deps.Protocol.MainEngineInstance().SyncManager.LatestCommitment()

acc, exists, err := deps.Protocol.MainEngineInstance().Ledger.Account(accountID, slot)
acc, exists, err := deps.Protocol.MainEngineInstance().Ledger.Account(accountID, commitment.Slot())
if err != nil {
return nil, ierrors.Wrapf(err, "failed to get account: %s form the Ledger", accountID.ToHex())
}
if !exists {
return nil, ierrors.Errorf("account not found: %s", accountID.ToHex())
}
rmcSlot, err := safemath.SafeSub(slot, deps.Protocol.APIForSlot(slot).ProtocolParameters().MaxCommittableAge())
if err != nil {
rmcSlot = 0
}
rmc, err := deps.Protocol.MainEngineInstance().Ledger.RMCManager().RMC(rmcSlot)
if err != nil {
return nil, ierrors.Wrapf(err, "failed to get RMC for slot: %d", rmcSlot)
}

return &apimodels.CongestionResponse{
Slot: slot,
Slot: commitment.Slot(),
Ready: deps.Protocol.MainEngineInstance().Scheduler.IsBlockIssuerReady(accountID),
ReferenceManaCost: rmc,
ReferenceManaCost: commitment.ReferenceManaCost(),
BlockIssuanceCredits: acc.Credits.Value,
}, nil
}
Expand Down
15 changes: 13 additions & 2 deletions components/restapi/core/blocks.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,20 @@ func blockMetadataByID(c echo.Context) (*apimodels.BlockMetadataResponse, error)
return blockMetadataByBlockID(blockID)
}

func blockIssuance(_ echo.Context) (*apimodels.IssuanceBlockHeaderResponse, error) {
func blockIssuanceBySlot(slotIndex iotago.SlotIndex) (*apimodels.IssuanceBlockHeaderResponse, error) {
references := deps.Protocol.MainEngineInstance().TipSelection.SelectTips(iotago.BlockMaxParents)
slotCommitment := deps.Protocol.MainEngineInstance().SyncManager.LatestCommitment()

var slotCommitment *model.Commitment
var err error
// by default we use latest commitment
if slotIndex == 0 {
slotCommitment = deps.Protocol.MainEngineInstance().SyncManager.LatestCommitment()
} else {
slotCommitment, err = deps.Protocol.MainEngineInstance().Storage.Commitments().Load(slotIndex)
if err != nil {
return nil, ierrors.Wrapf(err, "failed to load commitment for requested slot %d", slotIndex)
}
}

if len(references[iotago.StrongParentType]) == 0 {
return nil, ierrors.Wrap(echo.ErrServiceUnavailable, "get references failed")
Expand Down
4 changes: 3 additions & 1 deletion components/restapi/core/component.go
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,9 @@ func configure() error {
}, checkNodeSynced())

routeGroup.GET(RouteBlockIssuance, func(c echo.Context) error {
resp, err := blockIssuance(c)
index, _ := httpserver.ParseSlotQueryParam(c, restapipkg.ParameterSlotIndex)

resp, err := blockIssuanceBySlot(index)
if err != nil {
return err
}
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ require (
github.com/iotaledger/hive.go/stringify v0.0.0-20231019113503-7986872a7a38
github.com/iotaledger/inx-app v1.0.0-rc.3.0.20231011161248-cf0bd6e08811
github.com/iotaledger/inx/go v1.0.0-rc.2.0.20231011154428-257141868dad
github.com/iotaledger/iota.go/v4 v4.0.0-20231019083312-e415fefc417c
github.com/iotaledger/iota.go/v4 v4.0.0-20231019112751-e9872df31648
github.com/labstack/echo/v4 v4.11.2
github.com/labstack/gommon v0.4.0
github.com/libp2p/go-libp2p v0.30.0
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -309,8 +309,8 @@ github.com/iotaledger/inx-app v1.0.0-rc.3.0.20231011161248-cf0bd6e08811 h1:nR8uT
github.com/iotaledger/inx-app v1.0.0-rc.3.0.20231011161248-cf0bd6e08811/go.mod h1:rmclNpXw5sKJDHU0e51Ar/9zL00P7Uu9hkfaM7vAAiE=
github.com/iotaledger/inx/go v1.0.0-rc.2.0.20231011154428-257141868dad h1:TRM9EkAole9fYY1vHEVQ6zCEOGuvCWq/bczZ98Al5Ec=
github.com/iotaledger/inx/go v1.0.0-rc.2.0.20231011154428-257141868dad/go.mod h1:plZ0+8yLdDWHedj3SfHUwQtIETD+lcS6M1iEAxcjzJ4=
github.com/iotaledger/iota.go/v4 v4.0.0-20231019083312-e415fefc417c h1:hk9NK+JD4WMOCImQmUnwK8PoHsdQwaaZyYcEmkRulNc=
github.com/iotaledger/iota.go/v4 v4.0.0-20231019083312-e415fefc417c/go.mod h1:XmgOVYZ7805zVEYPwhvqBDVa7XieXRgPrCEGZW35W8k=
github.com/iotaledger/iota.go/v4 v4.0.0-20231019112751-e9872df31648 h1:Lhk/aEyFwDflE03kdI6Xeap/awDJbxVsBzKh08U9hTY=
github.com/iotaledger/iota.go/v4 v4.0.0-20231019112751-e9872df31648/go.mod h1:XFwcDfAF0hv6wB/trCsyDmQyPLjEZ60yTrllJ2bprN8=
github.com/ipfs/boxo v0.10.0 h1:tdDAxq8jrsbRkYoF+5Rcqyeb91hgWe2hp7iLu7ORZLY=
github.com/ipfs/boxo v0.10.0/go.mod h1:Fg+BnfxZ0RPzR0nOodzdIq3A7KgoWAOWsEIImrIQdBM=
github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s=
Expand Down
4 changes: 4 additions & 0 deletions pkg/model/commitment.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,10 @@ func (c *Commitment) CumulativeWeight() uint64 {
return c.Commitment().CumulativeWeight
}

func (c *Commitment) ReferenceManaCost() iotago.Mana {
return c.Commitment().ReferenceManaCost
}

func (c *Commitment) Data() []byte {
return c.data
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package accountsfilter

import (
"github.com/iotaledger/hive.go/core/safemath"
hiveEd25519 "github.com/iotaledger/hive.go/crypto/ed25519"
"github.com/iotaledger/hive.go/ierrors"
"github.com/iotaledger/hive.go/runtime/module"
Expand All @@ -14,12 +13,6 @@ import (
iotago "github.com/iotaledger/iota.go/v4"
)

var (
ErrInvalidSignature = ierrors.New("invalid signature")
ErrNegativeBIC = ierrors.New("negative BIC")
ErrAccountExpired = ierrors.New("account expired")
)

type CommitmentFilter struct {
// Events contains the Events of the CommitmentFilter
events *commitmentfilter.Events
Expand Down Expand Up @@ -76,15 +69,15 @@ func (c *CommitmentFilter) evaluateBlock(block *blocks.Block) {
if err != nil {
c.events.BlockFiltered.Trigger(&commitmentfilter.BlockFilteredEvent{
Block: block,
Reason: ierrors.Wrapf(err, "could not retrieve account information for block issuer %s", block.ProtocolBlock().IssuerID),
Reason: ierrors.Join(iotago.ErrIssuerAccountNotFound, ierrors.Wrapf(err, "could not retrieve account information for block issuer %s", block.ProtocolBlock().IssuerID)),
})

return
}
if !exists {
c.events.BlockFiltered.Trigger(&commitmentfilter.BlockFilteredEvent{
Block: block,
Reason: ierrors.Errorf("block issuer account %s does not exist in slot commitment %s", block.ProtocolBlock().IssuerID, block.ProtocolBlock().SlotCommitmentID.Slot()),
Reason: ierrors.Join(iotago.ErrIssuerAccountNotFound, ierrors.Errorf("block issuer account %s does not exist in slot commitment %s", block.ProtocolBlock().IssuerID, block.ProtocolBlock().SlotCommitmentID.Slot())),
})

return
Expand All @@ -95,20 +88,17 @@ func (c *CommitmentFilter) evaluateBlock(block *blocks.Block) {
if err != nil {
c.events.BlockFiltered.Trigger(&commitmentfilter.BlockFilteredEvent{
Block: block,
Reason: ierrors.Wrapf(err, "could not retrieve API for block version %d", block.ProtocolBlock().BlockHeader.ProtocolVersion),
Reason: ierrors.Join(iotago.ErrBlockVersionInvalid, ierrors.Wrapf(err, "could not retrieve API for block version %d", block.ProtocolBlock().BlockHeader.ProtocolVersion)),
})
}
// check that the block burns sufficient Mana
blockSlot := blockAPI.TimeProvider().SlotFromTime(block.ProtocolBlock().IssuingTime)
rmcSlot, err := safemath.SafeSub(blockSlot, blockAPI.ProtocolParameters().MaxCommittableAge())
if err != nil {
rmcSlot = 0
}
// check that the block burns sufficient Mana, use slot index of the commitment
rmcSlot := block.ProtocolBlock().SlotCommitmentID.Slot()

rmc, err := c.rmcRetrieveFunc(rmcSlot)
if err != nil {
c.events.BlockFiltered.Trigger(&commitmentfilter.BlockFilteredEvent{
Block: block,
Reason: ierrors.Wrapf(err, "could not retrieve RMC for slot commitment %s", rmcSlot),
Reason: ierrors.Join(iotago.ErrRMCNotFound, ierrors.Wrapf(err, "could not retrieve RMC for slot commitment %s", rmcSlot)),
})

return
Expand All @@ -118,13 +108,13 @@ func (c *CommitmentFilter) evaluateBlock(block *blocks.Block) {
if err != nil {
c.events.BlockFiltered.Trigger(&commitmentfilter.BlockFilteredEvent{
Block: block,
Reason: ierrors.Wrapf(err, "could not calculate Mana cost for block"),
Reason: ierrors.Join(iotago.ErrFailedToCalculateManaCost, ierrors.Wrapf(err, "could not calculate Mana cost for block")),
})
}
if basicBlock.MaxBurnedMana < manaCost {
c.events.BlockFiltered.Trigger(&commitmentfilter.BlockFilteredEvent{
Block: block,
Reason: ierrors.Errorf("block issuer account %s burned insufficient Mana, required %d, burned %d", block.ProtocolBlock().IssuerID, manaCost, basicBlock.MaxBurnedMana),
Reason: ierrors.Join(iotago.ErrBurnedInsufficientMana, ierrors.Errorf("block issuer account %s burned insufficient Mana, required %d, burned %d", block.ProtocolBlock().IssuerID, manaCost, basicBlock.MaxBurnedMana)),
})

return
Expand All @@ -135,7 +125,7 @@ func (c *CommitmentFilter) evaluateBlock(block *blocks.Block) {
if accountData.Credits.Value < 0 {
c.events.BlockFiltered.Trigger(&commitmentfilter.BlockFilteredEvent{
Block: block,
Reason: ierrors.Wrapf(ErrNegativeBIC, "block issuer account %s is locked due to negative BIC", block.ProtocolBlock().IssuerID),
Reason: ierrors.Wrapf(iotago.ErrNegativeBIC, "block issuer account %s is locked due to negative BIC", block.ProtocolBlock().IssuerID),
})

return
Expand All @@ -145,7 +135,7 @@ func (c *CommitmentFilter) evaluateBlock(block *blocks.Block) {
if accountData.ExpirySlot < block.ProtocolBlock().SlotCommitmentID.Slot() {
c.events.BlockFiltered.Trigger(&commitmentfilter.BlockFilteredEvent{
Block: block,
Reason: ierrors.Wrapf(ErrAccountExpired, "block issuer account %s is expired, expiry slot %d in commitment %d", block.ProtocolBlock().IssuerID, accountData.ExpirySlot, block.ProtocolBlock().SlotCommitmentID.Slot()),
Reason: ierrors.Wrapf(iotago.ErrAccountExpired, "block issuer account %s is expired, expiry slot %d in commitment %d", block.ProtocolBlock().IssuerID, accountData.ExpirySlot, block.ProtocolBlock().SlotCommitmentID.Slot()),
})

return
Expand All @@ -165,7 +155,7 @@ func (c *CommitmentFilter) evaluateBlock(block *blocks.Block) {
if !isBikPubKeyHash || bikPubKeyHash.PublicKeyHash != iotago.Ed25519PublicKeyHashBlockIssuerKeyFromPublicKey(signature.PublicKey[:]).PublicKeyHash {
c.events.BlockFiltered.Trigger(&commitmentfilter.BlockFilteredEvent{
Block: block,
Reason: ierrors.Wrapf(ErrInvalidSignature, "block issuer account %s does not have block issuer key corresponding to public key %s in slot %d", block.ProtocolBlock().IssuerID, signature.PublicKey, block.ProtocolBlock().SlotCommitmentID.Index()),
Reason: ierrors.Wrapf(iotago.ErrInvalidSignature, "block issuer account %s does not have block issuer key corresponding to public key %s in slot %d", block.ProtocolBlock().IssuerID, signature.PublicKey, block.ProtocolBlock().SlotCommitmentID.Index()),
})

return
Expand All @@ -175,23 +165,23 @@ func (c *CommitmentFilter) evaluateBlock(block *blocks.Block) {
if err != nil {
c.events.BlockFiltered.Trigger(&commitmentfilter.BlockFilteredEvent{
Block: block,
Reason: ierrors.Wrapf(ErrInvalidSignature, "error: %s", err.Error()),
Reason: ierrors.Wrapf(iotago.ErrInvalidSignature, "error: %s", err.Error()),
})

return
}
if !hiveEd25519.Verify(signature.PublicKey[:], signingMessage, signature.Signature[:]) {
c.events.BlockFiltered.Trigger(&commitmentfilter.BlockFilteredEvent{
Block: block,
Reason: ErrInvalidSignature,
Reason: iotago.ErrInvalidSignature,
})

return
}
default:
c.events.BlockFiltered.Trigger(&commitmentfilter.BlockFilteredEvent{
Block: block,
Reason: ierrors.Wrapf(ErrInvalidSignature, "only ed25519 signatures supported, got %s", block.ProtocolBlock().Signature.Type()),
Reason: ierrors.Wrapf(iotago.ErrInvalidSignature, "only ed25519 signatures supported, got %s", block.ProtocolBlock().Signature.Type()),
})

return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ func TestCommitmentFilter_NoAccount(t *testing.T) {
require.NotEqual(t, "withImplicitAccount", event.Block.ID().Alias())
})

keyPair := ed25519.GenerateKeyPair()
keyPairAccount := ed25519.GenerateKeyPair()
currentSlot := iotago.SlotIndex(100)
currentAPI := tf.apiProvider.CommittedAPI()

Expand All @@ -151,7 +151,7 @@ func TestCommitmentFilter_NoAccount(t *testing.T) {
require.NoError(t, err)
tf.AddCommitment(commitment.Slot, modelCommitment)

addr := iotago.Ed25519AddressFromPubKey(keyPair.PublicKey[:])
addr := iotago.Ed25519AddressFromPubKey(keyPairAccount.PublicKey[:])
accountID := iotago.AccountID(addr[:])

// register the accounts in the proxy account manager
Expand All @@ -160,7 +160,7 @@ func TestCommitmentFilter_NoAccount(t *testing.T) {
accounts.NewAccountData(
accountID,
accounts.WithExpirySlot(iotago.MaxSlotIndex),
accounts.WithBlockIssuerKeys(iotago.Ed25519PublicKeyBlockIssuerKeyFromPublicKey(keyPair.PublicKey)),
accounts.WithBlockIssuerKeys(iotago.Ed25519PublicKeyBlockIssuerKeyFromPublicKey(keyPairAccount.PublicKey)),
),
)
keyPairImplicitAccount := ed25519.GenerateKeyPair()
Expand All @@ -175,9 +175,10 @@ func TestCommitmentFilter_NoAccount(t *testing.T) {
),
)

tf.AddRMCData(currentSlot-currentAPI.ProtocolParameters().MaxCommittableAge(), iotago.Mana(0))
// RMC needs to be from tha same slot as commitment index
tf.AddRMCData(currentSlot-currentAPI.ProtocolParameters().MinCommittableAge(), iotago.Mana(0))

tf.IssueSignedBlockAtSlot("withAccount", currentSlot, commitmentID, keyPair)
tf.IssueSignedBlockAtSlot("withAccount", currentSlot, commitmentID, keyPairAccount)

keyPairNoAccount := ed25519.GenerateKeyPair()
tf.IssueSignedBlockAtSlot("noAccount", currentSlot, commitmentID, keyPairNoAccount)
Expand Down Expand Up @@ -224,7 +225,8 @@ func TestCommitmentFilter_BurnedMana(t *testing.T) {
),
)

tf.AddRMCData(currentSlot-currentAPI.ProtocolParameters().MaxCommittableAge(), iotago.Mana(10))
// RMC needs to be from tha same slot as commitment index
tf.AddRMCData(currentSlot-currentAPI.ProtocolParameters().MinCommittableAge(), iotago.Mana(10))

tf.IssueSignedBlockAtSlotWithBurnedMana("sufficientBurnedMana", currentSlot, commitmentID, keyPair, iotago.Mana(10))
tf.IssueSignedBlockAtSlotWithBurnedMana("sufficientBurnedMana", currentSlot, commitmentID, keyPair, iotago.Mana(11))
Expand Down Expand Up @@ -271,7 +273,7 @@ func TestCommitmentFilter_Expiry(t *testing.T) {
require.NoError(t, err)
// add the commitment and 0 RMC to the proxy state
tf.AddCommitment(commitment.Slot, modelCommitment)
tf.AddRMCData(currentSlot-currentAPI.ProtocolParameters().MaxCommittableAge(), iotago.Mana(0))
tf.AddRMCData(commitmentSlot, iotago.Mana(0))

tf.IssueSignedBlockAtSlot("correct", currentSlot, commitmentID, keyPair)

Expand All @@ -284,7 +286,7 @@ func TestCommitmentFilter_Expiry(t *testing.T) {
require.NoError(t, err)
// add the commitment and 0 RMC to the proxy state
tf.AddCommitment(commitment.Slot, modelCommitment)
tf.AddRMCData(currentSlot-currentAPI.ProtocolParameters().MaxCommittableAge(), iotago.Mana(0))
tf.AddRMCData(commitmentSlot, iotago.Mana(0))

tf.IssueSignedBlockAtSlot("almostExpired", currentSlot, commitmentID, keyPair)

Expand All @@ -297,7 +299,7 @@ func TestCommitmentFilter_Expiry(t *testing.T) {
require.NoError(t, err)
// add the commitment and 0 RMC to the proxy state
tf.AddCommitment(commitment.Slot, modelCommitment)
tf.AddRMCData(currentSlot-currentAPI.ProtocolParameters().MaxCommittableAge(), iotago.Mana(0))
tf.AddRMCData(commitmentSlot, iotago.Mana(0))

tf.IssueSignedBlockAtSlot("expired", currentSlot, commitmentID, keyPair)
}
Loading

0 comments on commit 926bf11

Please sign in to comment.