good morning!!!!

Skip to content
Snippets Groups Projects
Commit 8204e9cd authored by Jeffrey Wilcke's avatar Jeffrey Wilcke
Browse files

Changed hashing, signature and key generation.

parent 92c34714
No related branches found
No related tags found
No related merge requests found
...@@ -43,10 +43,8 @@ type Transaction struct { ...@@ -43,10 +43,8 @@ type Transaction struct {
data []string data []string
memory []int memory []int
lastTx string lastTx string
v uint32
// To be removed r, s []byte
signature string
addr string
} }
func NewTransaction(to string, value uint64, data []string) *Transaction { func NewTransaction(to string, value uint64, data []string) *Transaction {
...@@ -60,18 +58,28 @@ func NewTransaction(to string, value uint64, data []string) *Transaction { ...@@ -60,18 +58,28 @@ func NewTransaction(to string, value uint64, data []string) *Transaction {
for i, val := range data { for i, val := range data {
instr, err := CompileInstr(val) instr, err := CompileInstr(val)
if err != nil { if err != nil {
fmt.Printf("compile error:%d %v\n", i+1, err) //fmt.Printf("compile error:%d %v\n", i+1, err)
} }
tx.data[i] = instr tx.data[i] = instr
} }
tx.SetVRS()
return &tx return &tx
} }
func (tx *Transaction) Hash() []byte { func (tx *Transaction) Hash() []byte {
return Sha256Bin(tx.MarshalRlp()) preEnc := []interface{}{
tx.nonce,
tx.recipient,
tx.value,
tx.fee,
tx.data,
}
return Sha256Bin(Encode(preEnc))
} }
func (tx *Transaction) IsContract() bool { func (tx *Transaction) IsContract() bool {
...@@ -79,7 +87,7 @@ func (tx *Transaction) IsContract() bool { ...@@ -79,7 +87,7 @@ func (tx *Transaction) IsContract() bool {
} }
func (tx *Transaction) Signature() []byte { func (tx *Transaction) Signature() []byte {
hash := Sha256Bin(tx.MarshalRlp()) hash := tx.Hash()
sec := Sha256Bin([]byte("myprivkey")) sec := Sha256Bin([]byte("myprivkey"))
sig, _ := secp256k1.Sign(hash, sec) sig, _ := secp256k1.Sign(hash, sec)
...@@ -96,15 +104,34 @@ func (tx *Transaction) PublicKey() []byte { ...@@ -96,15 +104,34 @@ func (tx *Transaction) PublicKey() []byte {
return pubkey return pubkey
} }
func (tx *Transaction) Address() []byte {
pubk := tx.PublicKey()
// 1 is the marker 04
key := pubk[1:65]
return Sha256Bin(key)[12:]
}
func (tx *Transaction) SetVRS() {
// Add 27 so we get either 27 or 28 (for positive and negative)
tx.v = uint32(tx.Signature()[64]) + 27
pubk := tx.PublicKey()[1:65]
tx.r = pubk[:32]
tx.s = pubk[32:64]
}
func (tx *Transaction) MarshalRlp() []byte { func (tx *Transaction) MarshalRlp() []byte {
// Prepare the transaction for serialization // Prepare the transaction for serialization
preEnc := []interface{}{ preEnc := []interface{}{
tx.lastTx, tx.nonce,
tx.sender,
tx.recipient, tx.recipient,
tx.value, tx.value,
tx.fee, tx.fee,
tx.data, tx.data,
tx.v,
tx.r,
tx.s,
} }
return Encode(preEnc) return Encode(preEnc)
...@@ -113,46 +140,43 @@ func (tx *Transaction) MarshalRlp() []byte { ...@@ -113,46 +140,43 @@ func (tx *Transaction) MarshalRlp() []byte {
func (tx *Transaction) UnmarshalRlp(data []byte) { func (tx *Transaction) UnmarshalRlp(data []byte) {
t, _ := Decode(data,0) t, _ := Decode(data,0)
if slice, ok := t.([]interface{}); ok { if slice, ok := t.([]interface{}); ok {
if lastTx, ok := slice[0].([]byte); ok { fmt.Printf("NONCE %T\n", slice[3])
tx.lastTx = string(lastTx) if nonce, ok := slice[0].(uint8); ok {
tx.nonce = string(nonce)
} }
if sender, ok := slice[1].([]byte); ok { if recipient, ok := slice[1].([]byte); ok {
tx.sender = string(sender)
}
if recipient, ok := slice[2].([]byte); ok {
tx.recipient = string(recipient) tx.recipient = string(recipient)
} }
// If only I knew of a better way. // If only I knew of a better way.
if value, ok := slice[3].(uint8); ok { if value, ok := slice[2].(uint8); ok {
tx.value = uint64(value) tx.value = uint64(value)
} }
if value, ok := slice[3].(uint16); ok { if value, ok := slice[2].(uint16); ok {
tx.value = uint64(value) tx.value = uint64(value)
} }
if value, ok := slice[3].(uint32); ok { if value, ok := slice[2].(uint32); ok {
tx.value = uint64(value) tx.value = uint64(value)
} }
if value, ok := slice[3].(uint64); ok { if value, ok := slice[2].(uint64); ok {
tx.value = uint64(value) tx.value = uint64(value)
} }
if fee, ok := slice[4].(uint8); ok { if fee, ok := slice[3].(uint8); ok {
tx.fee = uint32(fee) tx.fee = uint32(fee)
} }
if fee, ok := slice[4].(uint16); ok { if fee, ok := slice[3].(uint16); ok {
tx.fee = uint32(fee) tx.fee = uint32(fee)
} }
if fee, ok := slice[4].(uint32); ok { if fee, ok := slice[3].(uint32); ok {
tx.fee = uint32(fee) tx.fee = uint32(fee)
} }
if fee, ok := slice[4].(uint64); ok { if fee, ok := slice[3].(uint64); ok {
tx.fee = uint32(fee) tx.fee = uint32(fee)
} }
// Encode the data/instructions // Encode the data/instructions
if data, ok := slice[5].([]interface{}); ok { if data, ok := slice[4].([]interface{}); ok {
tx.data = make([]string, len(data)) tx.data = make([]string, len(data))
for i, d := range data { for i, d := range data {
if instr, ok := d.([]byte); ok { if instr, ok := d.([]byte); ok {
...@@ -160,6 +184,27 @@ func (tx *Transaction) UnmarshalRlp(data []byte) { ...@@ -160,6 +184,27 @@ func (tx *Transaction) UnmarshalRlp(data []byte) {
} }
} }
} }
// vrs
fmt.Printf("v %T\n", slice[5])
if v, ok := slice[5].(uint8); ok {
tx.v = uint32(v)
}
if v, ok := slice[5].(uint16); ok {
tx.v = uint32(v)
}
if v, ok := slice[5].(uint32); ok {
tx.v = uint32(v)
}
if v, ok := slice[5].(uint64); ok {
tx.v = uint32(v)
}
if r, ok := slice[6].([]byte); ok {
tx.r = r
}
if s, ok := slice[7].([]byte); ok {
tx.s = s
}
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment