Skip to content

Commit

Permalink
Merge branch 'develop' into feat/ec-chain-display
Browse files Browse the repository at this point in the history
  • Loading branch information
jkrvivian committed Jul 5, 2022
2 parents ecd4eb2 + abde9b0 commit 61c94c6
Show file tree
Hide file tree
Showing 34 changed files with 892 additions and 589 deletions.
2 changes: 1 addition & 1 deletion packages/epoch/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import (

var (
// GenesisTime is the time (Unix in seconds) of the genesis.
GenesisTime int64 = 1655985373
GenesisTime int64 = 1656588336
// Duration is the default epoch duration in seconds.
Duration int64 = 10
)
Expand Down
28 changes: 0 additions & 28 deletions packages/faucet/request_test.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package faucet

import (
"fmt"
"testing"
"time"

Expand All @@ -17,33 +16,6 @@ import (
"github.com/iotaledger/goshimmer/packages/tangle/payload"
)

func ExampleRequest() {
keyPair := ed25519.GenerateKeyPair()
address := devnetvm.NewED25519Address(keyPair.PublicKey)
local := identity.NewLocalIdentity(keyPair.PublicKey, keyPair.PrivateKey)
emptyID := identity.ID{}

// 1. create faucet payload
faucetRequest := NewRequest(address, emptyID, emptyID, 0)

// 2. build actual message
tx := tangle.NewMessage(map[tangle.ParentsType]tangle.MessageIDs{
tangle.StrongParentType: {
tangle.EmptyMessageID: types.Void,
},
},
time.Now(),
local.PublicKey(),
0,
faucetRequest,
0,
ed25519.EmptySignature,
0,
nil,
)
fmt.Println(tx.String())
}

func TestRequest(t *testing.T) {
keyPair := ed25519.GenerateKeyPair()
address := devnetvm.NewED25519Address(keyPair.PublicKey)
Expand Down
19 changes: 15 additions & 4 deletions packages/ledger/booker.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@ import (
"context"

"github.com/cockroachdb/errors"
"github.com/iotaledger/goshimmer/packages/ledger/vm/devnetvm"
"github.com/iotaledger/hive.go/cerrors"
"github.com/iotaledger/hive.go/generics/dataflow"
"github.com/iotaledger/hive.go/generics/lo"
"github.com/iotaledger/hive.go/generics/set"
"github.com/iotaledger/hive.go/generics/walker"
"github.com/iotaledger/hive.go/identity"

"github.com/iotaledger/goshimmer/packages/ledger/utxo"
)
Expand Down Expand Up @@ -48,19 +50,26 @@ func (b *booker) checkAlreadyBookedCommand(params *dataFlowParams, next dataflow

// bookTransactionCommand is a ChainedCommand that books a Transaction.
func (b *booker) bookTransactionCommand(params *dataFlowParams, next dataflow.Next[*dataFlowParams]) (err error) {
b.bookTransaction(params.Context, params.TransactionMetadata, params.InputsMetadata, params.Consumers, params.Outputs)

b.bookTransaction(params.Context, params.Transaction, params.TransactionMetadata, params.InputsMetadata, params.Consumers, params.Outputs)

return next(params)
}

// bookTransaction books a Transaction in the Ledger and creates its Outputs.
func (b *booker) bookTransaction(ctx context.Context, txMetadata *TransactionMetadata, inputsMetadata *OutputsMetadata, consumers []*Consumer, outputs *utxo.Outputs) {
func (b *booker) bookTransaction(ctx context.Context, tx utxo.Transaction, txMetadata *TransactionMetadata, inputsMetadata *OutputsMetadata, consumers []*Consumer, outputs *utxo.Outputs) {
branchIDs := b.inheritBranchIDs(ctx, txMetadata.ID(), inputsMetadata)

txMetadata.SetBranchIDs(branchIDs)
txMetadata.SetOutputIDs(outputs.IDs())

b.storeOutputs(outputs, branchIDs)
var consensusPledgeID, accessPledgeID identity.ID
if devnetTx, ok := tx.(*devnetvm.Transaction); ok {
consensusPledgeID = devnetTx.Essence().ConsensusPledgeID()
accessPledgeID = devnetTx.Essence().AccessPledgeID()
}

b.storeOutputs(outputs, branchIDs, consensusPledgeID, accessPledgeID)

txMetadata.SetBooked(true)

Expand Down Expand Up @@ -92,10 +101,12 @@ func (b *booker) inheritBranchIDs(ctx context.Context, txID utxo.TransactionID,
}

// storeOutputs stores the Outputs in the Ledger.
func (b *booker) storeOutputs(outputs *utxo.Outputs, branchIDs *set.AdvancedSet[utxo.TransactionID]) {
func (b *booker) storeOutputs(outputs *utxo.Outputs, branchIDs *set.AdvancedSet[utxo.TransactionID], consensusPledgeID, accessPledgeID identity.ID) {
_ = outputs.ForEach(func(output utxo.Output) (err error) {
outputMetadata := NewOutputMetadata(output.ID())
outputMetadata.SetBranchIDs(branchIDs)
outputMetadata.SetConsensusManaPledgeID(consensusPledgeID)
outputMetadata.SetConsensusManaPledgeID(accessPledgeID)
b.ledger.Storage.outputMetadataStorage.Store(outputMetadata).Release()
b.ledger.Storage.outputStorage.Store(output).Release()

Expand Down
2 changes: 1 addition & 1 deletion packages/ledger/vm/devnetvm/input.go
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ func (i Inputs) Clone() (clonedInputs Inputs) {
return
}

// String returns a human readable version of the Inputs.
// String returns a human-readable version of the Inputs.
func (i Inputs) String() string {
structBuilder := stringify.StructBuilder("Inputs")
for i, input := range i {
Expand Down
2 changes: 1 addition & 1 deletion packages/mana/base.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
// BaseMana is an interface for a collection of base mana values of a single node.
type BaseMana interface {
revoke(float64) error
pledge(*TxInfo) float64
pledge(float64)
BaseValue() float64
}

Expand Down
5 changes: 4 additions & 1 deletion packages/mana/basevector.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package mana

import (
"github.com/iotaledger/goshimmer/packages/ledger"
"time"

"github.com/iotaledger/hive.go/generics/model"
Expand All @@ -13,12 +14,14 @@ type BaseManaVector interface {
Type() Type
// Size returns the size of the base mana vector.
Size() int
// Has tells if a certain node is present in the base mana vactor.
// Has tells if a certain node is present in the base mana vector.
Has(identity.ID) bool
// InitializeWithData loads the initial mana state into the base mana vector.
InitializeWithData(map[identity.ID]float64)
// Book books mana into the base mana vector.
Book(*TxInfo)
// BookEpoch books all outputs created and spent in an epoch.
BookEpoch(created []*ledger.OutputWithMetadata, spent []*ledger.OutputWithMetadata)
// GetMana returns the mana value of a node with default weights.
GetMana(identity.ID) (float64, time.Time, error)
// GetManaMap returns the map derived from the vector.
Expand Down
6 changes: 2 additions & 4 deletions packages/mana/manabase.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,10 @@ func (m *ManaBase) revoke(amount float64) error {
return nil
}

func (m *ManaBase) pledge(tx *TxInfo) (pledged float64) {
func (m *ManaBase) pledge(pledgedAmount float64) {
m.Lock()
defer m.Unlock()
pledged = tx.sumInputs()
m.M.Value += pledged
return pledged
m.M.Value += pledgedAmount
}

// BaseValue returns the base mana value (BM1).
Expand Down
4 changes: 2 additions & 2 deletions packages/mana/manabase_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ func TestPledgeAndUpdateRegularOldFunds_Consensus(t *testing.T) {
},
}

pledged := bm.pledge(_txInfo)
bm.pledge(_txInfo.sumInputs())

assert.Equal(t, 10.0, pledged)
assert.Equal(t, 10.0, _txInfo.sumInputs())
assert.Equal(t, 11.0, bm.BaseValue())
}
155 changes: 128 additions & 27 deletions packages/mana/manabasevector.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ import (
"sort"
"time"

"github.com/iotaledger/goshimmer/packages/ledger"
"github.com/iotaledger/goshimmer/packages/ledger/vm/devnetvm"

"github.com/cockroachdb/errors"
"github.com/iotaledger/hive.go/generics/model"
"github.com/iotaledger/hive.go/identity"
Expand Down Expand Up @@ -122,35 +125,30 @@ func (m *ManaBaseVector) Book(txInfo *TxInfo) {
for _, inputInfo := range txInfo.InputInfos {
// which node did the input pledge mana to?
oldPledgeNodeID := inputInfo.PledgeID[m.Type()]
if _, exist := m.M.Vector[oldPledgeNodeID]; !exist {
// first time we see this node
m.M.Vector[oldPledgeNodeID] = &ManaBase{}
m.M.Vector[oldPledgeNodeID].Init()
}
// save old mana
oldMana := *m.M.Vector[oldPledgeNodeID]
// revoke BM1
err := m.M.Vector[oldPledgeNodeID].revoke(inputInfo.Amount)
if errors.Is(err, ErrBaseManaNegative) {
panic(fmt.Sprintf("Revoking %f base mana 1 from node %s results in negative balance", inputInfo.Amount, oldPledgeNodeID.String()))
}
oldMana := m.getOldManaAndRevoke(oldPledgeNodeID, inputInfo.Amount)
// save events for later triggering
revokeEvents = append(revokeEvents, &RevokedEvent{oldPledgeNodeID, inputInfo.Amount, txInfo.TimeStamp, m.Type(), txInfo.TransactionID, inputInfo.InputID})
updateEvents = append(updateEvents, &UpdatedEvent{oldPledgeNodeID, &oldMana, m.M.Vector[oldPledgeNodeID], m.Type()})
revokeEvents = append(revokeEvents, &RevokedEvent{
NodeID: oldPledgeNodeID,
Amount: inputInfo.Amount,
Time: txInfo.TimeStamp,
ManaType: m.Type(),
TransactionID: txInfo.TransactionID,
InputID: inputInfo.InputID,
})
updateEvents = append(updateEvents, &UpdatedEvent{
NodeID: oldPledgeNodeID,
OldMana: &oldMana,
NewMana: m.M.Vector[oldPledgeNodeID],
ManaType: m.Type(),
})
}
// second, pledge mana to new nodes
newPledgeNodeID := txInfo.PledgeID[m.Type()]
if _, exist := m.M.Vector[newPledgeNodeID]; !exist {
// first time we see this node
m.M.Vector[newPledgeNodeID] = NewManaBase(0)
}
// save it for proper event trigger
oldMana := *m.M.Vector[newPledgeNodeID]
// actually pledge and update
pledged := m.M.Vector[newPledgeNodeID].pledge(txInfo)
oldMana := m.getOldManaAndPledge(newPledgeNodeID, txInfo.TotalBalance)

pledgeEvents = append(pledgeEvents, &PledgedEvent{
NodeID: newPledgeNodeID,
Amount: pledged,
Amount: txInfo.sumInputs(),
Time: txInfo.TimeStamp,
ManaType: m.Type(),
TransactionID: txInfo.TransactionID,
Expand All @@ -163,6 +161,10 @@ func (m *ManaBaseVector) Book(txInfo *TxInfo) {
})
}()

m.triggerManaEvents(revokeEvents, pledgeEvents, updateEvents)
}

func (m *ManaBaseVector) triggerManaEvents(revokeEvents []*RevokedEvent, pledgeEvents []*PledgedEvent, updateEvents []*UpdatedEvent) {
// trigger the events once we released the lock on the mana vector
for _, ev := range revokeEvents {
Events.Revoked.Trigger(ev)
Expand All @@ -175,12 +177,111 @@ func (m *ManaBaseVector) Book(txInfo *TxInfo) {
}
}

func (m *ManaBaseVector) BookEpoch(created []*ledger.OutputWithMetadata, spent []*ledger.OutputWithMetadata) {
var revokeEvents []*RevokedEvent
var pledgeEvents []*PledgedEvent
var updateEvents []*UpdatedEvent
// only lock mana vector while we are working with it
func() {
m.Lock()
defer m.Unlock()

// first, revoke mana from previous owners
for _, output := range spent {
idToRevoke := m.getIDBasedOnManaType(output)
outputIOTAs, exists := output.Output().(devnetvm.Output).Balances().Get(devnetvm.ColorIOTA)
if !exists {
continue
}
oldMana := m.getOldManaAndRevoke(idToRevoke, float64(outputIOTAs))

// save events for later triggering
revokeEvents = append(revokeEvents, &RevokedEvent{
NodeID: idToRevoke,
Amount: float64(outputIOTAs),
Time: output.OutputMetadata().CreationTime(),
ManaType: m.Type(),
TransactionID: output.ID().TransactionID,
InputID: output.ID(),
})
updateEvents = append(updateEvents, &UpdatedEvent{
NodeID: idToRevoke,
OldMana: &oldMana,
NewMana: m.M.Vector[idToRevoke],
ManaType: m.Type(),
})
}
// second, pledge mana to new nodes
for _, output := range created {
idToPledge := m.getIDBasedOnManaType(output)

outputIOTAs, exists := output.Output().(devnetvm.Output).Balances().Get(devnetvm.ColorIOTA)
if !exists {
continue
}
oldMana := m.getOldManaAndPledge(idToPledge, float64(outputIOTAs))
pledgeEvents = append(pledgeEvents, &PledgedEvent{
NodeID: idToPledge,
Amount: float64(outputIOTAs),
Time: output.OutputMetadata().CreationTime(),
ManaType: m.Type(),
TransactionID: output.Output().ID().TransactionID,
})

updateEvents = append(updateEvents, &UpdatedEvent{
NodeID: idToPledge,
OldMana: &oldMana,
NewMana: m.M.Vector[idToPledge],
ManaType: m.Type(),
})
}
}()
m.triggerManaEvents(revokeEvents, pledgeEvents, updateEvents)
}

func (m *ManaBaseVector) getIDBasedOnManaType(output *ledger.OutputWithMetadata) (pledgeID identity.ID) {
if m.Type() == ConsensusMana {
pledgeID = output.OutputMetadata().ConsensusManaPledgeID()
} else {
pledgeID = output.OutputMetadata().AccessManaPledgeID()
}
return
}

func (m *ManaBaseVector) getOldManaAndRevoke(oldPledgeNodeID identity.ID, amount float64) (oldMana ManaBase) {
if _, exist := m.M.Vector[oldPledgeNodeID]; !exist {
// first time we see this node
m.M.Vector[oldPledgeNodeID] = NewManaBase(0)
}
// save old mana
oldMana = *m.M.Vector[oldPledgeNodeID]
// revoke BM1
err := m.M.Vector[oldPledgeNodeID].revoke(amount)
if errors.Is(err, ErrBaseManaNegative) {
panic(fmt.Sprintf("Revoking %f base mana 1 from node %s results in negative balance", amount, oldPledgeNodeID.String()))
}
return
}

func (m *ManaBaseVector) getOldManaAndPledge(newPledgeNodeID identity.ID, totalBalance float64) (oldMana ManaBase) {
if _, exist := m.M.Vector[newPledgeNodeID]; !exist {
// first time we see this node
m.M.Vector[newPledgeNodeID] = NewManaBase(0)
}
// save it for proper event trigger
oldMana = *m.M.Vector[newPledgeNodeID]
// actually pledge and update
m.M.Vector[newPledgeNodeID].pledge(totalBalance)
return
}

// GetMana returns the Effective Base Mana.
func (m *ManaBaseVector) GetMana(nodeID identity.ID) (float64, time.Time, error) {
func (m *ManaBaseVector) GetMana(nodeID identity.ID) (manaAmount float64, t time.Time, err error) {
m.Lock()
defer m.Unlock()
mana, err := m.getMana(nodeID)
return mana, time.Now(), err
manaAmount, err = m.getMana(nodeID)
t = time.Now()
return manaAmount, t, err
}

// GetManaMap returns mana perception of the node.
Expand All @@ -195,7 +296,7 @@ func (m *ManaBaseVector) GetManaMap() (res NodeMap, t time.Time, err error) {
return
}

// GetHighestManaNodes return the n highest mana nodes in descending order.
// GetHighestManaNodes return the n-highest mana nodes in descending order.
// It also updates the mana values for each node.
// If n is zero, it returns all nodes.
func (m *ManaBaseVector) GetHighestManaNodes(n uint) (res []Node, t time.Time, err error) {
Expand Down
Loading

0 comments on commit 61c94c6

Please sign in to comment.