Skip to content

Commit

Permalink
Fixes issue with missing timestamp
Browse files Browse the repository at this point in the history
  • Loading branch information
Ashy5000 committed Apr 13, 2024
1 parent 10c2c09 commit 0d75dd8
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 25 deletions.
37 changes: 23 additions & 14 deletions block.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ func (i Transaction) MarshalJSON() ([]byte, error) {
panic(err)
}
signature := string(signatureBytes)
result := []byte(EncodePublicKey(i.Sender) + ":" + EncodePublicKey(i.Recipient) + ":" + fmt.Sprintf("%f", i.Amount) + ":" + signature)
result := []byte(EncodePublicKey(i.Sender) + ":" + EncodePublicKey(i.Recipient) + ":" + fmt.Sprintf("%f", i.Amount) + ":" + signature + ":" + strconv.FormatInt(i.Timestamp.UnixNano(), 10))
result = []byte(strings.Replace(string(result), `"`, "", -1))
result = []byte(`"` + string(result) + `"`)
return result, nil
Expand All @@ -76,9 +76,18 @@ func (i *Transaction) UnmarshalJSON(data []byte) error {
// Convert parts to appropriate types
i.Sender = DecodePublicKey(parts[0])
i.Recipient = DecodePublicKey(parts[1])
i.Amount, _ = strconv.ParseFloat(parts[2], 64)
amount, err := strconv.ParseFloat(parts[2], 64)
if err != nil {
panic(err)
}
i.Amount = amount
timestampInt, err := strconv.ParseInt(parts[4], 10, 64)
if err != nil {
panic(err)
}
i.Timestamp = time.Unix(0, timestampInt)
var signature Signature
err := json.Unmarshal([]byte(`"`+parts[3]+`"`), &signature)
err = json.Unmarshal([]byte(`"`+parts[3]+`"`), &signature)
if err != nil {
fmt.Println(err)
return err
Expand All @@ -88,15 +97,15 @@ func (i *Transaction) UnmarshalJSON(data []byte) error {
}

type Block struct {
Transactions []Transaction `json:"transactions"`
Miner PublicKey `json:"miner"`
Nonce int64 `json:"nonce"`
MiningTime time.Duration `json:"miningTime"`
Difficulty uint64 `json:"difficulty"`
PreviousBlockHash [32]byte `json:"previousBlockHash"`
Timestamp time.Time `json:"timestamp"`
PreMiningTimeVerifierSignatures []Signature `json:"preMiningTimeVerifierSignatures"`
PreMiningTimeVerifiers []PublicKey `json:"preMiningTimeVerifiers"`
TimeVerifierSignatures []Signature `json:"timeVerifierSignature"`
TimeVerifiers []PublicKey `json:"timeVerifiers"`
Transactions []Transaction `json:"transactions"`
Miner PublicKey `json:"miner"`
Nonce int64 `json:"nonce"`
MiningTime time.Duration `json:"miningTime"`
Difficulty uint64 `json:"difficulty"`
PreviousBlockHash [32]byte `json:"previousBlockHash"`
Timestamp time.Time `json:"timestamp"`
PreMiningTimeVerifierSignatures []Signature `json:"preMiningTimeVerifierSignatures"`
PreMiningTimeVerifiers []PublicKey `json:"preMiningTimeVerifiers"`
TimeVerifierSignatures []Signature `json:"timeVerifierSignature"`
TimeVerifiers []PublicKey `json:"timeVerifiers"`
}
Binary file modified builds/node/node_linux-arm64
Binary file not shown.
20 changes: 11 additions & 9 deletions server.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,17 @@ func HandleMineRequest(_ http.ResponseWriter, req *http.Request) {
}
timestamp := time.Unix(0, timestampInt)
sStr := fields[3]
s := []byte(sStr)
var s Signature
err = json.Unmarshal([]byte(sStr), &s)
if err != nil {
panic(err)
}
hash := sha256.Sum256([]byte(fmt.Sprintf("%s:%s:%f:%d", senderStr, recipientStr, amount, timestamp.UnixNano())))
if transactionHashes[hash] > 0 {
Log("No new job. Ignoring mine request.", true)
return
}
if !VerifyTransaction(senderKey, recipientKey, strconv.FormatFloat(amount, 'f', -1, 64), timestamp, s) {
if !VerifyTransaction(senderKey, recipientKey, strconv.FormatFloat(amount, 'f', -1, 64), timestamp, s.S) {
Log("Transaction is invalid. Ignoring transaction request.", true)
return
}
Expand All @@ -64,13 +68,11 @@ func HandleMineRequest(_ http.ResponseWriter, req *http.Request) {
panic(err)
}
transaction := Transaction{
Sender: senderKey,
Recipient: recipientKey,
Amount: amount,
SenderSignature: Signature{
S: s,
},
Timestamp: unmarshaledTimestamp,
Sender: senderKey,
Recipient: recipientKey,
Amount: amount,
SenderSignature: s,
Timestamp: unmarshaledTimestamp,
}
miningTransactions = append(miningTransactions, transaction)
Log("Broadcasting job to peers...", true)
Expand Down
7 changes: 5 additions & 2 deletions verify.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,21 @@ import (
"crypto/sha256"
"encoding/binary"
"fmt"
"github.com/open-quantum-safe/liboqs-go/oqs"
"strconv"
"time"
"unsafe"

"github.com/open-quantum-safe/liboqs-go/oqs"
)

func VerifyTransaction(senderKey PublicKey, recipientKey PublicKey, amount string, timestamp time.Time, sig []byte) bool {
amountFloat, err := strconv.ParseFloat(amount, 64)
if err != nil {
panic(err)
}
hash := sha256.Sum256([]byte(fmt.Sprintf("%s:%s:%s:%d", senderKey.Y, recipientKey.Y, amount, timestamp.UnixNano())))
transactionString := fmt.Sprintf("%s:%s:%s:%d", senderKey.Y, recipientKey.Y, amount, timestamp.UnixNano())
fmt.Println("Transaction string: ", transactionString)
hash := sha256.Sum256([]byte(transactionString))
verifier := oqs.Signature{}
sigName := "Dilithium2"
if err := verifier.Init(sigName, nil); err != nil {
Expand Down

0 comments on commit 0d75dd8

Please sign in to comment.