diff --git a/packages/binary/serialize/serialized_object.go b/packages/binary/serialize/serialized_object.go new file mode 100644 index 0000000000000000000000000000000000000000..f3ecab10fa541a24f290b761c44b8db8bb3123bc --- /dev/null +++ b/packages/binary/serialize/serialized_object.go @@ -0,0 +1,15 @@ +package serialize + +import ( + "reflect" + "unsafe" +) + +type SerializedObject struct { + readOffset int +} + +func (so *SerializedObject) SerializeInt(int int) []byte { + hdr := reflect.SliceHeader{Data: uintptr(unsafe.Pointer(&int)), Len: 8, Cap: 8} + return *(*[]byte)(unsafe.Pointer(&hdr)) +} diff --git a/packages/binary/spammer/spammer.go b/packages/binary/spammer/spammer.go index 95b4bd5aa243211cab416c144f68574b983f10cf..7f163170dfb8337c1becd4f9046b7868d94c7f8c 100644 --- a/packages/binary/spammer/spammer.go +++ b/packages/binary/spammer/spammer.go @@ -24,8 +24,9 @@ type Spammer struct { func New(tangle *tangle.Tangle, tipSelector *tipselector.TipSelector) *Spammer { return &Spammer{ - tangle: tangle, - tipSelector: tipSelector, + shutdownSignal: make(chan types.Empty), + tangle: tangle, + tipSelector: tipSelector, } } @@ -44,7 +45,7 @@ func (spammer *Spammer) Shutdown() { spammer.startStopMutex.Lock() defer spammer.startStopMutex.Unlock() - if !spammer.running { + if spammer.running { spammer.running = false spammer.shutdownSignal <- types.Void diff --git a/packages/binary/storageprefix/storageprefix.go b/packages/binary/storageprefix/storageprefix.go index 6493adf68473e6cdd98ecd4befaa510967437220..ff38affd4d7653e15347572f3cce8cb1c9cd56d7 100644 --- a/packages/binary/storageprefix/storageprefix.go +++ b/packages/binary/storageprefix/storageprefix.go @@ -1,7 +1,7 @@ package storageprefix var ( - Mainnet = []byte{0} + Mainnet = []byte{88} TangleTransaction = []byte{1} TangleTransactionMetadata = []byte{2} diff --git a/packages/binary/tangle/events.go b/packages/binary/tangle/events.go index d2bf35523764694fd393df88ff9936244ddd5b54..5fe03f48e19c5ff19a5936a8b16486d51a40a597 100644 --- a/packages/binary/tangle/events.go +++ b/packages/binary/tangle/events.go @@ -34,6 +34,6 @@ func transactionIdEvent(handler interface{}, params ...interface{}) { func cachedTransactionEvent(handler interface{}, params ...interface{}) { handler.(func(*transaction.CachedTransaction, *transactionmetadata.CachedTransactionMetadata))( params[0].(*transaction.CachedTransaction).Retain(), - params[1].(*transactionmetadata.CachedTransactionMetadata).Retain().(*transactionmetadata.CachedTransactionMetadata), + params[1].(*transactionmetadata.CachedTransactionMetadata).Retain(), ) } diff --git a/packages/binary/tangle/model/transactionmetadata/cached_transactionmetadata.go b/packages/binary/tangle/model/transactionmetadata/cached_transactionmetadata.go index 8b327806525d359f39dcbf0dd54e699cdc195f61..c8db28e1b0f455adb506ff40b5996fbab8801bcb 100644 --- a/packages/binary/tangle/model/transactionmetadata/cached_transactionmetadata.go +++ b/packages/binary/tangle/model/transactionmetadata/cached_transactionmetadata.go @@ -8,8 +8,8 @@ type CachedTransactionMetadata struct { objectstorage.CachedObject } -func (cachedObject *CachedTransactionMetadata) Retain() objectstorage.CachedObject { - return &CachedTransactionMetadata{cachedObject} +func (cachedObject *CachedTransactionMetadata) Retain() *CachedTransactionMetadata { + return &CachedTransactionMetadata{cachedObject.CachedObject.Retain()} } func (cachedObject *CachedTransactionMetadata) Unwrap() *TransactionMetadata { diff --git a/packages/binary/tangle/model/transactionmetadata/proto.go b/packages/binary/tangle/model/transactionmetadata/proto.go new file mode 100644 index 0000000000000000000000000000000000000000..652cb7d48f6a027ca9104ade946c2483f7626510 --- /dev/null +++ b/packages/binary/tangle/model/transactionmetadata/proto.go @@ -0,0 +1,51 @@ +package transactionmetadata + +import ( + "fmt" + "reflect" + "runtime" + "time" + "unsafe" +) + +type Proto struct { + receivedTime time.Time + solidificationTime time.Time + solid bool +} + +// region GENERIC SERIALIZATION CODE /////////////////////////////////////////////////////////////////////////////////// + +var sizeOfProto = int(unsafe.Sizeof(Proto{})) + +func ProtoFromBytes(bytes []byte) (result *Proto, err error) { + if bytesLength := len(bytes); bytesLength != sizeOfProto { + return nil, fmt.Errorf("bytes are not long enough (%d instead of %d)", bytesLength, sizeOfProto) + } + + copiedBytes := make([]byte, sizeOfProto) + copy(copiedBytes, bytes) + + result = (*Proto)(unsafe.Pointer( + (*reflect.SliceHeader)(unsafe.Pointer(&copiedBytes)).Data, + )) + + runtime.KeepAlive(copiedBytes) + + return +} + +func (proto *Proto) ToBytes() (result []byte) { + result = make([]byte, sizeOfProto) + copy(result, *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{ + Data: uintptr(unsafe.Pointer(proto)), + Len: sizeOfProto, + Cap: sizeOfProto, + }))) + + runtime.KeepAlive(proto) + + return +} + +// endregion /////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/packages/binary/tangle/model/transactionmetadata/transactionmetadata.go b/packages/binary/tangle/model/transactionmetadata/transactionmetadata.go index f29a6e3425262f50a312892714e3ca32020eb3cb..a7730e6224e9a4923b2bb0a2c3494aaca7c7300a 100644 --- a/packages/binary/tangle/model/transactionmetadata/transactionmetadata.go +++ b/packages/binary/tangle/model/transactionmetadata/transactionmetadata.go @@ -86,9 +86,22 @@ func (transactionMetadata *TransactionMetadata) Update(other objectstorage.Stora } func (transactionMetadata *TransactionMetadata) MarshalBinary() ([]byte, error) { - return nil, nil + return (&Proto{ + receivedTime: transactionMetadata.receivedTime, + solidificationTime: transactionMetadata.solidificationTime, + solid: transactionMetadata.solid, + }).ToBytes(), nil } -func (transactionMetadata *TransactionMetadata) UnmarshalBinary([]byte) error { - return nil +func (transactionMetadata *TransactionMetadata) UnmarshalBinary(data []byte) (err error) { + proto, err := ProtoFromBytes(data) + if err != nil { + return + } + + transactionMetadata.receivedTime = proto.receivedTime + transactionMetadata.solidificationTime = proto.solidificationTime + transactionMetadata.solid = proto.solid + + return } diff --git a/packages/binary/tangle/tangle_test.go b/packages/binary/tangle/tangle_test.go index f40da0a91d6bd1e15df1ac5e78ea2ad6eeca6bf3..c8ff887c1f0659f340749dd564f3d7f001811be2 100644 --- a/packages/binary/tangle/tangle_test.go +++ b/packages/binary/tangle/tangle_test.go @@ -8,15 +8,19 @@ import ( "github.com/dgraph-io/badger/v2" "github.com/iotaledger/hive.go/events" + "github.com/iotaledger/hive.go/database" + "github.com/iotaledger/goshimmer/packages/binary/identity" "github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction" "github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/data" "github.com/iotaledger/goshimmer/packages/binary/tangle/model/transactionmetadata" - "github.com/iotaledger/goshimmer/packages/database" + "github.com/iotaledger/goshimmer/plugins/config" ) var testDatabase *badger.DB +var _ = config.PLUGIN + func init() { testDatabase = database.GetBadgerInstance() } diff --git a/plugins/autopeering/autopeering.go b/plugins/autopeering/autopeering.go index c02b8bf87d18bd47a48d0555e073a99b0b340eed..436198b3bc22a9cbabe4c4c3d67c76915c8e978f 100644 --- a/plugins/autopeering/autopeering.go +++ b/plugins/autopeering/autopeering.go @@ -16,9 +16,7 @@ import ( "github.com/iotaledger/hive.go/logger" "github.com/iotaledger/hive.go/node" - "github.com/iotaledger/goshimmer/packages/netutil" "github.com/iotaledger/goshimmer/plugins/autopeering/local" - "github.com/iotaledger/goshimmer/plugins/cli" "github.com/iotaledger/goshimmer/plugins/config" "github.com/iotaledger/goshimmer/plugins/gossip" ) @@ -161,17 +159,19 @@ func parseEntryNodes() (result []*peer.Peer, err error) { } func checkConnection(localAddr *net.UDPAddr, self *peer.Peer) { - peering := self.Services().Get(service.PeeringKey) - remoteAddr, err := net.ResolveUDPAddr(peering.Network(), peering.String()) - if err != nil { - panic(err) - } + /* + peering := self.Services().Get(service.PeeringKey) + remoteAddr, err := net.ResolveUDPAddr(peering.Network(), peering.String()) + if err != nil { + panic(err) + } - // do not check the address as a NAT may change them for local connections - err = netutil.CheckUDP(localAddr, remoteAddr, false, true) - if err != nil { - log.Errorf("Error testing service: %s", err) - log.Panicf("Please check that %s is publicly reachable at %s/%s", - cli.AppName, peering.String(), peering.Network()) - } + // do not check the address as a NAT may change them for local connections + err = netutil.CheckUDP(localAddr, remoteAddr, false, true) + if err != nil { + log.Errorf("Error testing service: %s", err) + log.Panicf("Please check that %s is publicly reachable at %s/%s", + cli.AppName, peering.String(), peering.Network()) + } + */ } diff --git a/plugins/config/config.go b/plugins/config/config.go index 5f507429000463fed592df15ceed04a858fc9866..70513880fa272a3878d840c6cb7211fa26eb8df6 100644 --- a/plugins/config/config.go +++ b/plugins/config/config.go @@ -52,7 +52,7 @@ func parseParameters() { // It automatically reads in a single config file starting with "config" (can be changed via the --config CLI flag) // and ending with: .json, .toml, .yaml or .yml (in this sequence). func Fetch(printConfig bool, ignoreSettingsAtPrint ...[]string) error { - err := parameter.LoadConfigFile(NodeConfig, *configDirPath, *configName, true, false) + err := parameter.LoadConfigFile(NodeConfig, *configDirPath, *configName, true, true) if err != nil { return err } diff --git a/plugins/gossip/gossip.go b/plugins/gossip/gossip.go index 3697608d0a732f7cd097834c08879ed9423a10e0..8c071f8c5414101e927aceb1817c9284efc2eda2 100644 --- a/plugins/gossip/gossip.go +++ b/plugins/gossip/gossip.go @@ -4,7 +4,6 @@ import ( "fmt" "net" "strconv" - "sync" "github.com/iotaledger/hive.go/autopeering/peer" "github.com/iotaledger/hive.go/autopeering/peer/service" @@ -14,7 +13,6 @@ import ( gp "github.com/iotaledger/goshimmer/packages/gossip" "github.com/iotaledger/goshimmer/packages/gossip/server" "github.com/iotaledger/goshimmer/plugins/autopeering/local" - "github.com/iotaledger/goshimmer/plugins/cli" "github.com/iotaledger/goshimmer/plugins/config" "github.com/iotaledger/goshimmer/plugins/tangle" ) @@ -84,25 +82,27 @@ func start(shutdownSignal <-chan struct{}) { } func checkConnection(srv *server.TCP, self *peer.Peer) { - var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() - conn, err := srv.AcceptPeer(self) + /* + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + conn, err := srv.AcceptPeer(self) + if err != nil { + return + } + _ = conn.Close() + }() + conn, err := srv.DialPeer(self) if err != nil { - return + log.Errorf("Error testing: %s", err) + addr := self.Services().Get(service.GossipKey) + log.Panicf("Please check that %s is publicly reachable at %s/%s", + cli.AppName, addr.String(), addr.Network()) } _ = conn.Close() - }() - conn, err := srv.DialPeer(self) - if err != nil { - log.Errorf("Error testing: %s", err) - addr := self.Services().Get(service.GossipKey) - log.Panicf("Please check that %s is publicly reachable at %s/%s", - cli.AppName, addr.String(), addr.Network()) - } - _ = conn.Close() - wg.Wait() + wg.Wait() + */ } func getTransaction(transactionId transaction.Id) (bytes []byte, err error) { diff --git a/plugins/tangle/plugin.go b/plugins/tangle/plugin.go index 533d644f3c2e52ad49b8f2c361a8f5ca6866f401..8edf6459f4cdd8206732e2e1487914a16698d860 100644 --- a/plugins/tangle/plugin.go +++ b/plugins/tangle/plugin.go @@ -1,7 +1,10 @@ package tangle import ( + "fmt" + "github.com/iotaledger/goshimmer/packages/binary/storageprefix" + "github.com/iotaledger/goshimmer/packages/binary/tangle" "github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction" "github.com/iotaledger/goshimmer/packages/binary/tangle/model/transactionmetadata" "github.com/iotaledger/goshimmer/packages/binary/tangle/tipselector" @@ -9,11 +12,9 @@ import ( "github.com/iotaledger/goshimmer/packages/binary/tangle/transactionrequester" "github.com/iotaledger/goshimmer/packages/database" "github.com/iotaledger/goshimmer/packages/shutdown" + "github.com/iotaledger/hive.go/daemon" "github.com/iotaledger/hive.go/events" - - "github.com/iotaledger/goshimmer/packages/binary/tangle" - "github.com/iotaledger/hive.go/logger" "github.com/iotaledger/hive.go/node" ) @@ -56,6 +57,8 @@ func configure(*node.Plugin) { // setup TipSelector Instance.Events.TransactionSolid.Attach(events.NewClosure(func(cachedTransaction *transaction.CachedTransaction, cachedTransactionMetadata *transactionmetadata.CachedTransactionMetadata) { + fmt.Println(cachedTransaction.Unwrap()) + cachedTransactionMetadata.Release() cachedTransaction.Consume(TipSelector.AddTip) diff --git a/plugins/webapi/spammer/plugin.go b/plugins/webapi/spammer/plugin.go index a5d9345bdfa5f8bffcddb1c501c6dc12ae9fc19d..7bd38432c88dda4a3a9730202a6987f5c1675663 100644 --- a/plugins/webapi/spammer/plugin.go +++ b/plugins/webapi/spammer/plugin.go @@ -10,7 +10,7 @@ import ( var transactionSpammer *spammer.Spammer -var PLUGIN = node.NewPlugin("Spammer", node.Disabled, configure) +var PLUGIN = node.NewPlugin("Spammer", node.Enabled, configure) func configure(plugin *node.Plugin) { transactionSpammer = spammer.New(tangle.Instance, tangle.TipSelector)