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
586eddfd
Commit
586eddfd
authored
Apr 28, 2016
by
Péter Szilágyi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
release, all: integrate the release service into geth
parent
d46da273
Changes
13
Show whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
822 additions
and
109 deletions
+822
-109
backend.go
accounts/abi/bind/backend.go
+3
-2
main.go
cmd/geth/main.go
+37
-22
flags.go
cmd/utils/flags.go
+6
-8
api.go
eth/api.go
+16
-14
backend.go
eth/backend.go
+11
-11
bind.go
eth/bind.go
+110
-0
node.go
node/node.go
+1
-2
service.go
node/service.go
+1
-1
contract.go
release/contract.go
+432
-0
contract.sol
release/contract.sol
+52
-43
contract_test.go
release/contract_test.go
+6
-6
generator.go
release/generator.go
+0
-0
release.go
release/release.go
+147
-0
No files found.
accounts/abi/bind/backend.go
View file @
586eddfd
...
@@ -47,7 +47,8 @@ type ContractCaller interface {
...
@@ -47,7 +47,8 @@ type ContractCaller interface {
// used when the user does not provide some needed values, but rather leaves it up
// used when the user does not provide some needed values, but rather leaves it up
// to the transactor to decide.
// to the transactor to decide.
type
ContractTransactor
interface
{
type
ContractTransactor
interface
{
// Nonce retrieves the current pending nonce associated with an account.
// PendingAccountNonce retrieves the current pending nonce associated with an
// account.
PendingAccountNonce
(
account
common
.
Address
)
(
uint64
,
error
)
PendingAccountNonce
(
account
common
.
Address
)
(
uint64
,
error
)
// SuggestGasPrice retrieves the currently suggested gas price to allow a timely
// SuggestGasPrice retrieves the currently suggested gas price to allow a timely
...
@@ -62,7 +63,7 @@ type ContractTransactor interface {
...
@@ -62,7 +63,7 @@ type ContractTransactor interface {
EstimateGasLimit
(
sender
common
.
Address
,
contract
*
common
.
Address
,
value
*
big
.
Int
,
data
[]
byte
)
(
*
big
.
Int
,
error
)
EstimateGasLimit
(
sender
common
.
Address
,
contract
*
common
.
Address
,
value
*
big
.
Int
,
data
[]
byte
)
(
*
big
.
Int
,
error
)
// SendTransaction injects the transaction into the pending pool for execution.
// SendTransaction injects the transaction into the pending pool for execution.
SendTransaction
(
*
types
.
Transaction
)
error
SendTransaction
(
tx
*
types
.
Transaction
)
error
}
}
// ContractBackend defines the methods needed to allow operating with contract
// ContractBackend defines the methods needed to allow operating with contract
...
...
cmd/geth/main.go
View file @
586eddfd
...
@@ -18,6 +18,7 @@
...
@@ -18,6 +18,7 @@
package
main
package
main
import
(
import
(
"encoding/hex"
"fmt"
"fmt"
"io/ioutil"
"io/ioutil"
"os"
"os"
...
@@ -41,31 +42,48 @@ import (
...
@@ -41,31 +42,48 @@ import (
"github.com/ethereum/go-ethereum/metrics"
"github.com/ethereum/go-ethereum/metrics"
"github.com/ethereum/go-ethereum/node"
"github.com/ethereum/go-ethereum/node"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/release"
"github.com/ethereum/go-ethereum/rlp"
"github.com/ethereum/go-ethereum/rlp"
)
)
const
(
const
(
ClientIdentifier
=
"Geth"
clientIdentifier
=
"Geth"
// Client identifier to advertise over the network
Version
=
"1.5.0-unstable"
versionMajor
=
1
// Major version component of the current release
VersionMajor
=
1
versionMinor
=
5
// Minor version component of the current release
VersionMinor
=
5
versionPatch
=
0
// Patch version component of the current release
VersionPatch
=
0
versionMeta
=
"unstable"
// Version metadata to append to the version string
versionOracle
=
"0x48a117313039b73ab02fb9f73e04a66defe123ec"
// Ethereum address of the Geth release oracle
)
)
var
(
var
(
gitCommit
string
// set via linker flagg
gitCommit
string
// Git SHA1 commit hash of the release (set via linker flags)
nodeNameVersion
string
verString
string
// Combined textual representation of all the version components
relConfig
release
.
Config
// Structured version information and release oracle config
app
*
cli
.
App
app
*
cli
.
App
)
)
func
init
()
{
func
init
()
{
if
gitCommit
==
""
{
// Construct the textual version string from the individual components
nodeNameVersion
=
Version
verString
=
fmt
.
Sprintf
(
"%d.%d.%d"
,
versionMajor
,
versionMinor
,
versionPatch
)
}
else
{
if
versionMeta
!=
""
{
nodeNameVersion
=
Version
+
"-"
+
gitCommit
[
:
8
]
verString
+=
"-"
+
versionMeta
}
if
gitCommit
!=
""
{
verString
+=
"-"
+
gitCommit
[
:
8
]
}
}
// Construct the version release oracle configuration
relConfig
.
Oracle
=
common
.
HexToAddress
(
versionOracle
)
app
=
utils
.
NewApp
(
Version
,
"the go-ethereum command line interface"
)
relConfig
.
Major
=
uint32
(
versionMajor
)
relConfig
.
Minor
=
uint32
(
versionMinor
)
relConfig
.
Patch
=
uint32
(
versionPatch
)
commit
,
_
:=
hex
.
DecodeString
(
gitCommit
)
copy
(
relConfig
.
Commit
[
:
],
commit
)
// Initialize the CLI app and start Geth
app
=
utils
.
NewApp
(
verString
,
"the go-ethereum command line interface"
)
app
.
Action
=
geth
app
.
Action
=
geth
app
.
HideVersion
=
true
// we have a command to print the version
app
.
HideVersion
=
true
// we have a command to print the version
app
.
Commands
=
[]
cli
.
Command
{
app
.
Commands
=
[]
cli
.
Command
{
...
@@ -257,7 +275,7 @@ func makeDefaultExtra() []byte {
...
@@ -257,7 +275,7 @@ func makeDefaultExtra() []byte {
Name
string
Name
string
GoVersion
string
GoVersion
string
Os
string
Os
string
}{
uint
(
VersionMajor
<<
16
|
VersionMinor
<<
8
|
VersionPatch
),
C
lientIdentifier
,
runtime
.
Version
(),
runtime
.
GOOS
}
}{
uint
(
versionMajor
<<
16
|
versionMinor
<<
8
|
versionPatch
),
c
lientIdentifier
,
runtime
.
Version
(),
runtime
.
GOOS
}
extra
,
err
:=
rlp
.
EncodeToBytes
(
clientInfo
)
extra
,
err
:=
rlp
.
EncodeToBytes
(
clientInfo
)
if
err
!=
nil
{
if
err
!=
nil
{
glog
.
V
(
logger
.
Warn
)
.
Infoln
(
"error setting canonical miner information:"
,
err
)
glog
.
V
(
logger
.
Warn
)
.
Infoln
(
"error setting canonical miner information:"
,
err
)
...
@@ -275,7 +293,7 @@ func makeDefaultExtra() []byte {
...
@@ -275,7 +293,7 @@ func makeDefaultExtra() []byte {
// It creates a default node based on the command line arguments and runs it in
// It creates a default node based on the command line arguments and runs it in
// blocking mode, waiting for it to be shut down.
// blocking mode, waiting for it to be shut down.
func
geth
(
ctx
*
cli
.
Context
)
{
func
geth
(
ctx
*
cli
.
Context
)
{
node
:=
utils
.
MakeSystemNode
(
ClientIdentifier
,
nodeNameVersion
,
makeDefaultExtra
(),
ctx
)
node
:=
utils
.
MakeSystemNode
(
clientIdentifier
,
verString
,
relConfig
,
makeDefaultExtra
(),
ctx
)
startNode
(
ctx
,
node
)
startNode
(
ctx
,
node
)
node
.
Wait
()
node
.
Wait
()
}
}
...
@@ -339,7 +357,7 @@ func initGenesis(ctx *cli.Context) {
...
@@ -339,7 +357,7 @@ func initGenesis(ctx *cli.Context) {
// same time.
// same time.
func
console
(
ctx
*
cli
.
Context
)
{
func
console
(
ctx
*
cli
.
Context
)
{
// Create and start the node based on the CLI flags
// Create and start the node based on the CLI flags
node
:=
utils
.
MakeSystemNode
(
ClientIdentifier
,
nodeNameVersion
,
makeDefaultExtra
(),
ctx
)
node
:=
utils
.
MakeSystemNode
(
clientIdentifier
,
verString
,
relConfig
,
makeDefaultExtra
(),
ctx
)
startNode
(
ctx
,
node
)
startNode
(
ctx
,
node
)
// Attach to the newly started node, and either execute script or become interactive
// Attach to the newly started node, and either execute script or become interactive
...
@@ -372,7 +390,7 @@ func console(ctx *cli.Context) {
...
@@ -372,7 +390,7 @@ func console(ctx *cli.Context) {
// of the JavaScript files specified as command arguments.
// of the JavaScript files specified as command arguments.
func
execScripts
(
ctx
*
cli
.
Context
)
{
func
execScripts
(
ctx
*
cli
.
Context
)
{
// Create and start the node based on the CLI flags
// Create and start the node based on the CLI flags
node
:=
utils
.
MakeSystemNode
(
ClientIdentifier
,
nodeNameVersion
,
makeDefaultExtra
(),
ctx
)
node
:=
utils
.
MakeSystemNode
(
clientIdentifier
,
verString
,
relConfig
,
makeDefaultExtra
(),
ctx
)
startNode
(
ctx
,
node
)
startNode
(
ctx
,
node
)
defer
node
.
Stop
()
defer
node
.
Stop
()
...
@@ -488,11 +506,8 @@ func gpubench(ctx *cli.Context) {
...
@@ -488,11 +506,8 @@ func gpubench(ctx *cli.Context) {
}
}
func
version
(
c
*
cli
.
Context
)
{
func
version
(
c
*
cli
.
Context
)
{
fmt
.
Println
(
ClientIdentifier
)
fmt
.
Println
(
clientIdentifier
)
fmt
.
Println
(
"Version:"
,
Version
)
fmt
.
Println
(
"Version:"
,
version
)
if
gitCommit
!=
""
{
fmt
.
Println
(
"Git Commit:"
,
gitCommit
)
}
fmt
.
Println
(
"Protocol Versions:"
,
eth
.
ProtocolVersions
)
fmt
.
Println
(
"Protocol Versions:"
,
eth
.
ProtocolVersions
)
fmt
.
Println
(
"Network Id:"
,
c
.
GlobalInt
(
utils
.
NetworkIdFlag
.
Name
))
fmt
.
Println
(
"Network Id:"
,
c
.
GlobalInt
(
utils
.
NetworkIdFlag
.
Name
))
fmt
.
Println
(
"Go Version:"
,
runtime
.
Version
())
fmt
.
Println
(
"Go Version:"
,
runtime
.
Version
())
...
...
cmd/utils/flags.go
View file @
586eddfd
...
@@ -34,7 +34,6 @@ import (
...
@@ -34,7 +34,6 @@ import (
"github.com/ethereum/ethash"
"github.com/ethereum/ethash"
"github.com/ethereum/go-ethereum/accounts"
"github.com/ethereum/go-ethereum/accounts"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/versions"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/crypto"
...
@@ -49,6 +48,7 @@ import (
...
@@ -49,6 +48,7 @@ import (
"github.com/ethereum/go-ethereum/p2p/nat"
"github.com/ethereum/go-ethereum/p2p/nat"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/pow"
"github.com/ethereum/go-ethereum/pow"
"github.com/ethereum/go-ethereum/release"
"github.com/ethereum/go-ethereum/rpc"
"github.com/ethereum/go-ethereum/rpc"
"github.com/ethereum/go-ethereum/whisper"
"github.com/ethereum/go-ethereum/whisper"
)
)
...
@@ -642,7 +642,7 @@ func MakePasswordList(ctx *cli.Context) []string {
...
@@ -642,7 +642,7 @@ func MakePasswordList(ctx *cli.Context) []string {
// MakeSystemNode sets up a local node, configures the services to launch and
// MakeSystemNode sets up a local node, configures the services to launch and
// assembles the P2P protocol stack.
// assembles the P2P protocol stack.
func
MakeSystemNode
(
name
,
version
string
,
extra
[]
byte
,
ctx
*
cli
.
Context
)
*
node
.
Node
{
func
MakeSystemNode
(
name
,
version
string
,
relconf
release
.
Config
,
extra
[]
byte
,
ctx
*
cli
.
Context
)
*
node
.
Node
{
// Avoid conflicting network flags
// Avoid conflicting network flags
networks
,
netFlags
:=
0
,
[]
cli
.
BoolFlag
{
DevModeFlag
,
TestNetFlag
,
OlympicFlag
}
networks
,
netFlags
:=
0
,
[]
cli
.
BoolFlag
{
DevModeFlag
,
TestNetFlag
,
OlympicFlag
}
for
_
,
flag
:=
range
netFlags
{
for
_
,
flag
:=
range
netFlags
{
...
@@ -773,12 +773,10 @@ func MakeSystemNode(name, version string, extra []byte, ctx *cli.Context) *node.
...
@@ -773,12 +773,10 @@ func MakeSystemNode(name, version string, extra []byte, ctx *cli.Context) *node.
Fatalf
(
"Failed to register the Whisper service: %v"
,
err
)
Fatalf
(
"Failed to register the Whisper service: %v"
,
err
)
}
}
}
}
if
err
:=
stack
.
Register
(
func
(
ctx
*
node
.
ServiceContext
)
(
node
.
Service
,
error
)
{
err
=
stack
.
Register
(
func
(
ctx
*
node
.
ServiceContext
)
(
node
.
Service
,
error
)
{
return
release
.
NewReleaseService
(
ctx
,
relconf
)
return
versions
.
NewVersionCheck
(
ctx
)
});
err
!=
nil
{
})
Fatalf
(
"Failed to register the Geth release oracle service: %v"
,
err
)
if
err
!=
nil
{
Fatalf
(
"Failed to register the Version Check service: %v"
,
err
)
}
}
return
stack
return
stack
}
}
...
...
eth/api.go
View file @
586eddfd
...
@@ -52,14 +52,14 @@ import (
...
@@ -52,14 +52,14 @@ import (
"golang.org/x/net/context"
"golang.org/x/net/context"
)
)
//
E
rrNoCode is returned by call and transact operations for which the requested
//
e
rrNoCode is returned by call and transact operations for which the requested
// recipient contract to operate on does not exist in the state db or does not
// recipient contract to operate on does not exist in the state db or does not
// have any code associated with it (i.e. suicided).
// have any code associated with it (i.e. suicided).
//
//
// Please note, this error string is part of the RPC API and is expected by the
// Please note, this error string is part of the RPC API and is expected by the
// native contract bindings to signal this particular error. Do not change this
// native contract bindings to signal this particular error. Do not change this
// as it will break all dependent code!
// as it will break all dependent code!
var
E
rrNoCode
=
errors
.
New
(
"no contract code at given address"
)
var
e
rrNoCode
=
errors
.
New
(
"no contract code at given address"
)
const
defaultGas
=
uint64
(
90000
)
const
defaultGas
=
uint64
(
90000
)
...
@@ -107,8 +107,11 @@ type PublicEthereumAPI struct {
...
@@ -107,8 +107,11 @@ type PublicEthereumAPI struct {
}
}
// NewPublicEthereumAPI creates a new Ethereum protocol API.
// NewPublicEthereumAPI creates a new Ethereum protocol API.
func
NewPublicEthereumAPI
(
e
*
Ethereum
,
gpo
*
GasPriceOracle
)
*
PublicEthereumAPI
{
func
NewPublicEthereumAPI
(
e
*
Ethereum
)
*
PublicEthereumAPI
{
return
&
PublicEthereumAPI
{
e
,
gpo
}
return
&
PublicEthereumAPI
{
e
:
e
,
gpo
:
e
.
gpo
,
}
}
}
// GasPrice returns a suggestion for a gas price.
// GasPrice returns a suggestion for a gas price.
...
@@ -717,7 +720,7 @@ func (s *PublicBlockChainAPI) doCall(args CallArgs, blockNr rpc.BlockNumber) (st
...
@@ -717,7 +720,7 @@ func (s *PublicBlockChainAPI) doCall(args CallArgs, blockNr rpc.BlockNumber) (st
// If there's no code to interact with, respond with an appropriate error
// If there's no code to interact with, respond with an appropriate error
if
args
.
To
!=
nil
{
if
args
.
To
!=
nil
{
if
code
:=
stateDb
.
GetCode
(
*
args
.
To
);
len
(
code
)
==
0
{
if
code
:=
stateDb
.
GetCode
(
*
args
.
To
);
len
(
code
)
==
0
{
return
"0x"
,
nil
,
E
rrNoCode
return
"0x"
,
nil
,
e
rrNoCode
}
}
}
}
// Retrieve the account state object to interact with
// Retrieve the account state object to interact with
...
@@ -914,18 +917,17 @@ type PublicTransactionPoolAPI struct {
...
@@ -914,18 +917,17 @@ type PublicTransactionPoolAPI struct {
}
}
// NewPublicTransactionPoolAPI creates a new RPC service with methods specific for the transaction pool.
// NewPublicTransactionPoolAPI creates a new RPC service with methods specific for the transaction pool.
func
NewPublicTransactionPoolAPI
(
e
*
Ethereum
,
gpo
*
GasPriceOracle
)
*
PublicTransactionPoolAPI
{
func
NewPublicTransactionPoolAPI
(
e
*
Ethereum
)
*
PublicTransactionPoolAPI
{
api
:=
&
PublicTransactionPoolAPI
{
api
:=
&
PublicTransactionPoolAPI
{
eventMux
:
e
.
EventMux
()
,
eventMux
:
e
.
eventMux
,
gpo
:
gpo
,
gpo
:
e
.
gpo
,
chainDb
:
e
.
ChainDb
()
,
chainDb
:
e
.
chainDb
,
bc
:
e
.
BlockChain
()
,
bc
:
e
.
blockchain
,
am
:
e
.
AccountManager
()
,
am
:
e
.
accountManager
,
txPool
:
e
.
TxPool
()
,
txPool
:
e
.
txPool
,
miner
:
e
.
Miner
()
,
miner
:
e
.
miner
,
pendingTxSubs
:
make
(
map
[
string
]
rpc
.
Subscription
),
pendingTxSubs
:
make
(
map
[
string
]
rpc
.
Subscription
),
}
}
go
api
.
subscriptionLoop
()
go
api
.
subscriptionLoop
()
return
api
return
api
...
...
eth/backend.go
View file @
586eddfd
...
@@ -119,6 +119,7 @@ type Ethereum struct {
...
@@ -119,6 +119,7 @@ type Ethereum struct {
protocolManager
*
ProtocolManager
protocolManager
*
ProtocolManager
SolcPath
string
SolcPath
string
solc
*
compiler
.
Solidity
solc
*
compiler
.
Solidity
gpo
*
GasPriceOracle
GpoMinGasPrice
*
big
.
Int
GpoMinGasPrice
*
big
.
Int
GpoMaxGasPrice
*
big
.
Int
GpoMaxGasPrice
*
big
.
Int
...
@@ -260,6 +261,8 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
...
@@ -260,6 +261,8 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
}
}
return
nil
,
err
return
nil
,
err
}
}
eth
.
gpo
=
NewGasPriceOracle
(
eth
)
newPool
:=
core
.
NewTxPool
(
eth
.
chainConfig
,
eth
.
EventMux
(),
eth
.
blockchain
.
State
,
eth
.
blockchain
.
GasLimit
)
newPool
:=
core
.
NewTxPool
(
eth
.
chainConfig
,
eth
.
EventMux
(),
eth
.
blockchain
.
State
,
eth
.
blockchain
.
GasLimit
)
eth
.
txPool
=
newPool
eth
.
txPool
=
newPool
...
@@ -276,34 +279,31 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
...
@@ -276,34 +279,31 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
// APIs returns the collection of RPC services the ethereum package offers.
// APIs returns the collection of RPC services the ethereum package offers.
// NOTE, some of these services probably need to be moved to somewhere else.
// NOTE, some of these services probably need to be moved to somewhere else.
func
(
s
*
Ethereum
)
APIs
()
[]
rpc
.
API
{
func
(
s
*
Ethereum
)
APIs
()
[]
rpc
.
API
{
// share gas price oracle in API's
gpo
:=
NewGasPriceOracle
(
s
)
return
[]
rpc
.
API
{
return
[]
rpc
.
API
{
{
{
Namespace
:
"eth"
,
Namespace
:
"eth"
,
Version
:
"1.0"
,
Version
:
"1.0"
,
Service
:
NewPublicEthereumAPI
(
s
,
gpo
),
Service
:
NewPublicEthereumAPI
(
s
),
Public
:
true
,
Public
:
true
,
},
{
},
{
Namespace
:
"eth"
,
Namespace
:
"eth"
,
Version
:
"1.0"
,
Version
:
"1.0"
,
Service
:
NewPublicAccountAPI
(
s
.
AccountManager
()
),
Service
:
NewPublicAccountAPI
(
s
.
accountManager
),
Public
:
true
,
Public
:
true
,
},
{
},
{
Namespace
:
"personal"
,
Namespace
:
"personal"
,
Version
:
"1.0"
,
Version
:
"1.0"
,
Service
:
NewPrivateAccountAPI
(
s
.
AccountManager
()
),
Service
:
NewPrivateAccountAPI
(
s
.
accountManager
),
Public
:
false
,
Public
:
false
,
},
{
},
{
Namespace
:
"eth"
,
Namespace
:
"eth"
,
Version
:
"1.0"
,
Version
:
"1.0"
,
Service
:
NewPublicBlockChainAPI
(
s
.
chainConfig
,
s
.
BlockChain
(),
s
.
Miner
(),
s
.
ChainDb
(),
gpo
,
s
.
EventMux
(),
s
.
AccountManager
()
),
Service
:
NewPublicBlockChainAPI
(
s
.
chainConfig
,
s
.
blockchain
,
s
.
miner
,
s
.
chainDb
,
s
.
gpo
,
s
.
eventMux
,
s
.
accountManager
),
Public
:
true
,
Public
:
true
,
},
{
},
{
Namespace
:
"eth"
,
Namespace
:
"eth"
,
Version
:
"1.0"
,
Version
:
"1.0"
,
Service
:
NewPublicTransactionPoolAPI
(
s
,
gpo
),
Service
:
NewPublicTransactionPoolAPI
(
s
),
Public
:
true
,
Public
:
true
,
},
{
},
{
Namespace
:
"eth"
,
Namespace
:
"eth"
,
...
@@ -313,7 +313,7 @@ func (s *Ethereum) APIs() []rpc.API {
...
@@ -313,7 +313,7 @@ func (s *Ethereum) APIs() []rpc.API {
},
{
},
{
Namespace
:
"eth"
,
Namespace
:
"eth"
,
Version
:
"1.0"
,
Version
:
"1.0"
,
Service
:
downloader
.
NewPublicDownloaderAPI
(
s
.
Downloader
(),
s
.
EventMux
()
),
Service
:
downloader
.
NewPublicDownloaderAPI
(
s
.
protocolManager
.
downloader
,
s
.
eventMux
),
Public
:
true
,
Public
:
true
,
},
{
},
{
Namespace
:
"miner"
,
Namespace
:
"miner"
,
...
@@ -328,7 +328,7 @@ func (s *Ethereum) APIs() []rpc.API {
...
@@ -328,7 +328,7 @@ func (s *Ethereum) APIs() []rpc.API {
},
{
},
{
Namespace
:
"eth"
,
Namespace
:
"eth"
,
Version
:
"1.0"
,
Version
:
"1.0"
,
Service
:
filters
.
NewPublicFilterAPI
(
s
.
ChainDb
(),
s
.
EventMux
()
),
Service
:
filters
.
NewPublicFilterAPI
(
s
.
chainDb
,
s
.
eventMux
),
Public
:
true
,
Public
:
true
,
},
{
},
{
Namespace
:
"admin"
,
Namespace
:
"admin"
,
...
@@ -351,7 +351,7 @@ func (s *Ethereum) APIs() []rpc.API {
...
@@ -351,7 +351,7 @@ func (s *Ethereum) APIs() []rpc.API {
},
{
},
{
Namespace
:
"admin"
,
Namespace
:
"admin"
,
Version
:
"1.0"
,
Version
:
"1.0"
,
Service
:
ethreg
.
NewPrivateRegistarAPI
(
s
.
chainConfig
,
s
.
BlockChain
(),
s
.
ChainDb
(),
s
.
TxPool
(),
s
.
AccountManager
()
),
Service
:
ethreg
.
NewPrivateRegistarAPI
(
s
.
chainConfig
,
s
.
blockchain
,
s
.
chainDb
,
s
.
txPool
,
s
.
accountManager
),
},
},
}
}
}
}
...
...
eth/bind.go
0 → 100644
View file @
586eddfd
// Copyright 2016 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
eth
import
(
"math/big"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/rlp"
"github.com/ethereum/go-ethereum/rpc"
)
// ContractBackend implements bind.ContractBackend with direct calls to Ethereum
// internals to support operating on contracts within subprotocols like eth and
// swarm.
//
// Internally this backend uses the already exposed API endpoints of the Ethereum
// object. These should be rewritten to internal Go method calls when the Go API
// is refactored to support a clean library use.
type
ContractBackend
struct
{
eapi
*
PublicEthereumAPI
// Wrapper around the Ethereum object to access metadata
bcapi
*
PublicBlockChainAPI
// Wrapper around the blockchain to access chain data
txapi
*
PublicTransactionPoolAPI
// Wrapper around the transaction pool to access transaction data
}
// NewContractBackend creates a new native contract backend using an existing
// Etheruem object.
func
NewContractBackend
(
eth
*
Ethereum
)
*
ContractBackend
{
return
&
ContractBackend
{
eapi
:
NewPublicEthereumAPI
(
eth
),
bcapi
:
NewPublicBlockChainAPI
(
eth
.
chainConfig
,
eth
.
blockchain
,
eth
.
miner
,
eth
.
chainDb
,
eth
.
gpo
,
eth
.
eventMux
,
eth
.
accountManager
),
txapi
:
NewPublicTransactionPoolAPI
(
eth
),
}
}
// ContractCall implements bind.ContractCaller executing an Ethereum contract
// call with the specified data as the input. The pending flag requests execution
// against the pending block, not the stable head of the chain.
func
(
b
*
ContractBackend
)
ContractCall
(
contract
common
.
Address
,
data
[]
byte
,
pending
bool
)
([]
byte
,
error
)
{
// Convert the input args to the API spec
args
:=
CallArgs
{
To
:
&
contract
,
Data
:
common
.
ToHex
(
data
),
}
block
:=
rpc
.
LatestBlockNumber
if
pending
{
block
=
rpc
.
PendingBlockNumber
}
// Execute the call and convert the output back to Go types
out
,
err
:=
b
.
bcapi
.
Call
(
args
,
block
)
if
err
==
errNoCode
{
err
=
bind
.
ErrNoCode
}
return
common
.
FromHex
(
out
),
err
}
// PendingAccountNonce implements bind.ContractTransactor retrieving the current
// pending nonce associated with an account.
func
(
b
*
ContractBackend
)
PendingAccountNonce
(
account
common
.
Address
)
(
uint64
,
error
)
{
out
,
err
:=
b
.
txapi
.
GetTransactionCount
(
account
,
rpc
.
PendingBlockNumber
)
return
out
.
Uint64
(),
err
}
// SuggestGasPrice implements bind.ContractTransactor retrieving the currently
// suggested gas price to allow a timely execution of a transaction.
func
(
b
*
ContractBackend
)
SuggestGasPrice
()
(
*
big
.
Int
,
error
)
{
return
b
.
eapi
.
GasPrice
(),
nil
}
// EstimateGasLimit implements bind.ContractTransactor triing to estimate the gas
// needed to execute a specific transaction based on the current pending state of
// the backend blockchain. There is no guarantee that this is the true gas limit
// requirement as other transactions may be added or removed by miners, but it
// should provide a basis for setting a reasonable default.
func
(
b
*
ContractBackend
)
EstimateGasLimit
(
sender
common
.
Address
,
contract
*
common
.
Address
,
value
*
big
.
Int
,
data
[]
byte
)
(
*
big
.
Int
,
error
)
{
out
,
err
:=
b
.
bcapi
.
EstimateGas
(
CallArgs
{
From
:
sender
,
To
:
contract
,
Value
:
*
rpc
.
NewHexNumber
(
value
),
Data
:
common
.
ToHex
(
data
),
})
if
err
==
errNoCode
{
err
=
bind
.
ErrNoCode
}
return
out
.
BigInt
(),
err
}
// SendTransaction implements bind.ContractTransactor injects the transaction
// into the pending pool for execution.
func
(
b
*
ContractBackend
)
SendTransaction
(
tx
*
types
.
Transaction
)
error
{
raw
,
_
:=
rlp
.
EncodeToBytes
(
tx
)
_
,
err
:=
b
.
txapi
.
SendRawTransaction
(
common
.
ToHex
(
raw
))
return
err
}
node/node.go
View file @
586eddfd
...
@@ -311,7 +311,7 @@ func (n *Node) startIPC(apis []rpc.API) error {
...
@@ -311,7 +311,7 @@ func (n *Node) startIPC(apis []rpc.API) error {
glog
.
V
(
logger
.
Error
)
.
Infof
(
"IPC accept failed: %v"
,
err
)
glog
.
V
(
logger
.
Error
)
.
Infof
(
"IPC accept failed: %v"
,
err
)
continue
continue
}
}
go
handler
.
ServeCodec
(
rpc
.
NewJSONCodec
(
conn
),
rpc
.
OptionMethodInvocation
|
rpc
.
OptionSubscriptions
)
go
handler
.
ServeCodec
(
rpc
.
NewJSONCodec
(
conn
),
rpc
.
OptionMethodInvocation
|
rpc
.
OptionSubscriptions
)
}
}
}()
}()
// All listeners booted successfully
// All listeners booted successfully
...
@@ -530,7 +530,6 @@ func (n *Node) Server() *p2p.Server {
...
@@ -530,7 +530,6 @@ func (n *Node) Server() *p2p.Server {
}
}
// Service retrieves a currently running service registered of a specific type.
// Service retrieves a currently running service registered of a specific type.
// NOTE: must be called with double pointer to service
func
(
n
*
Node
)
Service
(
service
interface
{})
error
{
func
(
n
*
Node
)
Service
(
service
interface
{})
error
{
n
.
lock
.
RLock
()
n
.
lock
.
RLock
()
defer
n
.
lock
.
RUnlock
()
defer
n
.
lock
.
RUnlock
()
...
...
node/service.go
View file @
586eddfd
...
@@ -68,7 +68,7 @@ type ServiceConstructor func(ctx *ServiceContext) (Service, error)
...
@@ -68,7 +68,7 @@ type ServiceConstructor func(ctx *ServiceContext) (Service, error)
// - Restart logic is not required as the node will create a fresh instance
// - Restart logic is not required as the node will create a fresh instance
// every time a service is started.
// every time a service is started.
type
Service
interface
{
type
Service
interface
{
// Protocol retrieves the P2P protocols the service wishes to start.
// Protocol
s
retrieves the P2P protocols the service wishes to start.
Protocols
()
[]
p2p
.
Protocol
Protocols
()
[]
p2p
.
Protocol
// APIs retrieves the list of RPC descriptors the service provides
// APIs retrieves the list of RPC descriptors the service provides
...
...
contracts/
release/contract.go
→
release/contract.go
View file @
586eddfd
...
@@ -14,18 +14,18 @@ import (
...
@@ -14,18 +14,18 @@ import (
)
)
// ReleaseOracleABI is the input ABI used to generate the binding from.
// ReleaseOracleABI is the input ABI used to generate the binding from.
const
ReleaseOracleABI
=
`[{"constant":
false,"inputs":[],"name":"Nuke","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"major","type":"uint32"},{"name":"minor","type":"uint32"},{"name":"patch","type":"uint32"},{"name":"commit","type":"bytes20"}],"name":"Release","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"AuthProposals","outputs":[{"name":"","type":"address[]"}],"type":"function"},{"constant":true,"inputs":[],"name":"CurrentVersion","outputs":[{"name":"major","type":"uint32"},{"name":"minor","type":"uint32"},{"name":"patch","type":"uint32"},{"name":"commit","type":"bytes20"},{"name":"time","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"ProposedVersion","outputs":[{"name":"major","type":"uint32"},{"name":"minor","type":"uint32"},{"name":"patch","type":"uint32"},{"name":"commit","type":"bytes20"},{"name":"pass","type":"address[]"},{"name":"fail","type":"address[]"}],"type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"}],"name":"Promote","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"major","type":"uint32"},{"name":"minor","type":"uint32"},{"name":"patch","type":"uint32"},{"name":"commit","type":"bytes20"},{"name":"release","type":"bool"}],"name":"updateRelease","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"}],"name":"Demote","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"user","type":"address"}],"name":"AuthVotes","outputs":[{"name":"promote","type":"address[]"},{"name":"demote","type":"address[]"}],"type":"function"},{"constant":true,"inputs":[],"name":"Signers","outputs":[{"name":"","type":"address[]"}],"type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"},{"name":"authorize","type":"bool"}],"name":"updateSigner","outputs":[],"type":"function"},{"inputs":[
],"type":"constructor"}]`
const
ReleaseOracleABI
=
`[{"constant":
true,"inputs":[],"name":"proposedVersion","outputs":[{"name":"major","type":"uint32"},{"name":"minor","type":"uint32"},{"name":"patch","type":"uint32"},{"name":"commit","type":"bytes20"},{"name":"pass","type":"address[]"},{"name":"fail","type":"address[]"}],"type":"function"},{"constant":true,"inputs":[],"name":"signers","outputs":[{"name":"","type":"address[]"}],"type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"}],"name":"demote","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"user","type":"address"}],"name":"authVotes","outputs":[{"name":"promote","type":"address[]"},{"name":"demote","type":"address[]"}],"type":"function"},{"constant":true,"inputs":[],"name":"currentVersion","outputs":[{"name":"major","type":"uint32"},{"name":"minor","type":"uint32"},{"name":"patch","type":"uint32"},{"name":"commit","type":"bytes20"},{"name":"time","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[],"name":"nuke","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"authProposals","outputs":[{"name":"","type":"address[]"}],"type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"}],"name":"promote","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"major","type":"uint32"},{"name":"minor","type":"uint32"},{"name":"patch","type":"uint32"},{"name":"commit","type":"bytes20"}],"name":"release","outputs":[],"type":"function"},{"inputs":[{"name":"signers","type":"address[]"}
],"type":"constructor"}]`
// ReleaseOracleBin is the compiled bytecode used for deploying new contracts.
// ReleaseOracleBin is the compiled bytecode used for deploying new contracts.
const
ReleaseOracleBin
=
`0x606060405260
0160a060020a0333166000908152602081905260409020805460ff1916600190811790915580548082018083558281838015829011606257818360005260206000209182019101606291905b808211156094576000815584016051565b505050919090600052602060002090016000508054600160a060020a0319163317905550611262806100986000396000f35b5090566060604052361561008d5760e060020a60003504630443b1ad811461008f5780630d618178146100a0578063282fe4e5146100bd5780632b225f291461012c5780634c327071146101515780636195db9c14610276578063645dce721461028757806380bbbd4a146102d6578063a29226f2146102e7578063f04c4758146103e1578063f460590b1461044d575b005b61008d61072060008080808061029a565b61008d60043560243560443560643561071a84848484600161029a565b6104d360408051602081810183526000825282516003805480840283018401909552848252929390929183018282801561044257602002820191906000526020600020908154600160a060020a0316815260019190910190602001808311610423575b5050505050905061044a565b61051d600060006000600060006000600860005080549050600014156106895761070a565b610551604080516020818101835260008083528351808301855281815260045460068054875181870281018701909852808852939687968796879691959463ffffffff818116956401000000008304821695604060020a840490921694606060020a93849004909302939092600792918491908301828280156101fe57602002820191906000526020600020905b8154600160a060020a03168152600191909101906020018083116101df575b505050505091508080548060200260200160405190810160405280929190818152602001828054801561025b57602002820191906000526020600020905b8154600160a060020a031681526001919091019060200180831161023c575b50505050509050955095509550955095509550909192939495565b61008d600435610712816001610457565b61008d6004356024356044356064356084355b600160a060020a033316600090815260208190526040812054819060ff16156111f957821580156102cc575060065481145b15610c81576111f9565b61008d600435610712816000610457565b6106046004356040805160208181018352600080835283518083018552818152600160a060020a038616825260028352908490208054855181850281018501909652808652939491939092600184019291849183018282801561037457602002820191906000526020600020905b8154600160a060020a0316815260019190910190602001808311610355575b50505050509150808054806020026020016040519081016040528092919081815260200182805480156103d157602002820191906000526020600020905b8154600160a060020a03168152600191909101906020018083116103b2575b5050505050905091509150915091565b604080516020818101835260008252600180548451818402810184019095528085526104d3949283018282801561044257602002820191906000526020600020905b8154600160a060020a0316815260019190910190602001808311610423575b505050505090505b90565b61008d6004356024355b600160a060020a033316600090815260208190526040812054819060ff161561071a57600160a060020a038416815260026020526040812091505b8154811015610722578154600160a060020a033316908390839081101561000257600091825260209091200154600160a060020a0316141561076d5761071a565b60405180806020018281038252838181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050019250505060405180910390f35b6040805163ffffffff9687168152948616602086015294909216838501526060830152608082015290519081900360a00190f35b604051808763ffffffff1681526020018663ffffffff1681526020018563ffffffff16815260200184815260200180602001806020018381038352858181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050018381038252848181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050019850505050505050505060405180910390f35b6040518080602001806020018381038352858181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050018381038252848181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f15090500194505050505060405180910390f35b600880546000198101908110156100025760009182526004027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30190508054600182015463ffffffff8281169950640100000000830481169850604060020a8304169650606060020a91829004909102945067ffffffffffffffff16925090505b509091929394565b50565b505050505b50505050565b565b5060005b60018201548110156107755733600160a060020a03168260010160005082815481101561000257600091825260209091200154600160a060020a031614156107bf5761071a565b600101610492565b8154600014801561078a575060018201546000145b156107e757600380546001810180835582818380158290116107c7578183600052602060002091820191016107c7919061086d565b600101610726565b5050506000928352506020909120018054600160a060020a031916851790555b82156108855781546001810180845583919082818380158290116108ba576000838152602090206108ba91810190830161086d565b5050506000928352506020909120018054600160a060020a031916851790555b600160a060020a038416600090815260026020908152604082208054838255818452918320909291610b6991908101905b80821115610881576000815560010161086d565b5090565b81600101600050805480600101828181548183558181151161097657818360005260206000209182019101610976919061086d565b5050506000928352506020909120018054600160a060020a031916331790556001548254600290910490116108ee5761071a565b8280156109145750600160a060020a03841660009081526020819052604090205460ff16155b156109ad57600160a060020a0384166000908152602081905260409020805460ff191660019081179091558054808201808355828183801582901161081c57600083905261081c9060008051602061124283398151915290810190830161086d565b5050506000928352506020909120018054600160a060020a031916331790556001805490830154600290910490116108ee5761071a565b821580156109d35750600160a060020a03841660009081526020819052604090205460ff165b1561083c5750600160a060020a0383166000908152602081905260408120805460ff191690555b60015481101561083c5783600160a060020a03166001600050828154811015610002576000919091526000805160206112428339815191520154600160a060020a03161415610add576001805460001981019081101561000257600091825260008051602061124283398151915201909054906101000a9004600160a060020a0316600160005082815481101561000257600080516020611242833981519152018054600160a060020a03191690921790915580546000198101808355909190828015829011610ae557818360005260206000209182019101610ae5919061086d565b6001016109fa565b5050600060048181556005805467ffffffffffffffff19169055600680548382558184529194509192508290610b3f907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f9081019061086d565b5060018201805460008083559182526020909120610b5f9181019061086d565b505050505061083c565b5060018201805460008083559182526020909120610b899181019061086d565b506000925050505b60035481101561071a5783600160a060020a03166003600050828154811015610002576000919091526000805160206112228339815191520154600160a060020a03161415610c79576003805460001981019081101561000257600091825260008051602061122283398151915201909054906101000a9004600160a060020a0316600360005082815481101561000257600080516020611222833981519152018054600160a060020a03191690921790915580546000198101808355909190828015829011610715576107159060008051602061122283398151915290810190830161086d565b600101610b91565b60065460001415610cdf576004805463ffffffff1916881767ffffffff0000000019166401000000008802176bffffffff00000000000000001916604060020a8702176bffffffffffffffffffffffff16606060020a808704021790555b828015610d49575060045463ffffffff8881169116141580610d155750600454640100000000900463ffffffff90811690871614155b80610d32575060045463ffffffff808716604060020a9092041614155b80610d495750600454606060020a90819004028414155b15610d53576111f9565b506006905060005b8154811015610d9c578154600160a060020a033316908390839081101561000257600091825260209091200154600160a060020a03161415610de7576111f9565b5060005b6001820154811015610def5733600160a060020a03168260010160005082815481101561000257600091825260209091200154600160a060020a03161415610e26576111f9565b600101610d5b565b8215610e2e578154600181018084558391908281838015829011610e6357818360005260206000209182019101610e63919061086d565b600101610da0565b816001016000508054806001018281815481835581811511610ee657818360005260206000209182019101610ee6919061086d565b5050506000928352506020909120018054600160a060020a03191633179055600154825460029091049011610e97576111f9565b8215610f1d576005805467ffffffffffffffff19164217905560088054600181018083558281838015829011610f7257600402816004028360005260206000209182019101610f72919061108b565b5050506000928352506020909120018054600160a060020a03191633179055600180549083015460029091049011610e97576111f9565b600060048181556005805467ffffffffffffffff19169055600680548382558184529192918290611202907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f9081019061086d565b5050509190906000526020600020906004020160005060048054825463ffffffff191663ffffffff9182161780845582546401000000009081900483160267ffffffff000000001991909116178084558254604060020a908190049092169091026bffffffff00000000000000001991909116178083558154606060020a908190048102819004026bffffffffffffffffffffffff9190911617825560055460018301805467ffffffffffffffff191667ffffffffffffffff9092169190911790556006805460028401805482825560008281526020902094959491928392918201918582156110ea5760005260206000209182015b828111156110ea578254825591600101919060010190611068565b505050506001015b8082111561088157600080825560018201805467ffffffffffffffff191690556002820180548282558183526020832083916110ca919081019061086d565b50600182018054600080835591825260209091206110839181019061086d565b506111109291505b80821115610881578054600160a060020a03191681556001016110f2565b505060018181018054918401805480835560008381526020902092938301929091821561115e5760005260206000209182015b8281111561115e578254825591600101919060010190611143565b5061116a9291506110f2565b5050600060048181556005805467ffffffffffffffff19169055600680548382558184529197509195509093508492506111c991507ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f9081019061086d565b50600182018054600080835591825260209091206111e99181019061086d565b50505050506111f9565b50505050505b50505050505050565b50600182018054600080835591825260209091206111f39181019061086d56c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b
b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6`
const
ReleaseOracleBin
=
`0x606060405260
40516114033803806114038339810160405280510160008151600014156100ce57600160a060020a0333168152602081905260408120805460ff191660019081179091558054808201808355828183801582901161015e5781836000526020600020918201910161015e91905b8082111561019957600081558401610072565b505050919090600052602060002090016000848481518110156100025790602001906020020151909190916101000a815481600160a060020a0302191690830217905550506001015b815181101561018957600160006000506000848481518110156100025790602001906020020151600160a060020a0316815260200190815260200160002060006101000a81548160ff0219169083021790555060016000508054806001018281815481835581811511610085576000839052610085906000805160206113e3833981519152908101908301610072565b5050506000929092526000805160206113e3833981519152018054600160a060020a03191633179055505b50506112458061019e6000396000f35b50905600606060405236156100775760e060020a600035046326db7648811461007957806346f0975a1461019e5780635c3d005d1461020a57806364ed31fe146102935780639d888e861461038d578063bc8fbbf8146103b2578063bf8ecf9c146103fb578063d0e0813a14610467578063d67cbec914610478575b005b610495604080516020818101835260008083528351808301855281815260045460068054875181870281018701909852808852939687968796879691959463ffffffff818116956401000000008304821695604060020a840490921694606060020a938490049093029390926007929184919083018282801561012657602002820191906000526020600020905b8154600160a060020a0316815260019190910190602001808311610107575b505050505091508080548060200260200160405190810160405280929190818152602001828054801561018357602002820191906000526020600020905b8154600160a060020a0316815260019190910190602001808311610164575b50505050509050955095509550955095509550909192939495565b6040805160208181018352600082526001805484518184028101840190955280855261054894928301828280156101ff57602002820191906000526020600020905b8154600160a060020a03168152600191909101906020018083116101e0575b505050505090505b90565b6100776004356106d78160005b600160a060020a033316600090815260208190526040812054819060ff16156106df57600160a060020a038416815260026020526040812091505b81548110156106e7578154600160a060020a033316908390839081101561000257600091825260209091200154600160a060020a03161415610732576106df565b6105926004356040805160208181018352600080835283518083018552818152600160a060020a038616825260028352908490208054855181850281018501909652808652939491939092600184019291849183018282801561032057602002820191906000526020600020905b8154600160a060020a0316815260019190910190602001808311610301575b505050505091508080548060200260200160405190810160405280929190818152602001828054801561037d57602002820191906000526020600020905b8154600160a060020a031681526001919091019060200180831161035e575b5050505050905091509150915091565b6106176000600060006000600060006008600050805490506000141561064e576106cf565b6100776106e56000808080805b600160a060020a033316600090815260208190526040812054819060ff161561121c57821580156103f1575060065481145b15610ca55761121c565b6040805160208181018352600082526003805484518184028101840190955280855261054894928301828280156101ff57602002820191906000526020600020908154600160a060020a03168152600191909101906020018083116101e0575b50505050509050610207565b6100776004356106d7816001610217565b6100776004356024356044356064356106df8484848460016103bf565b604051808763ffffffff1681526020018663ffffffff1681526020018563ffffffff16815260200184815260200180602001806020018381038352858181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050018381038252848181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050019850505050505050505060405180910390f35b60405180806020018281038252838181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050019250505060405180910390f35b6040518080602001806020018381038352858181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050018381038252848181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f15090500194505050505060405180910390f35b6040805163ffffffff9687168152948616602086015292909416838301526060830152608082019290925290519081900360a00190f35b600880546000198101908110156100025760009182526004027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30190508054600182015463ffffffff8281169950640100000000830481169850604060020a8304169650606060020a91829004909102945067ffffffffffffffff16925090505b509091929394565b50565b505050505b50505050565b565b5060005b600182015481101561073a5733600160a060020a03168260010160005082815481101561000257600091825260209091200154600160a060020a03161415610784576106df565b600101610252565b8154600014801561074f575060018201546000145b156107ac576003805460018101808355828183801582901161078c5781836000526020600020918201910161078c9190610834565b6001016106eb565b5050506000928352506020909120018054600160a060020a031916851790555b821561084c578154600181018084558391908281838015829011610881578183600052602060002091820191016108819190610834565b5050506000928352506020909120018054600160a060020a031916851790555b600160a060020a038416600090815260026020908152604082208054838255818452918320909291610b5c91908101905b808211156108485760008155600101610834565b5090565b816001016000508054806001018281815481835581811511610933578183600052602060002091820191016109339190610834565b5050506000928352506020909120018054600160a060020a031916331790556001548254600290910490116108b5576106df565b8280156108db5750600160a060020a03841660009081526020819052604090205460ff16155b1561096a57600160a060020a0384166000908152602081905260409020805460ff19166001908117909155805480820180835582818380158290116107e3578183600052602060002091820191016107e39190610834565b5050506000928352506020909120018054600160a060020a031916331790556001805490830154600290910490116108b5576106df565b821580156109905750600160a060020a03841660009081526020819052604090205460ff165b156108035750600160a060020a0383166000908152602081905260408120805460ff191690555b6001548110156108035783600160a060020a03166001600050828154811015610002576000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60154600160a060020a03161415610ad057600180546000198101908110156100025760009182527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601909054906101000a9004600160a060020a03166001600050828154811015610002577fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6018054600160a060020a03191690921790915580546000198101808355909190828015829011610ad857818360005260206000209182019101610ad89190610834565b6001016109b7565b5050600060048181556005805467ffffffffffffffff19169055600680548382558184529194509192508290610b32907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90810190610834565b5060018201805460008083559182526020909120610b5291810190610834565b5050505050610803565b5060018201805460008083559182526020909120610b7c91810190610834565b506000925050505b6003548110156106df5783600160a060020a03166003600050828154811015610002576000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0154600160a060020a03161415610c9d57600380546000198101908110156100025760009182527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b01909054906101000a9004600160a060020a03166003600050828154811015610002577fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b018054600160a060020a031916909217909155805460001981018083559091908280158290116106da578183600052602060002091820191016106da9190610834565b600101610b84565b60065460001415610d03576004805463ffffffff1916881767ffffffff0000000019166401000000008802176bffffffff00000000000000001916604060020a8702176bffffffffffffffffffffffff16606060020a808704021790555b828015610d6d575060045463ffffffff8881169116141580610d395750600454640100000000900463ffffffff90811690871614155b80610d56575060045463ffffffff868116604060020a9092041614155b80610d6d5750600454606060020a90819004028414155b15610d775761121c565b506006905060005b8154811015610dc0578154600160a060020a033316908390839081101561000257600091825260209091200154600160a060020a03161415610e0b5761121c565b5060005b6001820154811015610e135733600160a060020a03168260010160005082815481101561000257600091825260209091200154600160a060020a03161415610e485761121c565b600101610d7f565b8215610e50578154600181018084558391908281838015829011610e8557600083815260209020610e85918101908301610834565b600101610dc4565b816001016000508054806001018281815481835581811511610f0857818360005260206000209182019101610f089190610834565b5050506000928352506020909120018054600160a060020a03191633179055600154825460029091049011610eb95761121c565b8215610f3f576005805467ffffffffffffffff19164217905560088054600181018083558281838015829011610f9457600402816004028360005260206000209182019101610f9491906110ae565b5050506000928352506020909120018054600160a060020a03191633179055600180549083015460029091049011610eb95761121c565b600060048181556005805467ffffffffffffffff19169055600680548382558184529192918290611225907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90810190610834565b5050509190906000526020600020906004020160005060048054825463ffffffff191663ffffffff9182161780845582546401000000009081900483160267ffffffff000000001991909116178084558254604060020a908190049092169091026bffffffff00000000000000001991909116178083558154606060020a908190048102819004026bffffffffffffffffffffffff9190911617825560055460018301805467ffffffffffffffff191667ffffffffffffffff9290921691909117905560068054600284018054828255600082815260209020949594919283929182019185821561110d5760005260206000209182015b8281111561110d57825482559160010191906001019061108b565b505050506004015b8082111561084857600080825560018201805467ffffffffffffffff191690556002820180548282558183526020832083916110ed9190810190610834565b50600182018054600080835591825260209091206110a691810190610834565b506111339291505b80821115610848578054600160a060020a0319168155600101611115565b50506001818101805491840180548083556000838152602090209293830192909182156111815760005260206000209182015b82811115611181578254825591600101919060010190611166565b5061118d929150611115565b5050600060048181556005805467ffffffffffffffff19169055600680548382558184529197509195509093508492506111ec91507ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90810190610834565b506001820180546000808355918252602090912061120c91810190610834565b505050505061121c565b50505050505b50505050505050565b50600182018054600080835591825260209091206112169181019061083456
b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6`
// DeployReleaseOracle deploys a new Ethereum contract, binding an instance of ReleaseOracle to it.
// DeployReleaseOracle deploys a new Ethereum contract, binding an instance of ReleaseOracle to it.
func
DeployReleaseOracle
(
auth
*
bind
.
TransactOpts
,
backend
bind
.
ContractBackend
)
(
common
.
Address
,
*
types
.
Transaction
,
*
ReleaseOracle
,
error
)
{
func
DeployReleaseOracle
(
auth
*
bind
.
TransactOpts
,
backend
bind
.
ContractBackend
,
signers
[]
common
.
Address
)
(
common
.
Address
,
*
types
.
Transaction
,
*
ReleaseOracle
,
error
)
{
parsed
,
err
:=
abi
.
JSON
(
strings
.
NewReader
(
ReleaseOracleABI
))
parsed
,
err
:=
abi
.
JSON
(
strings
.
NewReader
(
ReleaseOracleABI
))
if
err
!=
nil
{
if
err
!=
nil
{
return
common
.
Address
{},
nil
,
nil
,
err
return
common
.
Address
{},
nil
,
nil
,
err
}
}
address
,
tx
,
contract
,
err
:=
bind
.
DeployContract
(
auth
,
parsed
,
common
.
FromHex
(
ReleaseOracleBin
),
backend
)
address
,
tx
,
contract
,
err
:=
bind
.
DeployContract
(
auth
,
parsed
,
common
.
FromHex
(
ReleaseOracleBin
),
backend
,
signers
)
if
err
!=
nil
{
if
err
!=
nil
{
return
common
.
Address
{},
nil
,
nil
,
err
return
common
.
Address
{},
nil
,
nil
,
err
}
}
...
@@ -159,35 +159,35 @@ func (_ReleaseOracle *ReleaseOracleTransactorRaw) Transact(opts *bind.TransactOp
...
@@ -159,35 +159,35 @@ func (_ReleaseOracle *ReleaseOracleTransactorRaw) Transact(opts *bind.TransactOp
return
_ReleaseOracle
.
Contract
.
contract
.
Transact
(
opts
,
method
,
params
...
)
return
_ReleaseOracle
.
Contract
.
contract
.
Transact
(
opts
,
method
,
params
...
)
}
}
// AuthProposals is a free data retrieval call binding the contract method 0x
282fe4e5
.
// AuthProposals is a free data retrieval call binding the contract method 0x
bf8ecf9c
.
//
//
// Solidity: function
A
uthProposals() constant returns(address[])
// Solidity: function
a
uthProposals() constant returns(address[])
func
(
_ReleaseOracle
*
ReleaseOracleCaller
)
AuthProposals
(
opts
*
bind
.
CallOpts
)
([]
common
.
Address
,
error
)
{
func
(
_ReleaseOracle
*
ReleaseOracleCaller
)
AuthProposals
(
opts
*
bind
.
CallOpts
)
([]
common
.
Address
,
error
)
{
var
(
var
(
ret0
=
new
([]
common
.
Address
)
ret0
=
new
([]
common
.
Address
)
)
)
out
:=
ret0
out
:=
ret0
err
:=
_ReleaseOracle
.
contract
.
Call
(
opts
,
out
,
"
A
uthProposals"
)
err
:=
_ReleaseOracle
.
contract
.
Call
(
opts
,
out
,
"
a
uthProposals"
)
return
*
ret0
,
err
return
*
ret0
,
err
}
}
// AuthProposals is a free data retrieval call binding the contract method 0x
282fe4e5
.
// AuthProposals is a free data retrieval call binding the contract method 0x
bf8ecf9c
.
//
//
// Solidity: function
A
uthProposals() constant returns(address[])
// Solidity: function
a
uthProposals() constant returns(address[])
func
(
_ReleaseOracle
*
ReleaseOracleSession
)
AuthProposals
()
([]
common
.
Address
,
error
)
{
func
(
_ReleaseOracle
*
ReleaseOracleSession
)
AuthProposals
()
([]
common
.
Address
,
error
)
{
return
_ReleaseOracle
.
Contract
.
AuthProposals
(
&
_ReleaseOracle
.
CallOpts
)
return
_ReleaseOracle
.
Contract
.
AuthProposals
(
&
_ReleaseOracle
.
CallOpts
)
}
}
// AuthProposals is a free data retrieval call binding the contract method 0x
282fe4e5
.
// AuthProposals is a free data retrieval call binding the contract method 0x
bf8ecf9c
.
//
//
// Solidity: function
A
uthProposals() constant returns(address[])
// Solidity: function
a
uthProposals() constant returns(address[])
func
(
_ReleaseOracle
*
ReleaseOracleCallerSession
)
AuthProposals
()
([]
common
.
Address
,
error
)
{
func
(
_ReleaseOracle
*
ReleaseOracleCallerSession
)
AuthProposals
()
([]
common
.
Address
,
error
)
{
return
_ReleaseOracle
.
Contract
.
AuthProposals
(
&
_ReleaseOracle
.
CallOpts
)
return
_ReleaseOracle
.
Contract
.
AuthProposals
(
&
_ReleaseOracle
.
CallOpts
)
}
}
// AuthVotes is a free data retrieval call binding the contract method 0x
a29226f2
.
// AuthVotes is a free data retrieval call binding the contract method 0x
64ed31fe
.
//
//
// Solidity: function
A
uthVotes(user address) constant returns(promote address[], demote address[])
// Solidity: function
a
uthVotes(user address) constant returns(promote address[], demote address[])
func
(
_ReleaseOracle
*
ReleaseOracleCaller
)
AuthVotes
(
opts
*
bind
.
CallOpts
,
user
common
.
Address
)
(
struct
{
func
(
_ReleaseOracle
*
ReleaseOracleCaller
)
AuthVotes
(
opts
*
bind
.
CallOpts
,
user
common
.
Address
)
(
struct
{
Promote
[]
common
.
Address
Promote
[]
common
.
Address
Demote
[]
common
.
Address
Demote
[]
common
.
Address
...
@@ -197,13 +197,13 @@ func (_ReleaseOracle *ReleaseOracleCaller) AuthVotes(opts *bind.CallOpts, user c
...
@@ -197,13 +197,13 @@ func (_ReleaseOracle *ReleaseOracleCaller) AuthVotes(opts *bind.CallOpts, user c
Demote
[]
common
.
Address
Demote
[]
common
.
Address
})
})
out
:=
ret
out
:=
ret
err
:=
_ReleaseOracle
.
contract
.
Call
(
opts
,
out
,
"
A
uthVotes"
,
user
)
err
:=
_ReleaseOracle
.
contract
.
Call
(
opts
,
out
,
"
a
uthVotes"
,
user
)
return
*
ret
,
err
return
*
ret
,
err
}
}
// AuthVotes is a free data retrieval call binding the contract method 0x
a29226f2
.
// AuthVotes is a free data retrieval call binding the contract method 0x
64ed31fe
.
//
//
// Solidity: function
A
uthVotes(user address) constant returns(promote address[], demote address[])
// Solidity: function
a
uthVotes(user address) constant returns(promote address[], demote address[])
func
(
_ReleaseOracle
*
ReleaseOracleSession
)
AuthVotes
(
user
common
.
Address
)
(
struct
{
func
(
_ReleaseOracle
*
ReleaseOracleSession
)
AuthVotes
(
user
common
.
Address
)
(
struct
{
Promote
[]
common
.
Address
Promote
[]
common
.
Address
Demote
[]
common
.
Address
Demote
[]
common
.
Address
...
@@ -211,9 +211,9 @@ func (_ReleaseOracle *ReleaseOracleSession) AuthVotes(user common.Address) (stru
...
@@ -211,9 +211,9 @@ func (_ReleaseOracle *ReleaseOracleSession) AuthVotes(user common.Address) (stru
return
_ReleaseOracle
.
Contract
.
AuthVotes
(
&
_ReleaseOracle
.
CallOpts
,
user
)
return
_ReleaseOracle
.
Contract
.
AuthVotes
(
&
_ReleaseOracle
.
CallOpts
,
user
)
}
}
// AuthVotes is a free data retrieval call binding the contract method 0x
a29226f2
.
// AuthVotes is a free data retrieval call binding the contract method 0x
64ed31fe
.
//
//
// Solidity: function
A
uthVotes(user address) constant returns(promote address[], demote address[])
// Solidity: function
a
uthVotes(user address) constant returns(promote address[], demote address[])
func
(
_ReleaseOracle
*
ReleaseOracleCallerSession
)
AuthVotes
(
user
common
.
Address
)
(
struct
{
func
(
_ReleaseOracle
*
ReleaseOracleCallerSession
)
AuthVotes
(
user
common
.
Address
)
(
struct
{
Promote
[]
common
.
Address
Promote
[]
common
.
Address
Demote
[]
common
.
Address
Demote
[]
common
.
Address
...
@@ -221,9 +221,9 @@ func (_ReleaseOracle *ReleaseOracleCallerSession) AuthVotes(user common.Address)
...
@@ -221,9 +221,9 @@ func (_ReleaseOracle *ReleaseOracleCallerSession) AuthVotes(user common.Address)
return
_ReleaseOracle
.
Contract
.
AuthVotes
(
&
_ReleaseOracle
.
CallOpts
,
user
)
return
_ReleaseOracle
.
Contract
.
AuthVotes
(
&
_ReleaseOracle
.
CallOpts
,
user
)
}
}
// CurrentVersion is a free data retrieval call binding the contract method 0x
2b225f29
.
// CurrentVersion is a free data retrieval call binding the contract method 0x
9d888e86
.
//
//
// Solidity: function
C
urrentVersion() constant returns(major uint32, minor uint32, patch uint32, commit bytes20, time uint256)
// Solidity: function
c
urrentVersion() constant returns(major uint32, minor uint32, patch uint32, commit bytes20, time uint256)
func
(
_ReleaseOracle
*
ReleaseOracleCaller
)
CurrentVersion
(
opts
*
bind
.
CallOpts
)
(
struct
{
func
(
_ReleaseOracle
*
ReleaseOracleCaller
)
CurrentVersion
(
opts
*
bind
.
CallOpts
)
(
struct
{
Major
uint32
Major
uint32
Minor
uint32
Minor
uint32
...
@@ -239,13 +239,13 @@ func (_ReleaseOracle *ReleaseOracleCaller) CurrentVersion(opts *bind.CallOpts) (
...
@@ -239,13 +239,13 @@ func (_ReleaseOracle *ReleaseOracleCaller) CurrentVersion(opts *bind.CallOpts) (
Time
*
big
.
Int
Time
*
big
.
Int
})
})
out
:=
ret
out
:=
ret
err
:=
_ReleaseOracle
.
contract
.
Call
(
opts
,
out
,
"
C
urrentVersion"
)
err
:=
_ReleaseOracle
.
contract
.
Call
(
opts
,
out
,
"
c
urrentVersion"
)
return
*
ret
,
err
return
*
ret
,
err
}
}
// CurrentVersion is a free data retrieval call binding the contract method 0x
2b225f29
.
// CurrentVersion is a free data retrieval call binding the contract method 0x
9d888e86
.
//
//
// Solidity: function
C
urrentVersion() constant returns(major uint32, minor uint32, patch uint32, commit bytes20, time uint256)
// Solidity: function
c
urrentVersion() constant returns(major uint32, minor uint32, patch uint32, commit bytes20, time uint256)
func
(
_ReleaseOracle
*
ReleaseOracleSession
)
CurrentVersion
()
(
struct
{
func
(
_ReleaseOracle
*
ReleaseOracleSession
)
CurrentVersion
()
(
struct
{
Major
uint32
Major
uint32
Minor
uint32
Minor
uint32
...
@@ -256,9 +256,9 @@ func (_ReleaseOracle *ReleaseOracleSession) CurrentVersion() (struct {
...
@@ -256,9 +256,9 @@ func (_ReleaseOracle *ReleaseOracleSession) CurrentVersion() (struct {
return
_ReleaseOracle
.
Contract
.
CurrentVersion
(
&
_ReleaseOracle
.
CallOpts
)
return
_ReleaseOracle
.
Contract
.
CurrentVersion
(
&
_ReleaseOracle
.
CallOpts
)
}
}
// CurrentVersion is a free data retrieval call binding the contract method 0x
2b225f29
.
// CurrentVersion is a free data retrieval call binding the contract method 0x
9d888e86
.
//
//
// Solidity: function
C
urrentVersion() constant returns(major uint32, minor uint32, patch uint32, commit bytes20, time uint256)
// Solidity: function
c
urrentVersion() constant returns(major uint32, minor uint32, patch uint32, commit bytes20, time uint256)
func
(
_ReleaseOracle
*
ReleaseOracleCallerSession
)
CurrentVersion
()
(
struct
{
func
(
_ReleaseOracle
*
ReleaseOracleCallerSession
)
CurrentVersion
()
(
struct
{
Major
uint32
Major
uint32
Minor
uint32
Minor
uint32
...
@@ -269,9 +269,9 @@ func (_ReleaseOracle *ReleaseOracleCallerSession) CurrentVersion() (struct {
...
@@ -269,9 +269,9 @@ func (_ReleaseOracle *ReleaseOracleCallerSession) CurrentVersion() (struct {
return
_ReleaseOracle
.
Contract
.
CurrentVersion
(
&
_ReleaseOracle
.
CallOpts
)
return
_ReleaseOracle
.
Contract
.
CurrentVersion
(
&
_ReleaseOracle
.
CallOpts
)
}
}
// ProposedVersion is a free data retrieval call binding the contract method 0x
4c327071
.
// ProposedVersion is a free data retrieval call binding the contract method 0x
26db7648
.
//
//
// Solidity: function
P
roposedVersion() constant returns(major uint32, minor uint32, patch uint32, commit bytes20, pass address[], fail address[])
// Solidity: function
p
roposedVersion() constant returns(major uint32, minor uint32, patch uint32, commit bytes20, pass address[], fail address[])
func
(
_ReleaseOracle
*
ReleaseOracleCaller
)
ProposedVersion
(
opts
*
bind
.
CallOpts
)
(
struct
{
func
(
_ReleaseOracle
*
ReleaseOracleCaller
)
ProposedVersion
(
opts
*
bind
.
CallOpts
)
(
struct
{
Major
uint32
Major
uint32
Minor
uint32
Minor
uint32
...
@@ -289,13 +289,13 @@ func (_ReleaseOracle *ReleaseOracleCaller) ProposedVersion(opts *bind.CallOpts)
...
@@ -289,13 +289,13 @@ func (_ReleaseOracle *ReleaseOracleCaller) ProposedVersion(opts *bind.CallOpts)
Fail
[]
common
.
Address
Fail
[]
common
.
Address
})
})
out
:=
ret
out
:=
ret
err
:=
_ReleaseOracle
.
contract
.
Call
(
opts
,
out
,
"
P
roposedVersion"
)
err
:=
_ReleaseOracle
.
contract
.
Call
(
opts
,
out
,
"
p
roposedVersion"
)
return
*
ret
,
err
return
*
ret
,
err
}
}
// ProposedVersion is a free data retrieval call binding the contract method 0x
4c327071
.
// ProposedVersion is a free data retrieval call binding the contract method 0x
26db7648
.
//
//
// Solidity: function
P
roposedVersion() constant returns(major uint32, minor uint32, patch uint32, commit bytes20, pass address[], fail address[])
// Solidity: function
p
roposedVersion() constant returns(major uint32, minor uint32, patch uint32, commit bytes20, pass address[], fail address[])
func
(
_ReleaseOracle
*
ReleaseOracleSession
)
ProposedVersion
()
(
struct
{
func
(
_ReleaseOracle
*
ReleaseOracleSession
)
ProposedVersion
()
(
struct
{
Major
uint32
Major
uint32
Minor
uint32
Minor
uint32
...
@@ -307,9 +307,9 @@ func (_ReleaseOracle *ReleaseOracleSession) ProposedVersion() (struct {
...
@@ -307,9 +307,9 @@ func (_ReleaseOracle *ReleaseOracleSession) ProposedVersion() (struct {
return
_ReleaseOracle
.
Contract
.
ProposedVersion
(
&
_ReleaseOracle
.
CallOpts
)
return
_ReleaseOracle
.
Contract
.
ProposedVersion
(
&
_ReleaseOracle
.
CallOpts
)
}
}
// ProposedVersion is a free data retrieval call binding the contract method 0x
4c327071
.
// ProposedVersion is a free data retrieval call binding the contract method 0x
26db7648
.
//
//
// Solidity: function
P
roposedVersion() constant returns(major uint32, minor uint32, patch uint32, commit bytes20, pass address[], fail address[])
// Solidity: function
p
roposedVersion() constant returns(major uint32, minor uint32, patch uint32, commit bytes20, pass address[], fail address[])
func
(
_ReleaseOracle
*
ReleaseOracleCallerSession
)
ProposedVersion
()
(
struct
{
func
(
_ReleaseOracle
*
ReleaseOracleCallerSession
)
ProposedVersion
()
(
struct
{
Major
uint32
Major
uint32
Minor
uint32
Minor
uint32
...
@@ -321,154 +321,112 @@ func (_ReleaseOracle *ReleaseOracleCallerSession) ProposedVersion() (struct {
...
@@ -321,154 +321,112 @@ func (_ReleaseOracle *ReleaseOracleCallerSession) ProposedVersion() (struct {
return
_ReleaseOracle
.
Contract
.
ProposedVersion
(
&
_ReleaseOracle
.
CallOpts
)
return
_ReleaseOracle
.
Contract
.
ProposedVersion
(
&
_ReleaseOracle
.
CallOpts
)
}
}
// Signers is a free data retrieval call binding the contract method 0x
f04c4758
.
// Signers is a free data retrieval call binding the contract method 0x
46f0975a
.
//
//
// Solidity: function
S
igners() constant returns(address[])
// Solidity: function
s
igners() constant returns(address[])
func
(
_ReleaseOracle
*
ReleaseOracleCaller
)
Signers
(
opts
*
bind
.
CallOpts
)
([]
common
.
Address
,
error
)
{
func
(
_ReleaseOracle
*
ReleaseOracleCaller
)
Signers
(
opts
*
bind
.
CallOpts
)
([]
common
.
Address
,
error
)
{
var
(
var
(
ret0
=
new
([]
common
.
Address
)
ret0
=
new
([]
common
.
Address
)
)
)
out
:=
ret0
out
:=
ret0
err
:=
_ReleaseOracle
.
contract
.
Call
(
opts
,
out
,
"
S
igners"
)
err
:=
_ReleaseOracle
.
contract
.
Call
(
opts
,
out
,
"
s
igners"
)
return
*
ret0
,
err
return
*
ret0
,
err
}
}
// Signers is a free data retrieval call binding the contract method 0x
f04c4758
.
// Signers is a free data retrieval call binding the contract method 0x
46f0975a
.
//
//
// Solidity: function
S
igners() constant returns(address[])
// Solidity: function
s
igners() constant returns(address[])
func
(
_ReleaseOracle
*
ReleaseOracleSession
)
Signers
()
([]
common
.
Address
,
error
)
{
func
(
_ReleaseOracle
*
ReleaseOracleSession
)
Signers
()
([]
common
.
Address
,
error
)
{
return
_ReleaseOracle
.
Contract
.
Signers
(
&
_ReleaseOracle
.
CallOpts
)
return
_ReleaseOracle
.
Contract
.
Signers
(
&
_ReleaseOracle
.
CallOpts
)
}
}
// Signers is a free data retrieval call binding the contract method 0x
f04c4758
.
// Signers is a free data retrieval call binding the contract method 0x
46f0975a
.
//
//
// Solidity: function
S
igners() constant returns(address[])
// Solidity: function
s
igners() constant returns(address[])
func
(
_ReleaseOracle
*
ReleaseOracleCallerSession
)
Signers
()
([]
common
.
Address
,
error
)
{
func
(
_ReleaseOracle
*
ReleaseOracleCallerSession
)
Signers
()
([]
common
.
Address
,
error
)
{
return
_ReleaseOracle
.
Contract
.
Signers
(
&
_ReleaseOracle
.
CallOpts
)
return
_ReleaseOracle
.
Contract
.
Signers
(
&
_ReleaseOracle
.
CallOpts
)
}
}
// Demote is a paid mutator transaction binding the contract method 0x
80bbbd4a
.
// Demote is a paid mutator transaction binding the contract method 0x
5c3d005d
.
//
//
// Solidity: function
D
emote(user address) returns()
// Solidity: function
d
emote(user address) returns()
func
(
_ReleaseOracle
*
ReleaseOracleTransactor
)
Demote
(
opts
*
bind
.
TransactOpts
,
user
common
.
Address
)
(
*
types
.
Transaction
,
error
)
{
func
(
_ReleaseOracle
*
ReleaseOracleTransactor
)
Demote
(
opts
*
bind
.
TransactOpts
,
user
common
.
Address
)
(
*
types
.
Transaction
,
error
)
{
return
_ReleaseOracle
.
contract
.
Transact
(
opts
,
"
D
emote"
,
user
)
return
_ReleaseOracle
.
contract
.
Transact
(
opts
,
"
d
emote"
,
user
)
}
}
// Demote is a paid mutator transaction binding the contract method 0x
80bbbd4a
.
// Demote is a paid mutator transaction binding the contract method 0x
5c3d005d
.
//
//
// Solidity: function
D
emote(user address) returns()
// Solidity: function
d
emote(user address) returns()
func
(
_ReleaseOracle
*
ReleaseOracleSession
)
Demote
(
user
common
.
Address
)
(
*
types
.
Transaction
,
error
)
{
func
(
_ReleaseOracle
*
ReleaseOracleSession
)
Demote
(
user
common
.
Address
)
(
*
types
.
Transaction
,
error
)
{
return
_ReleaseOracle
.
Contract
.
Demote
(
&
_ReleaseOracle
.
TransactOpts
,
user
)
return
_ReleaseOracle
.
Contract
.
Demote
(
&
_ReleaseOracle
.
TransactOpts
,
user
)
}
}
// Demote is a paid mutator transaction binding the contract method 0x
80bbbd4a
.
// Demote is a paid mutator transaction binding the contract method 0x
5c3d005d
.
//
//
// Solidity: function
D
emote(user address) returns()
// Solidity: function
d
emote(user address) returns()
func
(
_ReleaseOracle
*
ReleaseOracleTransactorSession
)
Demote
(
user
common
.
Address
)
(
*
types
.
Transaction
,
error
)
{
func
(
_ReleaseOracle
*
ReleaseOracleTransactorSession
)
Demote
(
user
common
.
Address
)
(
*
types
.
Transaction
,
error
)
{
return
_ReleaseOracle
.
Contract
.
Demote
(
&
_ReleaseOracle
.
TransactOpts
,
user
)
return
_ReleaseOracle
.
Contract
.
Demote
(
&
_ReleaseOracle
.
TransactOpts
,
user
)
}
}
// Nuke is a paid mutator transaction binding the contract method 0x
0443b1ad
.
// Nuke is a paid mutator transaction binding the contract method 0x
bc8fbbf8
.
//
//
// Solidity: function
N
uke() returns()
// Solidity: function
n
uke() returns()
func
(
_ReleaseOracle
*
ReleaseOracleTransactor
)
Nuke
(
opts
*
bind
.
TransactOpts
)
(
*
types
.
Transaction
,
error
)
{
func
(
_ReleaseOracle
*
ReleaseOracleTransactor
)
Nuke
(
opts
*
bind
.
TransactOpts
)
(
*
types
.
Transaction
,
error
)
{
return
_ReleaseOracle
.
contract
.
Transact
(
opts
,
"
N
uke"
)
return
_ReleaseOracle
.
contract
.
Transact
(
opts
,
"
n
uke"
)
}
}
// Nuke is a paid mutator transaction binding the contract method 0x
0443b1ad
.
// Nuke is a paid mutator transaction binding the contract method 0x
bc8fbbf8
.
//
//
// Solidity: function
N
uke() returns()
// Solidity: function
n
uke() returns()
func
(
_ReleaseOracle
*
ReleaseOracleSession
)
Nuke
()
(
*
types
.
Transaction
,
error
)
{
func
(
_ReleaseOracle
*
ReleaseOracleSession
)
Nuke
()
(
*
types
.
Transaction
,
error
)
{
return
_ReleaseOracle
.
Contract
.
Nuke
(
&
_ReleaseOracle
.
TransactOpts
)
return
_ReleaseOracle
.
Contract
.
Nuke
(
&
_ReleaseOracle
.
TransactOpts
)
}
}
// Nuke is a paid mutator transaction binding the contract method 0x
0443b1ad
.
// Nuke is a paid mutator transaction binding the contract method 0x
bc8fbbf8
.
//
//
// Solidity: function
N
uke() returns()
// Solidity: function
n
uke() returns()
func
(
_ReleaseOracle
*
ReleaseOracleTransactorSession
)
Nuke
()
(
*
types
.
Transaction
,
error
)
{
func
(
_ReleaseOracle
*
ReleaseOracleTransactorSession
)
Nuke
()
(
*
types
.
Transaction
,
error
)
{
return
_ReleaseOracle
.
Contract
.
Nuke
(
&
_ReleaseOracle
.
TransactOpts
)
return
_ReleaseOracle
.
Contract
.
Nuke
(
&
_ReleaseOracle
.
TransactOpts
)
}
}
// Promote is a paid mutator transaction binding the contract method 0x
6195db9c
.
// Promote is a paid mutator transaction binding the contract method 0x
d0e0813a
.
//
//
// Solidity: function
P
romote(user address) returns()
// Solidity: function
p
romote(user address) returns()
func
(
_ReleaseOracle
*
ReleaseOracleTransactor
)
Promote
(
opts
*
bind
.
TransactOpts
,
user
common
.
Address
)
(
*
types
.
Transaction
,
error
)
{
func
(
_ReleaseOracle
*
ReleaseOracleTransactor
)
Promote
(
opts
*
bind
.
TransactOpts
,
user
common
.
Address
)
(
*
types
.
Transaction
,
error
)
{
return
_ReleaseOracle
.
contract
.
Transact
(
opts
,
"
P
romote"
,
user
)
return
_ReleaseOracle
.
contract
.
Transact
(
opts
,
"
p
romote"
,
user
)
}
}
// Promote is a paid mutator transaction binding the contract method 0x
6195db9c
.
// Promote is a paid mutator transaction binding the contract method 0x
d0e0813a
.
//
//
// Solidity: function
P
romote(user address) returns()
// Solidity: function
p
romote(user address) returns()
func
(
_ReleaseOracle
*
ReleaseOracleSession
)
Promote
(
user
common
.
Address
)
(
*
types
.
Transaction
,
error
)
{
func
(
_ReleaseOracle
*
ReleaseOracleSession
)
Promote
(
user
common
.
Address
)
(
*
types
.
Transaction
,
error
)
{
return
_ReleaseOracle
.
Contract
.
Promote
(
&
_ReleaseOracle
.
TransactOpts
,
user
)
return
_ReleaseOracle
.
Contract
.
Promote
(
&
_ReleaseOracle
.
TransactOpts
,
user
)
}
}
// Promote is a paid mutator transaction binding the contract method 0x
6195db9c
.
// Promote is a paid mutator transaction binding the contract method 0x
d0e0813a
.
//
//
// Solidity: function
P
romote(user address) returns()
// Solidity: function
p
romote(user address) returns()
func
(
_ReleaseOracle
*
ReleaseOracleTransactorSession
)
Promote
(
user
common
.
Address
)
(
*
types
.
Transaction
,
error
)
{
func
(
_ReleaseOracle
*
ReleaseOracleTransactorSession
)
Promote
(
user
common
.
Address
)
(
*
types
.
Transaction
,
error
)
{
return
_ReleaseOracle
.
Contract
.
Promote
(
&
_ReleaseOracle
.
TransactOpts
,
user
)
return
_ReleaseOracle
.
Contract
.
Promote
(
&
_ReleaseOracle
.
TransactOpts
,
user
)
}
}
// Release is a paid mutator transaction binding the contract method 0x
0d618178
.
// Release is a paid mutator transaction binding the contract method 0x
d67cbec9
.
//
//
// Solidity: function
R
elease(major uint32, minor uint32, patch uint32, commit bytes20) returns()
// Solidity: function
r
elease(major uint32, minor uint32, patch uint32, commit bytes20) returns()
func
(
_ReleaseOracle
*
ReleaseOracleTransactor
)
Release
(
opts
*
bind
.
TransactOpts
,
major
uint32
,
minor
uint32
,
patch
uint32
,
commit
[
20
]
byte
)
(
*
types
.
Transaction
,
error
)
{
func
(
_ReleaseOracle
*
ReleaseOracleTransactor
)
Release
(
opts
*
bind
.
TransactOpts
,
major
uint32
,
minor
uint32
,
patch
uint32
,
commit
[
20
]
byte
)
(
*
types
.
Transaction
,
error
)
{
return
_ReleaseOracle
.
contract
.
Transact
(
opts
,
"
R
elease"
,
major
,
minor
,
patch
,
commit
)
return
_ReleaseOracle
.
contract
.
Transact
(
opts
,
"
r
elease"
,
major
,
minor
,
patch
,
commit
)
}
}
// Release is a paid mutator transaction binding the contract method 0x
0d618178
.
// Release is a paid mutator transaction binding the contract method 0x
d67cbec9
.
//
//
// Solidity: function
R
elease(major uint32, minor uint32, patch uint32, commit bytes20) returns()
// Solidity: function
r
elease(major uint32, minor uint32, patch uint32, commit bytes20) returns()
func
(
_ReleaseOracle
*
ReleaseOracleSession
)
Release
(
major
uint32
,
minor
uint32
,
patch
uint32
,
commit
[
20
]
byte
)
(
*
types
.
Transaction
,
error
)
{
func
(
_ReleaseOracle
*
ReleaseOracleSession
)
Release
(
major
uint32
,
minor
uint32
,
patch
uint32
,
commit
[
20
]
byte
)
(
*
types
.
Transaction
,
error
)
{
return
_ReleaseOracle
.
Contract
.
Release
(
&
_ReleaseOracle
.
TransactOpts
,
major
,
minor
,
patch
,
commit
)
return
_ReleaseOracle
.
Contract
.
Release
(
&
_ReleaseOracle
.
TransactOpts
,
major
,
minor
,
patch
,
commit
)
}
}
// Release is a paid mutator transaction binding the contract method 0x
0d618178
.
// Release is a paid mutator transaction binding the contract method 0x
d67cbec9
.
//
//
// Solidity: function
R
elease(major uint32, minor uint32, patch uint32, commit bytes20) returns()
// Solidity: function
r
elease(major uint32, minor uint32, patch uint32, commit bytes20) returns()
func
(
_ReleaseOracle
*
ReleaseOracleTransactorSession
)
Release
(
major
uint32
,
minor
uint32
,
patch
uint32
,
commit
[
20
]
byte
)
(
*
types
.
Transaction
,
error
)
{
func
(
_ReleaseOracle
*
ReleaseOracleTransactorSession
)
Release
(
major
uint32
,
minor
uint32
,
patch
uint32
,
commit
[
20
]
byte
)
(
*
types
.
Transaction
,
error
)
{
return
_ReleaseOracle
.
Contract
.
Release
(
&
_ReleaseOracle
.
TransactOpts
,
major
,
minor
,
patch
,
commit
)
return
_ReleaseOracle
.
Contract
.
Release
(
&
_ReleaseOracle
.
TransactOpts
,
major
,
minor
,
patch
,
commit
)
}
}
// UpdateRelease is a paid mutator transaction binding the contract method 0x645dce72.
//
// Solidity: function updateRelease(major uint32, minor uint32, patch uint32, commit bytes20, release bool) returns()
func
(
_ReleaseOracle
*
ReleaseOracleTransactor
)
UpdateRelease
(
opts
*
bind
.
TransactOpts
,
major
uint32
,
minor
uint32
,
patch
uint32
,
commit
[
20
]
byte
,
release
bool
)
(
*
types
.
Transaction
,
error
)
{
return
_ReleaseOracle
.
contract
.
Transact
(
opts
,
"updateRelease"
,
major
,
minor
,
patch
,
commit
,
release
)
}
// UpdateRelease is a paid mutator transaction binding the contract method 0x645dce72.
//
// Solidity: function updateRelease(major uint32, minor uint32, patch uint32, commit bytes20, release bool) returns()
func
(
_ReleaseOracle
*
ReleaseOracleSession
)
UpdateRelease
(
major
uint32
,
minor
uint32
,
patch
uint32
,
commit
[
20
]
byte
,
release
bool
)
(
*
types
.
Transaction
,
error
)
{
return
_ReleaseOracle
.
Contract
.
UpdateRelease
(
&
_ReleaseOracle
.
TransactOpts
,
major
,
minor
,
patch
,
commit
,
release
)
}
// UpdateRelease is a paid mutator transaction binding the contract method 0x645dce72.
//
// Solidity: function updateRelease(major uint32, minor uint32, patch uint32, commit bytes20, release bool) returns()
func
(
_ReleaseOracle
*
ReleaseOracleTransactorSession
)
UpdateRelease
(
major
uint32
,
minor
uint32
,
patch
uint32
,
commit
[
20
]
byte
,
release
bool
)
(
*
types
.
Transaction
,
error
)
{
return
_ReleaseOracle
.
Contract
.
UpdateRelease
(
&
_ReleaseOracle
.
TransactOpts
,
major
,
minor
,
patch
,
commit
,
release
)
}
// UpdateSigner is a paid mutator transaction binding the contract method 0xf460590b.
//
// Solidity: function updateSigner(user address, authorize bool) returns()
func
(
_ReleaseOracle
*
ReleaseOracleTransactor
)
UpdateSigner
(
opts
*
bind
.
TransactOpts
,
user
common
.
Address
,
authorize
bool
)
(
*
types
.
Transaction
,
error
)
{
return
_ReleaseOracle
.
contract
.
Transact
(
opts
,
"updateSigner"
,
user
,
authorize
)
}
// UpdateSigner is a paid mutator transaction binding the contract method 0xf460590b.
//
// Solidity: function updateSigner(user address, authorize bool) returns()
func
(
_ReleaseOracle
*
ReleaseOracleSession
)
UpdateSigner
(
user
common
.
Address
,
authorize
bool
)
(
*
types
.
Transaction
,
error
)
{
return
_ReleaseOracle
.
Contract
.
UpdateSigner
(
&
_ReleaseOracle
.
TransactOpts
,
user
,
authorize
)
}
// UpdateSigner is a paid mutator transaction binding the contract method 0xf460590b.
//
// Solidity: function updateSigner(user address, authorize bool) returns()
func
(
_ReleaseOracle
*
ReleaseOracleTransactorSession
)
UpdateSigner
(
user
common
.
Address
,
authorize
bool
)
(
*
types
.
Transaction
,
error
)
{
return
_ReleaseOracle
.
Contract
.
UpdateSigner
(
&
_ReleaseOracle
.
TransactOpts
,
user
,
authorize
)
}
contracts/
release/contract.sol
→
release/contract.sol
View file @
586eddfd
...
@@ -19,7 +19,7 @@
...
@@ -19,7 +19,7 @@
// check for new releases automatically without the need to consult a central
// check for new releases automatically without the need to consult a central
// repository.
// repository.
//
//
// The contract takes a vote based approach on both assigning authori
z
ed signers
// The contract takes a vote based approach on both assigning authori
s
ed signers
// as well as signing off on new Geth releases.
// as well as signing off on new Geth releases.
//
//
// Note, when a signer is demoted, the currently pending release is auto-nuked.
// Note, when a signer is demoted, the currently pending release is auto-nuked.
...
@@ -45,8 +45,8 @@ contract ReleaseOracle {
...
@@ -45,8 +45,8 @@ contract ReleaseOracle {
}
}
// Oracle authorization details
// Oracle authorization details
mapping(address => bool) authori
z
ed; // Set of accounts allowed to vote on updating the contract
mapping(address => bool) authori
s
ed; // Set of accounts allowed to vote on updating the contract
address[]
signers;
// List of addresses currently accepted as signers
address[]
voters;
// List of addresses currently accepted as signers
// Various proposals being voted on
// Various proposals being voted on
mapping(address => Votes) authProps; // Currently running user authorization proposals
mapping(address => Votes) authProps; // Currently running user authorization proposals
...
@@ -57,38 +57,47 @@ contract ReleaseOracle {
...
@@ -57,38 +57,47 @@ contract ReleaseOracle {
// isSigner is a modifier to authorize contract transactions.
// isSigner is a modifier to authorize contract transactions.
modifier isSigner() {
modifier isSigner() {
if (authori
z
ed[msg.sender]) {
if (authori
s
ed[msg.sender]) {
_
_
}
}
}
}
// Constructor to assign the creator as the sole valid signer.
// Constructor to assign the initial set of signers.
function ReleaseOracle() {
function ReleaseOracle(address[] signers) {
authorized[msg.sender] = true;
// If no signers were specified, assign the creator as the sole signer
signers.push(msg.sender);
if (signers.length == 0) {
authorised[msg.sender] = true;
voters.push(msg.sender);
return;
}
// Otherwise assign the individual signers one by one
for (uint i = 0; i < signers.length; i++) {
authorised[signers[i]] = true;
voters.push(signers[i]);
}
}
}
//
S
igners is an accessor method to retrieve all te signers (public accessor
//
s
igners is an accessor method to retrieve all te signers (public accessor
// generates an indexed one, not a retreive-all version).
// generates an indexed one, not a retreive-all version).
function
S
igners() constant returns(address[]) {
function
s
igners() constant returns(address[]) {
return
sign
ers;
return
vot
ers;
}
}
//
A
uthProposals retrieves the list of addresses that authorization proposals
//
a
uthProposals retrieves the list of addresses that authorization proposals
// are currently being voted on.
// are currently being voted on.
function
A
uthProposals() constant returns(address[]) {
function
a
uthProposals() constant returns(address[]) {
return authPend;
return authPend;
}
}
//
A
uthVotes retrieves the current authorization votes for a particular user
//
a
uthVotes retrieves the current authorization votes for a particular user
// to promote him into the list of signers, or demote him from there.
// to promote him into the list of signers, or demote him from there.
function
A
uthVotes(address user) constant returns(address[] promote, address[] demote) {
function
a
uthVotes(address user) constant returns(address[] promote, address[] demote) {
return (authProps[user].pass, authProps[user].fail);
return (authProps[user].pass, authProps[user].fail);
}
}
//
C
urrentVersion retrieves the semantic version, commit hash and release time
//
c
urrentVersion retrieves the semantic version, commit hash and release time
// of the currently votec active release.
// of the currently votec active release.
function
C
urrentVersion() constant returns (uint32 major, uint32 minor, uint32 patch, bytes20 commit, uint time) {
function
c
urrentVersion() constant returns (uint32 major, uint32 minor, uint32 patch, bytes20 commit, uint time) {
if (releases.length == 0) {
if (releases.length == 0) {
return (0, 0, 0, 0, 0);
return (0, 0, 0, 0, 0);
}
}
...
@@ -97,38 +106,38 @@ contract ReleaseOracle {
...
@@ -97,38 +106,38 @@ contract ReleaseOracle {
return (release.major, release.minor, release.patch, release.commit, release.time);
return (release.major, release.minor, release.patch, release.commit, release.time);
}
}
//
P
roposedVersion retrieves the semantic version, commit hash and the current
//
p
roposedVersion retrieves the semantic version, commit hash and the current
// votes for the next proposed release.
// votes for the next proposed release.
function
P
roposedVersion() constant returns (uint32 major, uint32 minor, uint32 patch, bytes20 commit, address[] pass, address[] fail) {
function
p
roposedVersion() constant returns (uint32 major, uint32 minor, uint32 patch, bytes20 commit, address[] pass, address[] fail) {
return (verProp.major, verProp.minor, verProp.patch, verProp.commit, verProp.votes.pass, verProp.votes.fail);
return (verProp.major, verProp.minor, verProp.patch, verProp.commit, verProp.votes.pass, verProp.votes.fail);
}
}
//
P
romote pitches in on a voting campaign to promote a new user to a signer
//
p
romote pitches in on a voting campaign to promote a new user to a signer
// position.
// position.
function
P
romote(address user) {
function
p
romote(address user) {
updateSigner(user, true);
updateSigner(user, true);
}
}
//
Demote pitches in on a voting campaign to demote an authoriz
ed user from
//
demote pitches in on a voting campaign to demote an authoris
ed user from
// its signer position.
// its signer position.
function
D
emote(address user) {
function
d
emote(address user) {
updateSigner(user, false);
updateSigner(user, false);
}
}
//
R
elease votes for a particular version to be included as the next release.
//
r
elease votes for a particular version to be included as the next release.
function
R
elease(uint32 major, uint32 minor, uint32 patch, bytes20 commit) {
function
r
elease(uint32 major, uint32 minor, uint32 patch, bytes20 commit) {
updateRelease(major, minor, patch, commit, true);
updateRelease(major, minor, patch, commit, true);
}
}
//
N
uke votes for the currently proposed version to not be included as the next
//
n
uke votes for the currently proposed version to not be included as the next
// release. Nuking doesn't require a specific version number for simplicity.
// release. Nuking doesn't require a specific version number for simplicity.
function
N
uke() {
function
n
uke() {
updateRelease(0, 0, 0, 0, false);
updateRelease(0, 0, 0, 0, false);
}
}
// updateSigner marks a vote for changing the status of an Ethereum user, either
// updateSigner marks a vote for changing the status of an Ethereum user, either
// for or against the user being an authori
z
ed signer.
// for or against the user being an authori
s
ed signer.
function updateSigner(address user, bool authorize) isSigner {
function updateSigner(address user, bool authorize) i
nternal i
sSigner {
// Gather the current votes and ensure we don't double vote
// Gather the current votes and ensure we don't double vote
Votes votes = authProps[user];
Votes votes = authProps[user];
for (uint i = 0; i < votes.pass.length; i++) {
for (uint i = 0; i < votes.pass.length; i++) {
...
@@ -148,26 +157,26 @@ contract ReleaseOracle {
...
@@ -148,26 +157,26 @@ contract ReleaseOracle {
// Cast the vote and return if the proposal cannot be resolved yet
// Cast the vote and return if the proposal cannot be resolved yet
if (authorize) {
if (authorize) {
votes.pass.push(msg.sender);
votes.pass.push(msg.sender);
if (votes.pass.length <=
sign
ers.length / 2) {
if (votes.pass.length <=
vot
ers.length / 2) {
return;
return;
}
}
} else {
} else {
votes.fail.push(msg.sender);
votes.fail.push(msg.sender);
if (votes.fail.length <=
sign
ers.length / 2) {
if (votes.fail.length <=
vot
ers.length / 2) {
return;
return;
}
}
}
}
// Proposal resolved in our favor, execute whatever we voted on
// Proposal resolved in our favor, execute whatever we voted on
if (authorize && !authori
z
ed[user]) {
if (authorize && !authori
s
ed[user]) {
authori
z
ed[user] = true;
authori
s
ed[user] = true;
sign
ers.push(user);
vot
ers.push(user);
} else if (!authorize && authori
z
ed[user]) {
} else if (!authorize && authori
s
ed[user]) {
authori
z
ed[user] = false;
authori
s
ed[user] = false;
for (i = 0; i <
sign
ers.length; i++) {
for (i = 0; i <
vot
ers.length; i++) {
if (
sign
ers[i] == user) {
if (
vot
ers[i] == user) {
signers[i] = signers[sign
ers.length - 1];
voters[i] = voters[vot
ers.length - 1];
sign
ers.length--;
vot
ers.length--;
delete verProp; // Nuke any version proposal (no suprise releases!)
delete verProp; // Nuke any version proposal (no suprise releases!)
break;
break;
...
@@ -188,7 +197,7 @@ contract ReleaseOracle {
...
@@ -188,7 +197,7 @@ contract ReleaseOracle {
// updateRelease votes for a particular version to be included as the next release,
// updateRelease votes for a particular version to be included as the next release,
// or for the currently proposed release to be nuked out.
// or for the currently proposed release to be nuked out.
function updateRelease(uint32 major, uint32 minor, uint32 patch, bytes20 commit, bool release) isSigner {
function updateRelease(uint32 major, uint32 minor, uint32 patch, bytes20 commit, bool release) i
nternal i
sSigner {
// Skip nuke votes if no proposal is pending
// Skip nuke votes if no proposal is pending
if (!release && verProp.votes.pass.length == 0) {
if (!release && verProp.votes.pass.length == 0) {
return;
return;
...
@@ -219,12 +228,12 @@ contract ReleaseOracle {
...
@@ -219,12 +228,12 @@ contract ReleaseOracle {
// Cast the vote and return if the proposal cannot be resolved yet
// Cast the vote and return if the proposal cannot be resolved yet
if (release) {
if (release) {
votes.pass.push(msg.sender);
votes.pass.push(msg.sender);
if (votes.pass.length <=
sign
ers.length / 2) {
if (votes.pass.length <=
vot
ers.length / 2) {
return;
return;
}
}
} else {
} else {
votes.fail.push(msg.sender);
votes.fail.push(msg.sender);
if (votes.fail.length <=
sign
ers.length / 2) {
if (votes.fail.length <=
vot
ers.length / 2) {
return;
return;
}
}
}
}
...
...
contracts/
release/contract_test.go
→
release/contract_test.go
View file @
586eddfd
...
@@ -42,7 +42,7 @@ func setupReleaseTest(t *testing.T, prefund ...*ecdsa.PrivateKey) (*ecdsa.Privat
...
@@ -42,7 +42,7 @@ func setupReleaseTest(t *testing.T, prefund ...*ecdsa.PrivateKey) (*ecdsa.Privat
sim
:=
backends
.
NewSimulatedBackend
(
accounts
...
)
sim
:=
backends
.
NewSimulatedBackend
(
accounts
...
)
// Deploy a version oracle contract, commit and return
// Deploy a version oracle contract, commit and return
_
,
_
,
oracle
,
err
:=
DeployReleaseOracle
(
auth
,
sim
)
_
,
_
,
oracle
,
err
:=
DeployReleaseOracle
(
auth
,
sim
,
[]
common
.
Address
{
auth
.
From
}
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatalf
(
"Failed to deploy version contract: %v"
,
err
)
t
.
Fatalf
(
"Failed to deploy version contract: %v"
,
err
)
}
}
...
@@ -239,7 +239,7 @@ func TestVersionRelease(t *testing.T) {
...
@@ -239,7 +239,7 @@ func TestVersionRelease(t *testing.T) {
// Propose release with half voters and check that the release does not yet go through
// Propose release with half voters and check that the release does not yet go through
for
j
:=
0
;
j
<
(
i
+
1
)
/
2
;
j
++
{
for
j
:=
0
;
j
<
(
i
+
1
)
/
2
;
j
++
{
if
_
,
err
=
oracle
.
Release
(
bind
.
NewKeyedTransactor
(
keys
[
j
]),
uint32
(
i
),
uint32
(
i
+
1
),
uint32
(
i
+
2
),
[
20
]
byte
{});
err
!=
nil
{
if
_
,
err
=
oracle
.
Release
(
bind
.
NewKeyedTransactor
(
keys
[
j
]),
uint32
(
i
),
uint32
(
i
+
1
),
uint32
(
i
+
2
),
[
20
]
byte
{
byte
(
i
+
3
)
});
err
!=
nil
{
t
.
Fatalf
(
"Iter #%d: failed valid release attempt: %v"
,
i
,
err
)
t
.
Fatalf
(
"Iter #%d: failed valid release attempt: %v"
,
i
,
err
)
}
}
}
}
...
@@ -254,8 +254,8 @@ func TestVersionRelease(t *testing.T) {
...
@@ -254,8 +254,8 @@ func TestVersionRelease(t *testing.T) {
}
}
// Pass the release and check that it became the next version
// Pass the release and check that it became the next version
verMajor
,
verMinor
,
verPatch
,
verCommit
=
uint32
(
i
),
uint32
(
i
+
1
),
uint32
(
i
+
2
),
[
20
]
byte
{}
verMajor
,
verMinor
,
verPatch
,
verCommit
=
uint32
(
i
),
uint32
(
i
+
1
),
uint32
(
i
+
2
),
[
20
]
byte
{
byte
(
i
+
3
)
}
if
_
,
err
=
oracle
.
Release
(
bind
.
NewKeyedTransactor
(
keys
[(
i
+
1
)
/
2
]),
uint32
(
i
),
uint32
(
i
+
1
),
uint32
(
i
+
2
),
[
20
]
byte
{});
err
!=
nil
{
if
_
,
err
=
oracle
.
Release
(
bind
.
NewKeyedTransactor
(
keys
[(
i
+
1
)
/
2
]),
uint32
(
i
),
uint32
(
i
+
1
),
uint32
(
i
+
2
),
[
20
]
byte
{
byte
(
i
+
3
)
});
err
!=
nil
{
t
.
Fatalf
(
"Iter #%d: failed valid release completion attempt: %v"
,
i
,
err
)
t
.
Fatalf
(
"Iter #%d: failed valid release completion attempt: %v"
,
i
,
err
)
}
}
sim
.
Commit
()
sim
.
Commit
()
...
@@ -293,7 +293,7 @@ func TestVersionNuking(t *testing.T) {
...
@@ -293,7 +293,7 @@ func TestVersionNuking(t *testing.T) {
for
i
:=
1
;
i
<
(
len
(
keys
)
+
1
)
/
2
;
i
++
{
for
i
:=
1
;
i
<
(
len
(
keys
)
+
1
)
/
2
;
i
++
{
// Propose release with an initial set of signers
// Propose release with an initial set of signers
for
j
:=
0
;
j
<
i
;
j
++
{
for
j
:=
0
;
j
<
i
;
j
++
{
if
_
,
err
:=
oracle
.
Release
(
bind
.
NewKeyedTransactor
(
keys
[
j
]),
uint32
(
i
),
uint32
(
i
+
1
),
uint32
(
i
+
2
),
[
20
]
byte
{});
err
!=
nil
{
if
_
,
err
:=
oracle
.
Release
(
bind
.
NewKeyedTransactor
(
keys
[
j
]),
uint32
(
i
),
uint32
(
i
+
1
),
uint32
(
i
+
2
),
[
20
]
byte
{
byte
(
i
+
3
)
});
err
!=
nil
{
t
.
Fatalf
(
"Iter #%d: failed valid proposal attempt: %v"
,
i
,
err
)
t
.
Fatalf
(
"Iter #%d: failed valid proposal attempt: %v"
,
i
,
err
)
}
}
}
}
...
@@ -344,7 +344,7 @@ func TestVersionAutoNuke(t *testing.T) {
...
@@ -344,7 +344,7 @@ func TestVersionAutoNuke(t *testing.T) {
sim
.
Commit
()
sim
.
Commit
()
}
}
// Make a release proposal and check it's existence
// Make a release proposal and check it's existence
if
_
,
err
:=
oracle
.
Release
(
bind
.
NewKeyedTransactor
(
keys
[
0
]),
1
,
2
,
3
,
[
20
]
byte
{});
err
!=
nil
{
if
_
,
err
:=
oracle
.
Release
(
bind
.
NewKeyedTransactor
(
keys
[
0
]),
1
,
2
,
3
,
[
20
]
byte
{
4
});
err
!=
nil
{
t
.
Fatalf
(
"Failed valid proposal attempt: %v"
,
err
)
t
.
Fatalf
(
"Failed valid proposal attempt: %v"
,
err
)
}
}
sim
.
Commit
()
sim
.
Commit
()
...
...
contracts/
release/generator.go
→
release/generator.go
View file @
586eddfd
File moved
release/release.go
0 → 100644
View file @
586eddfd
// Copyright 2016 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 release contains the node service that tracks client releases.
package
release
import
(
"fmt"
"strings"
"time"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/eth"
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/logger/glog"
"github.com/ethereum/go-ethereum/node"
"github.com/ethereum/go-ethereum/p2p"
"github.com/ethereum/go-ethereum/rpc"
)
// Interval to check for new releases
const
releaseRecheckInterval
=
time
.
Hour
// Config contains the configurations of the release service.
type
Config
struct
{
Oracle
common
.
Address
// Ethereum address of the release oracle
Major
uint32
// Major version component of the release
Minor
uint32
// Minor version component of the release
Patch
uint32
// Patch version component of the release
Commit
[
20
]
byte
// Git SHA1 commit hash of the release
}
// ReleaseService is a node service that periodically checks the blockchain for
// newly released versions of the client being run and issues a warning to the
// user about it.
type
ReleaseService
struct
{
config
Config
// Current version to check releases against
oracle
*
ReleaseOracle
// Native binding to the release oracle contract
quit
chan
chan
error
// Quit channel to terminate the version checker
}
// NewReleaseService creates a new service to periodically check for new client
// releases and notify the user of such.
func
NewReleaseService
(
ctx
*
node
.
ServiceContext
,
config
Config
)
(
node
.
Service
,
error
)
{
// Retrieve the Ethereum service dependency to access the blockchain
var
ethereum
*
eth
.
Ethereum
if
err
:=
ctx
.
Service
(
&
ethereum
);
err
!=
nil
{
return
nil
,
err
}
// Construct the release service
contract
,
err
:=
NewReleaseOracle
(
config
.
Oracle
,
eth
.
NewContractBackend
(
ethereum
))
if
err
!=
nil
{
return
nil
,
err
}
return
&
ReleaseService
{
config
:
config
,
oracle
:
contract
,
quit
:
make
(
chan
chan
error
),
},
nil
}
// Protocols returns an empty list of P2P protocols as the release service does
// not have a networking component.
func
(
r
*
ReleaseService
)
Protocols
()
[]
p2p
.
Protocol
{
return
nil
}
// APIs returns an empty list of RPC descriptors as the release service does not
// expose any functioanlity to the outside world.
func
(
r
*
ReleaseService
)
APIs
()
[]
rpc
.
API
{
return
nil
}
// Start spawns the periodic version checker goroutine
func
(
r
*
ReleaseService
)
Start
(
server
*
p2p
.
Server
)
error
{
go
r
.
checker
()
return
nil
}
// Stop terminates all goroutines belonging to the service, blocking until they
// are all terminated.
func
(
r
*
ReleaseService
)
Stop
()
error
{
errc
:=
make
(
chan
error
)
r
.
quit
<-
errc
return
<-
errc
}
// checker runs indefinitely in the background, periodically checking for new
// client releases.
func
(
r
*
ReleaseService
)
checker
()
{
// Set up the timers to periodically check for releases
timer
:=
time
.
NewTimer
(
0
)
// Immediately fire a version check
defer
timer
.
Stop
()
for
{
select
{
// If the time arrived, check for a new release
case
<-
timer
.
C
:
// Rechedule the timer before continuing
timer
.
Reset
(
releaseRecheckInterval
)
// Retrieve the current version, and handle missing contracts gracefully
version
,
err
:=
r
.
oracle
.
CurrentVersion
(
nil
)
if
err
!=
nil
{
if
err
==
bind
.
ErrNoCode
{
glog
.
V
(
logger
.
Debug
)
.
Infof
(
"Release oracle not found at %x"
,
r
.
config
.
Oracle
)
continue
}
glog
.
V
(
logger
.
Error
)
.
Infof
(
"Failed to retrieve current release: %v"
,
err
)
continue
}
// Version was successfully retrieved, notify if newer than ours
if
version
.
Major
>
r
.
config
.
Major
||
(
version
.
Major
==
r
.
config
.
Major
&&
version
.
Minor
>
r
.
config
.
Minor
)
||
(
version
.
Major
==
r
.
config
.
Major
&&
version
.
Minor
==
r
.
config
.
Minor
&&
version
.
Patch
>
r
.
config
.
Patch
)
{
warning
:=
fmt
.
Sprintf
(
"Client v%d.%d.%d-%x seems older than the latest upstream release v%d.%d.%d-%x"
,
r
.
config
.
Major
,
r
.
config
.
Minor
,
r
.
config
.
Patch
,
r
.
config
.
Commit
[
:
4
],
version
.
Major
,
version
.
Minor
,
version
.
Patch
,
version
.
Commit
[
:
4
])
howtofix
:=
fmt
.
Sprintf
(
"Please check https://github.com/ethereum/go-ethereum/releases for new releases"
)
separator
:=
strings
.
Repeat
(
"-"
,
len
(
warning
))
glog
.
V
(
logger
.
Warn
)
.
Info
(
separator
)
glog
.
V
(
logger
.
Warn
)
.
Info
(
warning
)
glog
.
V
(
logger
.
Warn
)
.
Info
(
howtofix
)
glog
.
V
(
logger
.
Warn
)
.
Info
(
separator
)
}
else
{
glog
.
V
(
logger
.
Debug
)
.
Infof
(
"Client v%d.%d.%d-%x seems up to date with upstream v%d.%d.%d-%x"
,
r
.
config
.
Major
,
r
.
config
.
Minor
,
r
.
config
.
Patch
,
r
.
config
.
Commit
[
:
4
],
version
.
Major
,
version
.
Minor
,
version
.
Patch
,
version
.
Commit
[
:
4
])
}
// If termination was requested, return
case
errc
:=
<-
r
.
quit
:
errc
<-
nil
return
}
}
}
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