Skip to content

Commit 652bbce

Browse files
committed
Merge branch 'investigate_output_cut_through'
2 parents da2ab6a + d2cdc5d commit 652bbce

File tree

7 files changed

+119
-16
lines changed

7 files changed

+119
-16
lines changed

src/common/types/utxo.go

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ type UTXO struct {
1919
BlockHeight uint32 `json:"block_height"` // not used
2020
BlockHash string `json:"block_hash"`
2121
Timestamp uint64 `json:"timestamp"` // not used
22-
Spent bool `json:"-"` // not used
22+
Spent bool `json:"spent"`
2323
}
2424

2525
// SpentUTXO
@@ -59,12 +59,28 @@ func (v *UTXO) SerialiseData() ([]byte, error) {
5959
common.ErrorLogger.Println(err)
6060
return nil, err
6161
}
62-
return buf.Bytes(), nil
62+
err = binary.Write(&buf, binary.BigEndian, v.Timestamp)
63+
if err != nil {
64+
common.ErrorLogger.Println(err)
65+
return nil, err
66+
}
67+
err = binary.Write(&buf, binary.BigEndian, v.Spent)
68+
if err != nil {
69+
common.ErrorLogger.Println(err)
70+
return nil, err
71+
}
72+
data := buf.Bytes()
73+
if len(data) != 34+8+8+1 {
74+
common.ErrorLogger.Printf("wrong data length: %d %+v", len(data), data)
75+
return nil, err
76+
}
77+
78+
return data, nil
6379
}
6480

