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
c039bb38
Commit
c039bb38
authored
Jun 10, 2016
by
Péter Szilágyi
Committed by
GitHub
Jun 10, 2016
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #2653 from tbocek/develop
Negative numbers not properly converted in ABI encoding
parents
6886913f
89c6c5bb
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
10 additions
and
64 deletions
+10
-64
method.go
accounts/abi/method.go
+1
-1
numbers.go
accounts/abi/numbers.go
+4
-38
numbers_test.go
accounts/abi/numbers_test.go
+3
-23
packing.go
accounts/abi/packing.go
+2
-2
No files found.
accounts/abi/method.go
View file @
c039bb38
...
...
@@ -62,7 +62,7 @@ func (m Method) pack(method Method, args ...interface{}) ([]byte, error) {
// calculate the offset
offset
:=
len
(
method
.
Inputs
)
*
32
+
len
(
variableInput
)
// set the offset
ret
=
append
(
ret
,
packNum
(
reflect
.
ValueOf
(
offset
)
,
UintTy
)
...
)
ret
=
append
(
ret
,
packNum
(
reflect
.
ValueOf
(
offset
))
...
)
// Append the packed output to the variable input. The variable input
// will be appended at the end of the input.
variableInput
=
append
(
variableInput
,
packed
...
)
...
...
accounts/abi/numbers.go
View file @
c039bb38
...
...
@@ -61,54 +61,20 @@ func U256(n *big.Int) []byte {
return
common
.
LeftPadBytes
(
common
.
U256
(
n
)
.
Bytes
(),
32
)
}
func
S256
(
n
*
big
.
Int
)
[]
byte
{
sint
:=
common
.
S256
(
n
)
ret
:=
common
.
LeftPadBytes
(
sint
.
Bytes
(),
32
)
if
sint
.
Cmp
(
common
.
Big0
)
<
0
{
for
i
,
b
:=
range
ret
{
if
b
==
0
{
ret
[
i
]
=
1
continue
}
break
}
}
return
ret
}
// S256 will ensure signed 256bit on big nums
func
U2U256
(
n
uint64
)
[]
byte
{
return
U256
(
big
.
NewInt
(
int64
(
n
)))
}
func
S2S256
(
n
int64
)
[]
byte
{
return
S256
(
big
.
NewInt
(
n
))
}
// packNum packs the given number (using the reflect value) and will cast it to appropriate number representation
func
packNum
(
value
reflect
.
Value
,
to
byte
)
[]
byte
{
func
packNum
(
value
reflect
.
Value
)
[]
byte
{
switch
kind
:=
value
.
Kind
();
kind
{
case
reflect
.
Uint
,
reflect
.
Uint8
,
reflect
.
Uint16
,
reflect
.
Uint32
,
reflect
.
Uint64
:
if
to
==
UintTy
{
return
U2U256
(
value
.
Uint
())
}
else
{
return
S2S256
(
int64
(
value
.
Uint
()))
}
return
U2U256
(
value
.
Uint
())
case
reflect
.
Int
,
reflect
.
Int8
,
reflect
.
Int16
,
reflect
.
Int32
,
reflect
.
Int64
:
if
to
==
UintTy
{
return
U2U256
(
uint64
(
value
.
Int
()))
}
else
{
return
S2S256
(
value
.
Int
())
}
return
U2U256
(
uint64
(
value
.
Int
()))
case
reflect
.
Ptr
:
// This only takes care of packing and casting. No type checking is done here. It should be done prior to using this function.
if
to
==
UintTy
{
return
U256
(
value
.
Interface
()
.
(
*
big
.
Int
))
}
else
{
return
S256
(
value
.
Interface
()
.
(
*
big
.
Int
))
}
return
U256
(
value
.
Interface
()
.
(
*
big
.
Int
))
}
return
nil
...
...
accounts/abi/numbers_test.go
View file @
c039bb38
...
...
@@ -26,48 +26,28 @@ import (
func
TestNumberTypes
(
t
*
testing
.
T
)
{
ubytes
:=
make
([]
byte
,
32
)
ubytes
[
31
]
=
1
sbytesmin
:=
[]
byte
{
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
}
unsigned
:=
U256
(
big
.
NewInt
(
1
))
if
!
bytes
.
Equal
(
unsigned
,
ubytes
)
{
t
.
Errorf
(
"expected %x got %x"
,
ubytes
,
unsigned
)
}
signed
:=
S256
(
big
.
NewInt
(
1
))
if
!
bytes
.
Equal
(
signed
,
ubytes
)
{
t
.
Errorf
(
"expected %x got %x"
,
ubytes
,
unsigned
)
}
signed
=
S256
(
big
.
NewInt
(
-
1
))
if
!
bytes
.
Equal
(
signed
,
sbytesmin
)
{
t
.
Errorf
(
"expected %x got %x"
,
ubytes
,
unsigned
)
}
}
func
TestPackNumber
(
t
*
testing
.
T
)
{
ubytes
:=
make
([]
byte
,
32
)
ubytes
[
31
]
=
1
sbytesmin
:=
[]
byte
{
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
}
maxunsigned
:=
[]
byte
{
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
255
}
packed
:=
packNum
(
reflect
.
ValueOf
(
1
),
IntTy
)
if
!
bytes
.
Equal
(
packed
,
ubytes
)
{
t
.
Errorf
(
"expected %x got %x"
,
ubytes
,
packed
)
}
packed
=
packNum
(
reflect
.
ValueOf
(
-
1
),
IntTy
)
if
!
bytes
.
Equal
(
packed
,
sbytesmin
)
{
t
.
Errorf
(
"expected %x got %x"
,
ubytes
,
packed
)
}
packed
=
packNum
(
reflect
.
ValueOf
(
1
),
UintTy
)
packed
:=
packNum
(
reflect
.
ValueOf
(
1
))
if
!
bytes
.
Equal
(
packed
,
ubytes
)
{
t
.
Errorf
(
"expected %x got %x"
,
ubytes
,
packed
)
}
packed
=
packNum
(
reflect
.
ValueOf
(
-
1
)
,
UintTy
)
packed
=
packNum
(
reflect
.
ValueOf
(
-
1
))
if
!
bytes
.
Equal
(
packed
,
maxunsigned
)
{
t
.
Errorf
(
"expected %x got %x"
,
maxunsigned
,
packed
)
}
packed
=
packNum
(
reflect
.
ValueOf
(
"string"
)
,
UintTy
)
packed
=
packNum
(
reflect
.
ValueOf
(
"string"
))
if
packed
!=
nil
{
t
.
Errorf
(
"expected 'string' to pack to nil. got %x instead"
,
packed
)
}
...
...
accounts/abi/packing.go
View file @
c039bb38
...
...
@@ -25,7 +25,7 @@ import (
// packBytesSlice packs the given bytes as [L, V] as the canonical representation
// bytes slice
func
packBytesSlice
(
bytes
[]
byte
,
l
int
)
[]
byte
{
len
:=
packNum
(
reflect
.
ValueOf
(
l
)
,
UintTy
)
len
:=
packNum
(
reflect
.
ValueOf
(
l
))
return
append
(
len
,
common
.
RightPadBytes
(
bytes
,
(
l
+
31
)
/
32
*
32
)
...
)
}
...
...
@@ -34,7 +34,7 @@ func packBytesSlice(bytes []byte, l int) []byte {
func
packElement
(
t
Type
,
reflectValue
reflect
.
Value
)
[]
byte
{
switch
t
.
T
{
case
IntTy
,
UintTy
:
return
packNum
(
reflectValue
,
t
.
T
)
return
packNum
(
reflectValue
)
case
StringTy
:
return
packBytesSlice
([]
byte
(
reflectValue
.
String
()),
reflectValue
.
Len
())
case
AddressTy
:
...
...
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