Dateien nach "/" hochladen

Create a new folder inside `./cmd` and copy the file there.
Within the Dero root folder run `go build -o some_name_here ./cmd/new_folder_name`

The binary has to be placed in the directory where the mainnet folder is located.
`./binary <TXID>`
This commit is contained in:
mmarcel 2024-05-21 14:08:29 +01:00
commit 6d4882cc26

177
main.go Normal file
View File

@ -0,0 +1,177 @@
package main
import (
"bytes"
"log"
"math/big"
"os"
"strconv"
"time"
"github.com/deroproject/derohe/blockchain"
"github.com/deroproject/derohe/cryptography/bn256"
"github.com/deroproject/derohe/cryptography/crypto"
"github.com/deroproject/derohe/rpc"
"github.com/deroproject/derohe/transaction"
)
const atomic_units = int64(100000)
var target = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
var progress, max uint64
var upper_limit int64 = 100
func main() {
if len(os.Args) < 2 {
log.Println("No args")
return
}
if len(os.Args) == 3 {
upper, err := strconv.ParseInt(os.Args[2], 10, 64)
if err != nil {
upper_limit = upper
}
}
chain, err := blockchain.Blockchain_Start(nil)
if err != nil {
log.Println("Chain error")
return
}
txid := os.Args[1]
tx_hash := crypto.HashHexToHash(txid)
log.Printf("Upper limit set to %d Dero\n", upper_limit)
log.Printf("Checking TXID %s\n", txid)
_, _, valid := chain.IS_TX_Valid(tx_hash)
if !valid {
log.Println("TX is not valid")
return
}
var tx transaction.Transaction
tx_data, err := chain.Store.Block_tx_store.ReadTX(tx_hash)
if err != nil {
log.Printf("Can't read TX; %v\n", err)
return
}
err = tx.Deserialize(tx_data)
if err != nil {
log.Println("Can't deserialize TX")
return
}
err = chain.Expand_Transaction_NonCoinbase(&tx)
if err != nil {
log.Println("Can't expand TX")
return
}
var wait uint64
for _, p := range tx.Payloads {
max = uint64(upper_limit) * uint64(atomic_units) * p.Statement.RingSize
t_now := time.Now()
for i := uint64(0); i < p.Statement.RingSize; i++ {
go bruteforce(i, &p, &wait)
wait++
}
t_log := time.Now()
for wait == p.Statement.RingSize {
if progress > 0 {
if time.Since(t_log) > time.Second*10 {
log.Printf("%.2f%% done\n", float64(float64(progress)/float64(max)*100))
t_log = time.Now()
}
}
}
wait = 0
duration := time.Since(t_now)
log.Printf("Operation took %s\n", duration.String())
}
}
func bruteforce(i uint64, p *transaction.AssetPayload, wg *uint64) {
var payload [145]byte
commitment := p.Statement.C[i]
for j := int64(0); j <= upper_limit*atomic_units; j += 10 {
copy(payload[:transaction.PAYLOAD_LIMIT], p.RPCPayload[:transaction.PAYLOAD_LIMIT])
shared_key := get_hash(commitment, j)
crypto.EncryptDecryptUserData(crypto.Keccak256(shared_key[:], p.Statement.Publickeylist[i].EncodeCompressed()), payload[:])
if bytes.Compare(payload[100:116], target) == 0 {
var sender_addr *rpc.Address
var entry rpc.Entry
sender_idx := uint(payload[0])
if sender_idx <= 128 && sender_idx != uint(i) {
sender_addr, _ = rpc.NewAddressFromCompressedKeys(p.Statement.Publickeylist[sender_idx].EncodeCompressed())
log.Printf("Sender: %s\n", sender_addr.String())
}
recv_addr, _ := rpc.NewAddressFromCompressedKeys(p.Statement.Publickeylist[i].EncodeCompressed())
log.Printf("Receiver: %s\n", recv_addr.String())
log.Printf("Amount: %.5f\n", float64(j)/float64(atomic_units))
entry.Payload = append(entry.Payload, payload[1:]...)
args, _ := entry.ProcessPayload()
for _, p := range args {
if p.Name == "D" {
log.Printf("Destination Port: %d\n", p.Value.(uint64))
}
if p.Name == "C" {
log.Printf("Comment: %s\n", p.Value.(string))
}
}
*wg--
return
}
}
for j := int64(0); j <= upper_limit*atomic_units; j++ {
copy(payload[:transaction.PAYLOAD_LIMIT], p.RPCPayload[:transaction.PAYLOAD_LIMIT])
shared_key := get_hash(commitment, j)
crypto.EncryptDecryptUserData(crypto.Keccak256(shared_key[:], p.Statement.Publickeylist[i].EncodeCompressed()), payload[:])
if bytes.Compare(payload[100:116], target) == 0 {
var sender_addr *rpc.Address
sender_idx := uint(payload[0])
if sender_idx <= 128 && sender_idx != uint(i) {
sender_addr, _ = rpc.NewAddressFromCompressedKeys(p.Statement.Publickeylist[sender_idx].EncodeCompressed())
log.Printf("Sender: %s\n", sender_addr.String())
}
recv_addr, _ := rpc.NewAddressFromCompressedKeys(p.Statement.Publickeylist[i].EncodeCompressed())
log.Printf("Receiver: %s\n", recv_addr.String())
log.Printf("Amount: %.5f\n", float64(j)/float64(atomic_units))
*wg--
return
}
progress++
}
*wg--
}
func get_hash(c *bn256.G1, num int64) crypto.Hash {
var x bn256.G1
x.Add(new(bn256.G1).Set(c), new(bn256.G1).ScalarMult(crypto.G, new(big.Int).SetInt64(0-num)))
compressed := x.EncodeCompressed()
if len(compressed) != 33 {
panic("point compression needs to be fixed")
}
return crypto.Keccak256(compressed[:])
}