6581
func (v *UTXO) DeSerialiseKey(key []byte) error {
6682
if len(key) != 32+32+4 {
67-
common.ErrorLogger.Printf("wrong key length: %+v", key)
83+
common.ErrorLogger.Printf("wrong key length: %d %+v", len(key), key)
6884
return errors.New("key is wrong length. should not happen")
6985
}
7086

@@ -79,12 +95,22 @@ func (v *UTXO) DeSerialiseKey(key []byte) error {
7995
}
8096

8197
func (v *UTXO) DeSerialiseData(data []byte) error {
82-
if len(data) != 34+8 {
83-
common.ErrorLogger.Printf("wrong data length: %+v", data)
98+
if len(data) != 34+8+8+1 {
99+
common.ErrorLogger.Printf("wrong data length: %d %+v", len(data), data)
84100
return errors.New("data is wrong length. should not happen")
85101
}
86102
v.ScriptPubKey = hex.EncodeToString(data[:34])
87-
err := binary.Read(bytes.NewReader(data[34:]), binary.BigEndian, &v.Value)
103+
err := binary.Read(bytes.NewReader(data[34:34+8]), binary.BigEndian, &v.Value)
104+
if err != nil {
105+
common.ErrorLogger.Println(err)
106+
return err
107+
}
108+
err = binary.Read(bytes.NewReader(data[34+8:34+8+8]), binary.BigEndian, &v.Timestamp)
109+
if err != nil {
110+
common.ErrorLogger.Println(err)
111+
return err
112+
}
113+
err = binary.Read(bytes.NewReader(data[34+8+8:]), binary.BigEndian, &v.Spent)
88114
if err != nil {
89115
common.ErrorLogger.Println(err)
90116
return err

src/core/cleanup.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,81 @@ func removeSpentUTXOsAndTweaks(utxos []types.UTXO) error {
8585
return err
8686
}
8787

88+
func markSpentUTXOsAndTweaks(utxos []types.UTXO) error {
89+
if len(utxos) == 0 {
90+
return nil
91+
}
92+
// First overwrite the spend UTXOs which now have the spent flag set
93+
err := dblevel.InsertUTXOs(utxos)
94+
if err != nil {
95+
common.ErrorLogger.Println(err)
96+
return err
97+
}
98+
99+
// Now begin process to find the tweaks that need to be deleted
100+
101+
// we only need to check for one utxo per txid, so we reduce the number of utxos -> fewer lookups in DB
102+
var cleanUTXOs []types.UTXO
103+
includedTxids := make(map[string]bool)
104+
105+
for _, utxo := range utxos {
106+
if _, exists := includedTxids[utxo.Txid]; !exists {
107+
cleanUTXOs = append(cleanUTXOs, utxo)
108+
includedTxids[utxo.Txid] = true
109+
}
110+
}
111+
112+
var tweaksToDelete []types.Tweak
113+
var tweaksToOverwrite []types.Tweak
114+
115+
for _, utxo := range cleanUTXOs {
116+
var remainingUTXOs []types.UTXO
117+
remainingUTXOs, err = dblevel.FetchByBlockHashAndTxidUTXOs(utxo.BlockHash, utxo.Txid)
118+
if err != nil && !errors.Is(err, dblevel.NoEntryErr{}) {
119+
common.ErrorLogger.Println(err)
120+
return err
121+
} else if err != nil && errors.Is(err, dblevel.NoEntryErr{}) {
122+
// if no UTXOs are left for a certain blockHash-txid combination we can remove the tweak
123+
tweaksToDelete = append(tweaksToDelete, types.Tweak{
124+
// we only need those Fields to serialise the key
125+
BlockHash: utxo.BlockHash,
126+
Txid: utxo.Txid,
127+
})
128+
continue
129+
}
130+
var newBiggest *uint64
131+
newBiggest, err = types.FindBiggestRemainingUTXO(utxo, remainingUTXOs)
132+
if err != nil {
133+
common.ErrorLogger.Println(err)
134+
return err
135+
}
136+
if newBiggest != nil {
137+
// find the biggest UTXO for the tx and overwrite if necessary
138+
tweaksToOverwrite = append(tweaksToOverwrite, types.Tweak{
139+
BlockHash: utxo.BlockHash,
140+
BlockHeight: 0,
141+
Txid: utxo.Txid,
142+
Data: [33]byte{},
143+
HighestValue: *newBiggest,
144+
})
145+
}
146+
}
147+
148+
err = dblevel.DeleteBatchTweaks(tweaksToDelete)
149+
if err != nil {
150+
common.ErrorLogger.Println(err)
151+
return err
152+
}
153+
154+
err = dblevel.OverWriteTweaks(tweaksToOverwrite)
155+
if err != nil {
156+
common.ErrorLogger.Println(err)
157+
return err
158+
}
159+
160+
return err
161+
}
162+
88163
// ReindexDustLimitsOnly this routine adds the dust limit data to tweaks after a sync
89164
func ReindexDustLimitsOnly() error {
90165
common.InfoLogger.Println("Reindexing dust limit from synced data")

src/core/extractutxos.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,12 @@ func extractSpentTaprootPubKeysFromTx(tx *types.Transaction, block *types.Block)
7171

7272
//832974
7373
spentUTXOs = append(spentUTXOs, types.UTXO{
74-
Txid: vin.Txid,
75-
Vout: vin.Vout,
76-
Value: common.ConvertFloatBTCtoSats(vin.Prevout.Value),
77-
BlockHash: blockHash,
78-
Spent: true,
74+
Txid: vin.Txid,
75+
Vout: vin.Vout,
76+
Value: common.ConvertFloatBTCtoSats(vin.Prevout.Value),
77+
ScriptPubKey: vin.Prevout.ScriptPubKey.Hex,
78+
BlockHash: blockHash,
79+
Spent: true,
7980
})
8081
default:
8182
continue

src/core/routine.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ func CheckForNewBlockRoutine() {
1313
common.InfoLogger.Println("starting check_for_new_block_routine")
1414
for true {
1515
select {
16-
case <-time.NewTicker(15 * time.Second).C:
16+
case <-time.NewTicker(3 * time.Second).C:
1717
blockHash, err := GetBestBlockHash()
1818
if err != nil {
1919
common.ErrorLogger.Println(err)
@@ -170,7 +170,8 @@ func HandleBlock(block *types.Block) error {
170170
// get spent taproot UTXOs
171171
taprootSpent := extractSpentTaprootPubKeysFromBlock(block)
172172

173-
err = removeSpentUTXOsAndTweaks(taprootSpent)
173+
//err = removeSpentUTXOsAndTweaks(taprootSpent)
174+
err = markSpentUTXOsAndTweaks(taprootSpent)
174175
if err != nil {
175176
common.ErrorLogger.Println(err)
176177
return err

src/db/dblevel/tweak.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func OverWriteTweaks(tweaks []types.Tweak) error {
4242
common.WarningLogger.Println("no entries for a tweak were found. this should not happen")
4343
return err
4444
}
45-
if len(pairs) != 1 {
45+
if len(pairs) != 1 { // todo understand what's going on here raises an error
4646
common.ErrorLogger.Printf("%+v", pairs)
4747
common.ErrorLogger.Println("number of tweaks was not exactly 1")
4848
return errors.New("number of tweaks was not exactly 1")

src/server/api.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func (h *ApiHandler) GetCFilterByHeight(c *gin.Context) {
7878
c.JSON(200, data)
7979
}
8080

81-
func (h *ApiHandler) GetLightUTXOsByHeight(c *gin.Context) {
81+
func (h *ApiHandler) GetUtxosByHeight(c *gin.Context) {
8282
heightStr := c.Param("blockheight")
8383
if heightStr == "" {
8484
c.JSON(http.StatusBadRequest, nil)

src/server/run.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ func RunServer(api *ApiHandler) {
1313
router.GET("/tweaks/:blockheight", api.GetTweakDataByHeight)
1414
router.GET("/tweak-index/:blockheight", api.GetTweakIndexDataByHeight)
1515
router.GET("/filter/:blockheight", api.GetCFilterByHeight)
16-
router.GET("/utxos/:blockheight", api.GetLightUTXOsByHeight)
16+
router.GET("/utxos/:blockheight", api.GetUtxosByHeight)
1717

1818
router.POST("/forward-tx", api.ForwardRawTX)
1919

0 commit comments

Comments
 (0)