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
fb458280
Commit
fb458280
authored
Mar 18, 2019
by
Kushagra Sharma
Committed by
Guillaume Ballet
Mar 18, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Modified Abigen to Support Vyper (#19120)
parent
47c03c0f
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
317 additions
and
56 deletions
+317
-56
main.go
cmd/abigen/main.go
+27
-9
helpers.go
common/compiler/helpers.go
+64
-0
solidity.go
common/compiler/solidity.go
+2
-44
solidity_test.go
common/compiler/solidity_test.go
+3
-3
test.v.py
common/compiler/test.v.py
+3
-0
test_bad.v.py
common/compiler/test_bad.v.py
+3
-0
vyper.go
common/compiler/vyper.go
+144
-0
vyper_test.go
common/compiler/vyper_test.go
+71
-0
No files found.
cmd/abigen/main.go
View file @
fb458280
// Copyright 201
6
The go-ethereum Authors
// Copyright 201
9
The go-ethereum Authors
// This file is part of go-ethereum.
//
// go-ethereum is free software: you can redistribute it and/or modify
...
...
@@ -37,6 +37,9 @@ var (
solcFlag
=
flag
.
String
(
"solc"
,
"solc"
,
"Solidity compiler to use if source builds are requested"
)
excFlag
=
flag
.
String
(
"exc"
,
""
,
"Comma separated types to exclude from binding"
)
vyFlag
=
flag
.
String
(
"vy"
,
""
,
"Path to the Ethereum contract Vyper source to build and bind"
)
vyperFlag
=
flag
.
String
(
"vyper"
,
"vyper"
,
"Vyper compiler to use if source builds are requested"
)
pkgFlag
=
flag
.
String
(
"pkg"
,
""
,
"Package name to generate the binding into"
)
outFlag
=
flag
.
String
(
"out"
,
""
,
"Output file for the generated binding (default = stdout)"
)
langFlag
=
flag
.
String
(
"lang"
,
"go"
,
"Destination language for the bindings (go, java, objc)"
)
...
...
@@ -46,11 +49,14 @@ func main() {
// Parse and ensure all needed inputs are specified
flag
.
Parse
()
if
*
abiFlag
==
""
&&
*
solFlag
==
""
{
fmt
.
Printf
(
"No contract ABI (--abi) or Solidity source (--sol) specified
\n
"
)
if
*
abiFlag
==
""
&&
*
solFlag
==
""
&&
*
vyFlag
==
""
{
fmt
.
Printf
(
"No contract ABI (--abi), Solidity source (--sol), or Vyper source (--vy) specified
\n
"
)
os
.
Exit
(
-
1
)
}
else
if
(
*
abiFlag
!=
""
||
*
binFlag
!=
""
||
*
typFlag
!=
""
)
&&
(
*
solFlag
!=
""
||
*
vyFlag
!=
""
)
{
fmt
.
Printf
(
"Contract ABI (--abi), bytecode (--bin) and type (--type) flags are mutually exclusive with the Solidity (--sol) and Vyper (--vy) flags
\n
"
)
os
.
Exit
(
-
1
)
}
else
if
(
*
abiFlag
!=
""
||
*
binFlag
!=
""
||
*
typFlag
!=
""
)
&&
*
sol
Flag
!=
""
{
fmt
.
Printf
(
"
Contract ABI (--abi), bytecode (--bin) and type (--type) flags are mutually exclusive with the Solidity source (--sol) flag
\n
"
)
}
else
if
*
solFlag
!=
""
&&
*
vy
Flag
!=
""
{
fmt
.
Printf
(
"
Solidity (--sol) and Vyper (--vy) flags are mutually exclusive
\n
"
)
os
.
Exit
(
-
1
)
}
if
*
pkgFlag
==
""
{
...
...
@@ -75,7 +81,7 @@ func main() {
bins
[]
string
types
[]
string
)
if
*
solFlag
!=
""
||
(
*
abiFlag
==
"-"
&&
*
pkgFlag
==
""
)
{
if
*
solFlag
!=
""
||
*
vyFlag
!=
""
||
(
*
abiFlag
==
"-"
&&
*
pkgFlag
==
""
)
{
// Generate the list of types to exclude from binding
exclude
:=
make
(
map
[
string
]
bool
)
for
_
,
kind
:=
range
strings
.
Split
(
*
excFlag
,
","
)
{
...
...
@@ -84,13 +90,21 @@ func main() {
var
contracts
map
[
string
]
*
compiler
.
Contract
var
err
error
if
*
solFlag
!=
""
{
switch
{
case
*
solFlag
!=
""
:
contracts
,
err
=
compiler
.
CompileSolidity
(
*
solcFlag
,
*
solFlag
)
if
err
!=
nil
{
fmt
.
Printf
(
"Failed to build Solidity contract: %v
\n
"
,
err
)
os
.
Exit
(
-
1
)
}
}
else
{
case
*
vyFlag
!=
""
:
contracts
,
err
=
compiler
.
CompileVyper
(
*
vyperFlag
,
*
vyFlag
)
if
err
!=
nil
{
fmt
.
Printf
(
"Failed to build Vyper contract: %v
\n
"
,
err
)
os
.
Exit
(
-
1
)
}
default
:
contracts
,
err
=
contractsFromStdin
()
if
err
!=
nil
{
fmt
.
Printf
(
"Failed to read input ABIs from STDIN: %v
\n
"
,
err
)
...
...
@@ -102,7 +116,11 @@ func main() {
if
exclude
[
strings
.
ToLower
(
name
)]
{
continue
}
abi
,
_
:=
json
.
Marshal
(
contract
.
Info
.
AbiDefinition
)
// Flatten the compiler parse
abi
,
err
:=
json
.
Marshal
(
contract
.
Info
.
AbiDefinition
)
// Flatten the compiler parse
if
err
!=
nil
{
fmt
.
Printf
(
"Failed to parse ABIs from compiler output: %v
\n
"
,
err
)
os
.
Exit
(
-
1
)
}
abis
=
append
(
abis
,
string
(
abi
))
bins
=
append
(
bins
,
contract
.
Code
)
...
...
common/compiler/helpers.go
0 → 100644
View file @
fb458280
// Copyright 2019 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
// Package compiler wraps the Solidity and Vyper compiler executables (solc; vyper).
package
compiler
import
(
"bytes"
"io/ioutil"
"regexp"
)
var
versionRegexp
=
regexp
.
MustCompile
(
`([0-9]+)\.([0-9]+)\.([0-9]+)`
)
// Contract contains information about a compiled contract, alongside its code and runtime code.
type
Contract
struct
{
Code
string
`json:"code"`
RuntimeCode
string
`json:"runtime-code"`
Info
ContractInfo
`json:"info"`
}
// ContractInfo contains information about a compiled contract, including access
// to the ABI definition, source mapping, user and developer docs, and metadata.
//
// Depending on the source, language version, compiler version, and compiler
// options will provide information about how the contract was compiled.
type
ContractInfo
struct
{
Source
string
`json:"source"`
Language
string
`json:"language"`
LanguageVersion
string
`json:"languageVersion"`
CompilerVersion
string
`json:"compilerVersion"`
CompilerOptions
string
`json:"compilerOptions"`
SrcMap
interface
{}
`json:"srcMap"`
SrcMapRuntime
string
`json:"srcMapRuntime"`
AbiDefinition
interface
{}
`json:"abiDefinition"`
UserDoc
interface
{}
`json:"userDoc"`
DeveloperDoc
interface
{}
`json:"developerDoc"`
Metadata
string
`json:"metadata"`
}
func
slurpFiles
(
files
[]
string
)
(
string
,
error
)
{
var
concat
bytes
.
Buffer
for
_
,
file
:=
range
files
{
content
,
err
:=
ioutil
.
ReadFile
(
file
)
if
err
!=
nil
{
return
""
,
err
}
concat
.
Write
(
content
)
}
return
concat
.
String
(),
nil
}
common/compiler/solidity.go
View file @
fb458280
// Copyright 201
5
The go-ethereum Authors
// Copyright 201
9
The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
...
...
@@ -14,7 +14,7 @@
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
// Package compiler wraps the Solidity
compiler executable (solc
).
// Package compiler wraps the Solidity
and Vyper compiler executables (solc; vyper
).
package
compiler
import
(
...
...
@@ -22,41 +22,11 @@ import (
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"os/exec"
"regexp"
"strconv"
"strings"
)
var
versionRegexp
=
regexp
.
MustCompile
(
`([0-9]+)\.([0-9]+)\.([0-9]+)`
)
// Contract contains information about a compiled contract, alongside its code and runtime code.
type
Contract
struct
{
Code
string
`json:"code"`
RuntimeCode
string
`json:"runtime-code"`
Info
ContractInfo
`json:"info"`
}
// ContractInfo contains information about a compiled contract, including access
// to the ABI definition, source mapping, user and developer docs, and metadata.
//
// Depending on the source, language version, compiler version, and compiler
// options will provide information about how the contract was compiled.
type
ContractInfo
struct
{
Source
string
`json:"source"`
Language
string
`json:"language"`
LanguageVersion
string
`json:"languageVersion"`
CompilerVersion
string
`json:"compilerVersion"`
CompilerOptions
string
`json:"compilerOptions"`
SrcMap
string
`json:"srcMap"`
SrcMapRuntime
string
`json:"srcMapRuntime"`
AbiDefinition
interface
{}
`json:"abiDefinition"`
UserDoc
interface
{}
`json:"userDoc"`
DeveloperDoc
interface
{}
`json:"developerDoc"`
Metadata
string
`json:"metadata"`
}
// Solidity contains information about the solidity compiler.
type
Solidity
struct
{
Path
,
Version
,
FullVersion
string
...
...
@@ -208,15 +178,3 @@ func ParseCombinedJSON(combinedJSON []byte, source string, languageVersion strin
}
return
contracts
,
nil
}
func
slurpFiles
(
files
[]
string
)
(
string
,
error
)
{
var
concat
bytes
.
Buffer
for
_
,
file
:=
range
files
{
content
,
err
:=
ioutil
.
ReadFile
(
file
)
if
err
!=
nil
{
return
""
,
err
}
concat
.
Write
(
content
)
}
return
concat
.
String
(),
nil
}
common/compiler/solidity_test.go
View file @
fb458280
// Copyright 201
5
The go-ethereum Authors
// Copyright 201
9
The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
...
...
@@ -39,7 +39,7 @@ func skipWithoutSolc(t *testing.T) {
}
}
func
TestCompiler
(
t
*
testing
.
T
)
{
func
Test
Solidity
Compiler
(
t
*
testing
.
T
)
{
skipWithoutSolc
(
t
)
contracts
,
err
:=
CompileSolidityString
(
""
,
testSource
)
...
...
@@ -67,7 +67,7 @@ func TestCompiler(t *testing.T) {
}
}
func
TestCompileError
(
t
*
testing
.
T
)
{
func
Test
Solidity
CompileError
(
t
*
testing
.
T
)
{
skipWithoutSolc
(
t
)
contracts
,
err
:=
CompileSolidityString
(
""
,
testSource
[
4
:
])
...
...
common/compiler/test.v.py
0 → 100644
View file @
fb458280
@
public
def
test
():
hello
:
int128
common/compiler/test_bad.v.py
0 → 100644
View file @
fb458280
lic
def
test
():
hello
:
int128
common/compiler/vyper.go
0 → 100644
View file @
fb458280
// Copyright 2019 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
// Package compiler wraps the Solidity and Vyper compiler executables (solc; vyper).
package
compiler
import
(
"bytes"
"encoding/json"
"errors"
"fmt"
"os/exec"
"strconv"
"strings"
)
// Vyper contains information about the vyper compiler.
type
Vyper
struct
{
Path
,
Version
,
FullVersion
string
Major
,
Minor
,
Patch
int
}
func
(
s
*
Vyper
)
makeArgs
()
[]
string
{
p
:=
[]
string
{
"-f"
,
"combined_json"
,
}
return
p
}
// VyperVersion runs vyper and parses its version output.
func
VyperVersion
(
vyper
string
)
(
*
Vyper
,
error
)
{
if
vyper
==
""
{
vyper
=
"vyper"
}
var
out
bytes
.
Buffer
cmd
:=
exec
.
Command
(
vyper
,
"--version"
)
cmd
.
Stdout
=
&
out
err
:=
cmd
.
Run
()
if
err
!=
nil
{
return
nil
,
err
}
matches
:=
versionRegexp
.
FindStringSubmatch
(
out
.
String
())
if
len
(
matches
)
!=
4
{
return
nil
,
fmt
.
Errorf
(
"can't parse vyper version %q"
,
out
.
String
())
}
s
:=
&
Vyper
{
Path
:
cmd
.
Path
,
FullVersion
:
out
.
String
(),
Version
:
matches
[
0
]}
if
s
.
Major
,
err
=
strconv
.
Atoi
(
matches
[
1
]);
err
!=
nil
{
return
nil
,
err
}
if
s
.
Minor
,
err
=
strconv
.
Atoi
(
matches
[
2
]);
err
!=
nil
{
return
nil
,
err
}
if
s
.
Patch
,
err
=
strconv
.
Atoi
(
matches
[
3
]);
err
!=
nil
{
return
nil
,
err
}
return
s
,
nil
}
// CompileVyper compiles all given Vyper source files.
func
CompileVyper
(
vyper
string
,
sourcefiles
...
string
)
(
map
[
string
]
*
Contract
,
error
)
{
if
len
(
sourcefiles
)
==
0
{
return
nil
,
errors
.
New
(
"vyper: no source files"
)
}
source
,
err
:=
slurpFiles
(
sourcefiles
)
if
err
!=
nil
{
return
nil
,
err
}
s
,
err
:=
VyperVersion
(
vyper
)
if
err
!=
nil
{
return
nil
,
err
}
args
:=
s
.
makeArgs
()
cmd
:=
exec
.
Command
(
s
.
Path
,
append
(
args
,
sourcefiles
...
)
...
)
return
s
.
run
(
cmd
,
source
)
}
func
(
s
*
Vyper
)
run
(
cmd
*
exec
.
Cmd
,
source
string
)
(
map
[
string
]
*
Contract
,
error
)
{
var
stderr
,
stdout
bytes
.
Buffer
cmd
.
Stderr
=
&
stderr
cmd
.
Stdout
=
&
stdout
if
err
:=
cmd
.
Run
();
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"vyper: %v
\n
%s"
,
err
,
stderr
.
Bytes
())
}
return
ParseVyperJSON
(
stdout
.
Bytes
(),
source
,
s
.
Version
,
s
.
Version
,
strings
.
Join
(
s
.
makeArgs
(),
" "
))
}
// ParseVyperJSON takes the direct output of a vyper --f combined_json run and
// parses it into a map of string contract name to Contract structs. The
// provided source, language and compiler version, and compiler options are all
// passed through into the Contract structs.
//
// The vyper output is expected to contain ABI and source mapping.
//
// Returns an error if the JSON is malformed or missing data, or if the JSON
// embedded within the JSON is malformed.
func
ParseVyperJSON
(
combinedJSON
[]
byte
,
source
string
,
languageVersion
string
,
compilerVersion
string
,
compilerOptions
string
)
(
map
[
string
]
*
Contract
,
error
)
{
var
output
map
[
string
]
interface
{}
if
err
:=
json
.
Unmarshal
(
combinedJSON
,
&
output
);
err
!=
nil
{
return
nil
,
err
}
// Compilation succeeded, assemble and return the contracts.
contracts
:=
make
(
map
[
string
]
*
Contract
)
for
name
,
info
:=
range
output
{
// Parse the individual compilation results.
if
name
==
"version"
{
continue
}
c
:=
info
.
(
map
[
string
]
interface
{})
contracts
[
name
]
=
&
Contract
{
Code
:
c
[
"bytecode"
]
.
(
string
),
RuntimeCode
:
c
[
"bytecode_runtime"
]
.
(
string
),
Info
:
ContractInfo
{
Source
:
source
,
Language
:
"Vyper"
,
LanguageVersion
:
languageVersion
,
CompilerVersion
:
compilerVersion
,
CompilerOptions
:
compilerOptions
,
SrcMap
:
c
[
"source_map"
],
SrcMapRuntime
:
""
,
AbiDefinition
:
c
[
"abi"
],
UserDoc
:
""
,
DeveloperDoc
:
""
,
Metadata
:
""
,
},
}
}
return
contracts
,
nil
}
common/compiler/vyper_test.go
0 → 100644
View file @
fb458280
// Copyright 2019 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
package
compiler
import
(
"os/exec"
"testing"
)
func
skipWithoutVyper
(
t
*
testing
.
T
)
{
if
_
,
err
:=
exec
.
LookPath
(
"vyper"
);
err
!=
nil
{
t
.
Skip
(
err
)
}
}
func
TestVyperCompiler
(
t
*
testing
.
T
)
{
skipWithoutVyper
(
t
)
testSource
:=
[]
string
{
"test.v.py"
}
source
,
err
:=
slurpFiles
(
testSource
)
if
err
!=
nil
{
t
.
Error
(
"couldn't read test files"
)
}
contracts
,
err
:=
CompileVyper
(
""
,
testSource
...
)
if
err
!=
nil
{
t
.
Fatalf
(
"error compiling test.v.py. result %v: %v"
,
contracts
,
err
)
}
if
len
(
contracts
)
!=
1
{
t
.
Errorf
(
"one contract expected, got %d"
,
len
(
contracts
))
}
c
,
ok
:=
contracts
[
"test.v.py"
]
if
!
ok
{
c
,
ok
=
contracts
[
"<stdin>:test"
]
if
!
ok
{
t
.
Fatal
(
"info for contract 'test.v.py' not present in result"
)
}
}
if
c
.
Code
==
""
{
t
.
Error
(
"empty code"
)
}
if
c
.
Info
.
Source
!=
source
{
t
.
Error
(
"wrong source"
)
}
if
c
.
Info
.
CompilerVersion
==
""
{
t
.
Error
(
"empty version"
)
}
}
func
TestVyperCompileError
(
t
*
testing
.
T
)
{
skipWithoutVyper
(
t
)
contracts
,
err
:=
CompileVyper
(
""
,
"test_bad.v.py"
)
if
err
==
nil
{
t
.
Errorf
(
"error expected compiling test_bad.v.py. got none. result %v"
,
contracts
)
}
t
.
Logf
(
"error: %v"
,
err
)
}
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