Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
plugin
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
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
link33
plugin
Commits
44ac3a6e
Commit
44ac3a6e
authored
Mar 08, 2019
by
lilinleeli1234
Committed by
vipwzw
Mar 10, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update evm client support solc
parent
85f54748
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
342 additions
and
7 deletions
+342
-7
solidity.go
plugin/dapp/evm/commands/compiler/solidity.go
+222
-0
solidity_test.go
plugin/dapp/evm/commands/compiler/solidity_test.go
+79
-0
evm.go
plugin/dapp/evm/commands/evm.go
+41
-7
No files found.
plugin/dapp/evm/commands/compiler/solidity.go
0 → 100644
View file @
44ac3a6e
// Copyright 2015 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 compiler executable (solc).
package
compiler
import
(
"bytes"
"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
Major
,
Minor
,
Patch
int
}
// --combined-output format
type
solcOutput
struct
{
Contracts
map
[
string
]
struct
{
BinRuntime
string
`json:"bin-runtime"`
SrcMapRuntime
string
`json:"srcmap-runtime"`
Bin
,
SrcMap
,
Abi
,
Devdoc
,
Userdoc
,
Metadata
string
}
Version
string
}
func
(
s
*
Solidity
)
makeArgs
()
[]
string
{
p
:=
[]
string
{
"--combined-json"
,
"bin,bin-runtime,srcmap,srcmap-runtime,abi,userdoc,devdoc"
,
"--optimize"
,
// code optimizer switched on
}
if
s
.
Major
>
0
||
s
.
Minor
>
4
||
s
.
Patch
>
6
{
p
[
1
]
+=
",metadata"
}
return
p
}
// SolidityVersion runs solc and parses its version output.
func
SolidityVersion
(
solc
string
)
(
*
Solidity
,
error
)
{
if
solc
==
""
{
solc
=
"solc"
}
var
out
bytes
.
Buffer
cmd
:=
exec
.
Command
(
solc
,
"--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 solc version %q"
,
out
.
String
())
}
s
:=
&
Solidity
{
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
}
// CompileSolidityString builds and returns all the contracts contained within a source string.
func
CompileSolidityString
(
solc
,
source
string
)
(
map
[
string
]
*
Contract
,
error
)
{
if
len
(
source
)
==
0
{
return
nil
,
errors
.
New
(
"solc: empty source string"
)
}
s
,
err
:=
SolidityVersion
(
solc
)
if
err
!=
nil
{
return
nil
,
err
}
args
:=
append
(
s
.
makeArgs
(),
"--"
)
cmd
:=
exec
.
Command
(
s
.
Path
,
append
(
args
,
"-"
)
...
)
cmd
.
Stdin
=
strings
.
NewReader
(
source
)
return
s
.
run
(
cmd
,
source
)
}
// CompileSolidity compiles all given Solidity source files.
func
CompileSolidity
(
solc
string
,
sourcefiles
...
string
)
(
map
[
string
]
*
Contract
,
error
)
{
if
len
(
sourcefiles
)
==
0
{
return
nil
,
errors
.
New
(
"solc: no source files"
)
}
source
,
err
:=
slurpFiles
(
sourcefiles
)
if
err
!=
nil
{
return
nil
,
err
}
s
,
err
:=
SolidityVersion
(
solc
)
if
err
!=
nil
{
return
nil
,
err
}
args
:=
append
(
s
.
makeArgs
(),
"--"
)
cmd
:=
exec
.
Command
(
s
.
Path
,
append
(
args
,
sourcefiles
...
)
...
)
return
s
.
run
(
cmd
,
source
)
}
func
(
s
*
Solidity
)
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
(
"solc: %v
\n
%s"
,
err
,
stderr
.
Bytes
())
}
return
ParseCombinedJSON
(
stdout
.
Bytes
(),
source
,
s
.
Version
,
s
.
Version
,
strings
.
Join
(
s
.
makeArgs
(),
" "
))
}
// ParseCombinedJSON takes the direct output of a solc --combined-output 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 solc output is expected to contain ABI, source mapping, user docs, and dev docs.
//
// Returns an error if the JSON is malformed or missing data, or if the JSON
// embedded within the JSON is malformed.
func
ParseCombinedJSON
(
combinedJSON
[]
byte
,
source
string
,
languageVersion
string
,
compilerVersion
string
,
compilerOptions
string
)
(
map
[
string
]
*
Contract
,
error
)
{
var
output
solcOutput
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
.
Contracts
{
// Parse the individual compilation results.
var
abi
interface
{}
if
err
:=
json
.
Unmarshal
([]
byte
(
info
.
Abi
),
&
abi
);
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"solc: error reading abi definition (%v)"
,
err
)
}
var
userdoc
interface
{}
if
err
:=
json
.
Unmarshal
([]
byte
(
info
.
Userdoc
),
&
userdoc
);
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"solc: error reading user doc: %v"
,
err
)
}
var
devdoc
interface
{}
if
err
:=
json
.
Unmarshal
([]
byte
(
info
.
Devdoc
),
&
devdoc
);
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"solc: error reading dev doc: %v"
,
err
)
}
contracts
[
name
]
=
&
Contract
{
Code
:
"0x"
+
info
.
Bin
,
RuntimeCode
:
"0x"
+
info
.
BinRuntime
,
Info
:
ContractInfo
{
Source
:
source
,
Language
:
"Solidity"
,
LanguageVersion
:
languageVersion
,
CompilerVersion
:
compilerVersion
,
CompilerOptions
:
compilerOptions
,
SrcMap
:
info
.
SrcMap
,
SrcMapRuntime
:
info
.
SrcMapRuntime
,
AbiDefinition
:
abi
,
UserDoc
:
userdoc
,
DeveloperDoc
:
devdoc
,
Metadata
:
info
.
Metadata
,
},
}
}
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
}
plugin/dapp/evm/commands/compiler/solidity_test.go
0 → 100644
View file @
44ac3a6e
// Copyright 2015 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"
)
const
(
testSource
=
`
pragma solidity >=0.4.18;
contract test {
/// @notice Will multiply `
+
"`a`"
+
` by 7.
function multiply(uint a) public returns(uint d) {
return a * 7;
}
}
`
)
func
skipWithoutSolc
(
t
*
testing
.
T
)
{
if
_
,
err
:=
exec
.
LookPath
(
"solc"
);
err
!=
nil
{
t
.
Skip
(
err
)
}
}
func
TestCompiler
(
t
*
testing
.
T
)
{
skipWithoutSolc
(
t
)
contracts
,
err
:=
CompileSolidityString
(
""
,
testSource
)
if
err
!=
nil
{
t
.
Fatalf
(
"error compiling source. result %v: %v"
,
contracts
,
err
)
}
if
len
(
contracts
)
!=
1
{
t
.
Errorf
(
"one contract expected, got %d"
,
len
(
contracts
))
}
c
,
ok
:=
contracts
[
"test"
]
if
!
ok
{
c
,
ok
=
contracts
[
"<stdin>:test"
]
if
!
ok
{
t
.
Fatal
(
"info for contract 'test' not present in result"
)
}
}
if
c
.
Code
==
""
{
t
.
Error
(
"empty code"
)
}
if
c
.
Info
.
Source
!=
testSource
{
t
.
Error
(
"wrong source"
)
}
if
c
.
Info
.
CompilerVersion
==
""
{
t
.
Error
(
"empty version"
)
}
}
func
TestCompileError
(
t
*
testing
.
T
)
{
skipWithoutSolc
(
t
)
contracts
,
err
:=
CompileSolidityString
(
""
,
testSource
[
4
:
])
if
err
==
nil
{
t
.
Errorf
(
"error expected compiling source. got none. result %v"
,
contracts
)
}
t
.
Logf
(
"error: %v"
,
err
)
}
plugin/dapp/evm/commands/evm.go
View file @
44ac3a6e
...
@@ -7,6 +7,7 @@ package commands
...
@@ -7,6 +7,7 @@ package commands
import
(
import
(
"encoding/hex"
"encoding/hex"
"fmt"
"fmt"
"github.com/33cn/plugin/plugin/dapp/evm/commands/compiler"
"math/rand"
"math/rand"
"os"
"os"
"time"
"time"
...
@@ -203,10 +204,12 @@ func createContractCmd() *cobra.Command {
...
@@ -203,10 +204,12 @@ func createContractCmd() *cobra.Command {
func
addCreateContractFlags
(
cmd
*
cobra
.
Command
)
{
func
addCreateContractFlags
(
cmd
*
cobra
.
Command
)
{
addCommonFlags
(
cmd
)
addCommonFlags
(
cmd
)
cmd
.
MarkFlagRequired
(
"input"
)
cmd
.
Flags
()
.
StringP
(
"alias"
,
"s"
,
""
,
"human readable contract alias name"
)
cmd
.
Flags
()
.
StringP
(
"alias"
,
"s"
,
""
,
"human readable contract alias name"
)
cmd
.
Flags
()
.
StringP
(
"abi"
,
"b"
,
""
,
"bind the abi data"
)
cmd
.
Flags
()
.
StringP
(
"abi"
,
"b"
,
""
,
"bind the abi data"
)
cmd
.
Flags
()
.
StringP
(
"sol"
,
""
,
""
,
"sol file path"
)
cmd
.
Flags
()
.
StringP
(
"solc"
,
""
,
"solc"
,
"solc compiler"
)
}
}
func
createContract
(
cmd
*
cobra
.
Command
,
args
[]
string
)
{
func
createContract
(
cmd
*
cobra
.
Command
,
args
[]
string
)
{
...
@@ -219,15 +222,46 @@ func createContract(cmd *cobra.Command, args []string) {
...
@@ -219,15 +222,46 @@ func createContract(cmd *cobra.Command, args []string) {
rpcLaddr
,
_
:=
cmd
.
Flags
()
.
GetString
(
"rpc_laddr"
)
rpcLaddr
,
_
:=
cmd
.
Flags
()
.
GetString
(
"rpc_laddr"
)
paraName
,
_
:=
cmd
.
Flags
()
.
GetString
(
"paraName"
)
paraName
,
_
:=
cmd
.
Flags
()
.
GetString
(
"paraName"
)
abi
,
_
:=
cmd
.
Flags
()
.
GetString
(
"abi"
)
abi
,
_
:=
cmd
.
Flags
()
.
GetString
(
"abi"
)
sol
,
_
:=
cmd
.
Flags
()
.
GetString
(
"sol"
)
solc
,
_
:=
cmd
.
Flags
()
.
GetString
(
"solc"
)
feeInt64
:=
uint64
(
fee
*
1e4
)
*
1e4
feeInt64
:=
uint64
(
fee
*
1e4
)
*
1e4
bCode
,
err
:=
common
.
FromHex
(
code
)
var
action
evmtypes
.
EVMContractAction
if
err
!=
nil
{
if
!
strings
.
EqualFold
(
sol
,
""
)
{
fmt
.
Fprintln
(
os
.
Stderr
,
"parse evm code error"
,
err
)
if
_
,
err
:=
os
.
Stat
(
sol
);
os
.
IsNotExist
(
err
)
{
return
fmt
.
Fprintln
(
os
.
Stderr
,
"Sol file is not exist."
)
return
}
else
{
contracts
,
err
:=
compiler
.
CompileSolidity
(
solc
,
sol
)
if
err
!=
nil
{
fmt
.
Fprintln
(
os
.
Stderr
,
"Failed to build Solidity contract"
,
err
)
os
.
Exit
(
-
1
)
}
if
len
(
contracts
)
>
1
{
fmt
.
Fprintln
(
os
.
Stderr
,
"There are too many contracts in the sol file."
)
os
.
Exit
(
-
1
)
}
for
_
,
contract
:=
range
contracts
{
abi
,
_
:=
json
.
Marshal
(
contract
.
Info
.
AbiDefinition
)
// Flatten the compiler parse
bCode
,
err
:=
common
.
FromHex
(
contract
.
Code
)
if
err
!=
nil
{
fmt
.
Fprintln
(
os
.
Stderr
,
"parse evm code error"
,
err
)
return
}
action
=
evmtypes
.
EVMContractAction
{
Amount
:
0
,
Code
:
bCode
,
GasLimit
:
0
,
GasPrice
:
0
,
Note
:
note
,
Alias
:
alias
,
Abi
:
string
(
abi
)}
}
}
}
else
{
bCode
,
err
:=
common
.
FromHex
(
code
)
if
err
!=
nil
{
fmt
.
Fprintln
(
os
.
Stderr
,
"parse evm code error"
,
err
)
return
}
action
=
evmtypes
.
EVMContractAction
{
Amount
:
0
,
Code
:
bCode
,
GasLimit
:
0
,
GasPrice
:
0
,
Note
:
note
,
Alias
:
alias
,
Abi
:
abi
}
}
}
action
:=
evmtypes
.
EVMContractAction
{
Amount
:
0
,
Code
:
bCode
,
GasLimit
:
0
,
GasPrice
:
0
,
Note
:
note
,
Alias
:
alias
,
Abi
:
abi
}
data
,
err
:=
createEvmTx
(
&
action
,
types
.
ExecName
(
paraName
+
"evm"
),
caller
,
address
.
ExecAddress
(
types
.
ExecName
(
paraName
+
"evm"
)),
expire
,
rpcLaddr
,
feeInt64
)
data
,
err
:=
createEvmTx
(
&
action
,
types
.
ExecName
(
paraName
+
"evm"
),
caller
,
address
.
ExecAddress
(
types
.
ExecName
(
paraName
+
"evm"
)),
expire
,
rpcLaddr
,
feeInt64
)
...
...
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