Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 8 additions & 0 deletions db/item/db/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,14 @@ const (
TopicMemoRoomPost = "memo_room_post"
TopicMemoSeenPost = "memo_seen_post"

TopicMemoAddrLinkRequest = "memo_addr_link_request"
TopicMemoAddrLinkRequested = "memo_addr_link_requested"
TopicMemoLinkAccept = "memo_link_accept"
TopicMemoLinkAccepted = "memo_link_accepted"
TopicMemoLinkRequest = "memo_link_request"
TopicMemoLinkRevoke = "memo_link_revoke"
TopicMemoLinkRevoked = "memo_link_revoked"

TopicChainBlock = "chain_block"
TopicChainBlockHeight = "chain_block_height"
TopicChainHeightBlock = "chain_height_block"
Expand Down
77 changes: 77 additions & 0 deletions db/item/memo/addr_link_request.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package memo

import (
"context"
"fmt"
"github.com/jchavannes/jgo/jutil"
"github.com/memocash/index/db/client"
"github.com/memocash/index/db/item/db"
"github.com/memocash/index/ref/bitcoin/memo"
"github.com/memocash/index/ref/config"
"time"
)

type AddrLinkRequest struct {
Addr [25]byte
Seen time.Time
TxHash [32]byte
}

func (r *AddrLinkRequest) GetTopic() string {
return db.TopicMemoAddrLinkRequest
}

func (r *AddrLinkRequest) GetShardSource() uint {
return client.GenShardSource(r.Addr[:])
}

func (r *AddrLinkRequest) GetUid() []byte {
return jutil.CombineBytes(
r.Addr[:],
jutil.GetTimeByteNanoBig(r.Seen),
jutil.ByteReverse(r.TxHash[:]),
)
}

func (r *AddrLinkRequest) SetUid(uid []byte) {
if len(uid) != memo.AddressLength+memo.Int8Size+memo.TxHashLength {
return
}
copy(r.Addr[:], uid[:25])
r.Seen = jutil.GetByteTimeNanoBig(uid[25:33])
copy(r.TxHash[:], jutil.ByteReverse(uid[33:65]))
}

func (r *AddrLinkRequest) Serialize() []byte {
return nil
}

func (r *AddrLinkRequest) Deserialize([]byte) {}

func GetAddrLinkRequests(ctx context.Context, addrs [][25]byte) ([]*AddrLinkRequest, error) {
var shardPrefixes = make(map[uint32][][]byte)
for i := range addrs {
shard := client.GenShardSource32(addrs[i][:])
shardPrefixes[shard] = append(shardPrefixes[shard], addrs[i][:])
}
shardConfigs := config.GetQueueShards()
var addrLinkRequests []*AddrLinkRequest
for shard, prefixes := range shardPrefixes {
shardConfig := config.GetShardConfig(shard, shardConfigs)
dbClient := client.NewClient(shardConfig.GetHost())
if err := dbClient.GetWOpts(client.Opts{
Topic: db.TopicMemoAddrLinkRequest,
Prefixes: prefixes,
Max: client.ExLargeLimit,
Context: ctx,
}); err != nil {
return nil, fmt.Errorf("error getting db addr memo link requests by prefix; %w", err)
}
for _, msg := range dbClient.Messages {
var addrLinkRequest = new(AddrLinkRequest)
db.Set(addrLinkRequest, msg)
addrLinkRequests = append(addrLinkRequests, addrLinkRequest)
}
}
return addrLinkRequests, nil
}
77 changes: 77 additions & 0 deletions db/item/memo/addr_link_requested.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package memo

import (
"context"
"fmt"
"github.com/jchavannes/jgo/jutil"
"github.com/memocash/index/db/client"
"github.com/memocash/index/db/item/db"
"github.com/memocash/index/ref/bitcoin/memo"
"github.com/memocash/index/ref/config"
"time"
)

type AddrLinkRequested struct {
Addr [25]byte
Seen time.Time
TxHash [32]byte
}

func (r *AddrLinkRequested) GetTopic() string {
return db.TopicMemoAddrLinkRequested
}

func (r *AddrLinkRequested) GetShardSource() uint {
return client.GenShardSource(r.Addr[:])
}

func (r *AddrLinkRequested) GetUid() []byte {
return jutil.CombineBytes(
r.Addr[:],
jutil.GetTimeByteNanoBig(r.Seen),
jutil.ByteReverse(r.TxHash[:]),
)
}

func (r *AddrLinkRequested) SetUid(uid []byte) {
if len(uid) != memo.AddressLength+memo.Int8Size+memo.TxHashLength {
return
}
copy(r.Addr[:], uid[:25])
r.Seen = jutil.GetByteTimeNanoBig(uid[25:33])
copy(r.TxHash[:], jutil.ByteReverse(uid[33:65]))
}

func (r *AddrLinkRequested) Serialize() []byte {
return nil
}

func (r *AddrLinkRequested) Deserialize([]byte) {}

func GetAddrLinkRequesteds(ctx context.Context, addrs [][25]byte) ([]*AddrLinkRequested, error) {
var shardPrefixes = make(map[uint32][][]byte)
for i := range addrs {
shard := client.GenShardSource32(addrs[i][:])
shardPrefixes[shard] = append(shardPrefixes[shard], addrs[i][:])
}
shardConfigs := config.GetQueueShards()
var addrLinkRequesteds []*AddrLinkRequested
for shard, prefixes := range shardPrefixes {
shardConfig := config.GetShardConfig(shard, shardConfigs)
dbClient := client.NewClient(shardConfig.GetHost())
if err := dbClient.GetWOpts(client.Opts{
Topic: db.TopicMemoAddrLinkRequested,
Prefixes: prefixes,
Max: client.ExLargeLimit,
Context: ctx,
}); err != nil {
return nil, fmt.Errorf("error getting db addr memo link requesteds by prefix; %w", err)
}
for _, msg := range dbClient.Messages {
var addrLinkRequested = new(AddrLinkRequested)
db.Set(addrLinkRequested, msg)
addrLinkRequesteds = append(addrLinkRequesteds, addrLinkRequested)
}
}
return addrLinkRequesteds, nil
}
51 changes: 51 additions & 0 deletions db/item/memo/link_accept.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package memo

import (
"github.com/jchavannes/jgo/jutil"
"github.com/memocash/index/db/client"
"github.com/memocash/index/db/item/db"
"github.com/memocash/index/ref/bitcoin/memo"
)

type LinkAccept struct {
TxHash [32]byte
Addr [25]byte
RequestTxHash [32]byte
Message string
}

func (r *LinkAccept) GetTopic() string {
return db.TopicMemoLinkAccept
}

func (r *LinkAccept) GetShardSource() uint {
return client.GenShardSource(r.TxHash[:])
}

func (r *LinkAccept) GetUid() []byte {
return jutil.ByteReverse(r.TxHash[:])
}

func (r *LinkAccept) SetUid(uid []byte) {
if len(uid) != memo.TxHashLength {
panic("invalid uid size for link accept")
}
copy(r.TxHash[:], jutil.ByteReverse(uid))
}

func (r *LinkAccept) Serialize() []byte {
return jutil.CombineBytes(
r.Addr[:],
jutil.ByteReverse(r.RequestTxHash[:]),
[]byte(r.Message),
)
}

func (r *LinkAccept) Deserialize(data []byte) {
if len(data) < memo.AddressLength+memo.TxHashLength {
panic("invalid data size for link accept")
}
copy(r.Addr[:], data[:25])
copy(r.RequestTxHash[:], jutil.ByteReverse(data[25:57]))
r.Message = string(data[57:])
}
43 changes: 43 additions & 0 deletions db/item/memo/link_accepted.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package memo

import (
"github.com/jchavannes/jgo/jutil"
"github.com/memocash/index/db/client"
"github.com/memocash/index/db/item/db"
"github.com/memocash/index/ref/bitcoin/memo"
)

type LinkAccepted struct {
RequestTxHash [32]byte
TxHash [32]byte
}

func (r *LinkAccepted) GetTopic() string {
return db.TopicMemoLinkAccepted
}

func (r *LinkAccepted) GetShardSource() uint {
return client.GenShardSource(r.RequestTxHash[:])
}

func (r *LinkAccepted) GetUid() []byte {
return jutil.ByteReverse(r.RequestTxHash[:])
}

func (r *LinkAccepted) SetUid(uid []byte) {
if len(uid) != memo.TxHashLength {
panic("invalid uid size for link accepted")
}
copy(r.RequestTxHash[:], jutil.ByteReverse(uid))
}

func (r *LinkAccepted) Serialize() []byte {
return jutil.ByteReverse(r.TxHash[:])
}

func (r *LinkAccepted) Deserialize(data []byte) {
if len(data) != memo.TxHashLength {
panic("invalid data size for link accepted")
}
copy(r.TxHash[:], jutil.ByteReverse(data))
}
80 changes: 80 additions & 0 deletions db/item/memo/link_request.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package memo

import (
"context"
"fmt"
"github.com/jchavannes/jgo/jutil"
"github.com/memocash/index/db/client"
"github.com/memocash/index/db/item/db"
"github.com/memocash/index/ref/bitcoin/memo"
"github.com/memocash/index/ref/config"
)

type LinkRequest struct {
TxHash [32]byte
ChildAddr [25]byte
ParentAddr [25]byte
Message string
}

func (r *LinkRequest) GetTopic() string {
return db.TopicMemoLinkRequest
}

func (r *LinkRequest) GetShardSource() uint {
return client.GenShardSource(r.TxHash[:])
}

func (r *LinkRequest) GetUid() []byte {
return jutil.ByteReverse(r.TxHash[:])
}

func (r *LinkRequest) SetUid(uid []byte) {
if len(uid) != memo.TxHashLength {
panic("invalid uid size for link request")
}
copy(r.TxHash[:], jutil.ByteReverse(uid))
}

func (r *LinkRequest) Serialize() []byte {
return jutil.CombineBytes(
r.ChildAddr[:],
r.ParentAddr[:],
[]byte(r.Message),
)
}

func (r *LinkRequest) Deserialize(data []byte) {
if len(data) < memo.AddressLength*2 {
panic("invalid data size for link request")
}
copy(r.ChildAddr[:], data[:25])
copy(r.ParentAddr[:], data[25:50])
r.Message = string(data[50:])
}

func GetLinkRequests(ctx context.Context, txHashes [][32]byte) ([]*LinkRequest, error) {
var shardUids = make(map[uint32][][]byte)
for i := range txHashes {
shard := db.GetShardIdFromByte32(txHashes[i][:])
shardUids[shard] = append(shardUids[shard], jutil.ByteReverse(txHashes[i][:]))
}
var linkRequests []*LinkRequest
for shard, uids := range shardUids {
shardConfig := config.GetShardConfig(shard, config.GetQueueShards())
dbClient := client.NewClient(shardConfig.GetHost())
if err := dbClient.GetWOpts(client.Opts{
Context: ctx,
Topic: db.TopicMemoLinkRequest,
Uids: uids,
}); err != nil {
return nil, fmt.Errorf("error getting client message memo link requests; %w", err)
}
for _, msg := range dbClient.Messages {
var linkRequest = new(LinkRequest)
db.Set(linkRequest, msg)
linkRequests = append(linkRequests, linkRequest)
}
}
return linkRequests, nil
}
51 changes: 51 additions & 0 deletions db/item/memo/link_revoke.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package memo

import (
"github.com/jchavannes/jgo/jutil"
"github.com/memocash/index/db/client"
"github.com/memocash/index/db/item/db"
"github.com/memocash/index/ref/bitcoin/memo"
)

type LinkRevoke struct {
TxHash [32]byte
Addr [25]byte
AcceptTxHash [32]byte
Message string
}

func (r *LinkRevoke) GetTopic() string {
return db.TopicMemoLinkRevoke
}

func (r *LinkRevoke) GetShardSource() uint {
return client.GenShardSource(r.TxHash[:])
}

func (r *LinkRevoke) GetUid() []byte {
return jutil.ByteReverse(r.TxHash[:])
}

func (r *LinkRevoke) SetUid(uid []byte) {
if len(uid) != memo.TxHashLength {
panic("invalid uid size for link revoke")
}
copy(r.TxHash[:], jutil.ByteReverse(uid))
}

func (r *LinkRevoke) Serialize() []byte {
return jutil.CombineBytes(
r.Addr[:],
jutil.ByteReverse(r.AcceptTxHash[:]),
[]byte(r.Message),
)
}

func (r *LinkRevoke) Deserialize(data []byte) {
if len(data) < memo.AddressLength+memo.TxHashLength {
panic("invalid data size for link revoke")
}
copy(r.Addr[:], data[:25])
copy(r.AcceptTxHash[:], jutil.ByteReverse(data[25:57]))
r.Message = string(data[57:])
}
Loading