Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
8204e9cd
Commit
8204e9cd
authored
Jan 05, 2014
by
obscuren
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Changed hashing, signature and key generation.
parent
92c34714
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
70 additions
and
25 deletions
+70
-25
transaction.go
transaction.go
+70
-25
No files found.
transaction.go
View file @
8204e9cd
...
@@ -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
}
}
}
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment