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
af6971f8
Commit
af6971f8
authored
Mar 02, 2015
by
zelig
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'upstream/develop' into blockpool2
parents
a60a18b0
65cad14f
Changes
41
Show whitespace changes
Inline
Side-by-side
Showing
41 changed files
with
1032 additions
and
624 deletions
+1032
-624
.travis.yml
.travis.yml
+2
-2
Dockerfile
Dockerfile
+6
-6
Godeps.json
Godeps/Godeps.json
+5
-6
LICENSE
Godeps/_workspace/src/bitbucket.org/kardianos/osext/LICENSE
+0
-20
LICENSE
Godeps/_workspace/src/github.com/kardianos/osext/LICENSE
+27
-0
README.md
Godeps/_workspace/src/github.com/kardianos/osext/README.md
+14
-0
osext.go
Godeps/_workspace/src/github.com/kardianos/osext/osext.go
+0
-5
osext_plan9.go
.../_workspace/src/github.com/kardianos/osext/osext_plan9.go
+9
-9
osext_procfs.go
..._workspace/src/github.com/kardianos/osext/osext_procfs.go
+5
-2
osext_sysctl.go
..._workspace/src/github.com/kardianos/osext/osext_sysctl.go
+0
-0
osext_test.go
...s/_workspace/src/github.com/kardianos/osext/osext_test.go
+0
-0
osext_windows.go
...workspace/src/github.com/kardianos/osext/osext_windows.go
+0
-0
account_manager.go
accounts/account_manager.go
+42
-9
accounts_test.go
accounts/accounts_test.go
+51
-2
flags.go
cmd/ethereum/flags.go
+45
-34
main.go
cmd/ethereum/main.go
+23
-20
repl.go
cmd/ethereum/repl/repl.go
+1
-0
info.html
cmd/mist/assets/examples/info.html
+5
-2
ethereum.js
cmd/mist/assets/ext/ethereum.js/dist/ethereum.js
+452
-282
main.qml
cmd/mist/assets/qml/main.qml
+1
-1
flags.go
cmd/mist/flags.go
+28
-55
main.go
cmd/mist/main.go
+2
-2
cmd.go
cmd/utils/cmd.go
+2
-31
block_processor.go
core/block_processor.go
+10
-5
genesis.go
core/genesis.go
+0
-2
state_transition.go
core/state_transition.go
+2
-2
backend.go
eth/backend.go
+2
-1
common.go
ethutil/common.go
+38
-0
javascript_runtime.go
javascript/javascript_runtime.go
+9
-49
js_lib.go
javascript/js_lib.go
+1
-1
miner.go
miner/miner.go
+1
-6
worker.go
miner/worker.go
+16
-2
api.go
rpc/api.go
+136
-38
server.go
rpc/http/server.go
+5
-3
messages.go
rpc/messages.go
+13
-0
dump.go
state/dump.go
+6
-3
state_object.go
state/state_object.go
+15
-6
frontend.go
ui/frontend.go
+18
-0
vm.go
vm/vm.go
+15
-8
state.go
xeth/state.go
+7
-6
xeth.go
xeth/xeth.go
+18
-4
No files found.
.travis.yml
View file @
af6971f8
language
:
go
go
:
-
1.4.
1
-
1.4.
2
before_install
:
-
sudo add-apt-repository ppa:beineri/opt-qt54 -y
-
sudo add-apt-repository ppa:beineri/opt-qt54
1
-y
-
sudo apt-get update -qq
-
sudo apt-get install -yqq libgmp3-dev libreadline6-dev qt54quickcontrols qt54webengine
install
:
...
...
Dockerfile
View file @
af6971f8
FROM
ubuntu:14.04.
1
FROM
ubuntu:14.04.
2
## Environment setup
ENV
HOME /root
...
...
@@ -12,22 +12,22 @@ ENV DEBIAN_FRONTEND noninteractive
RUN
apt-get update
&&
apt-get upgrade
-y
RUN
apt-get
install
-y
git mercurial build-essential software-properties-common wget pkg-config libgmp3-dev libreadline6-dev libpcre3-dev libpcre++-dev
## Install Qt5.4 (not required for CLI)
# RUN add-apt-repository ppa:beineri/opt-qt54-trusty -y
## Install Qt5.4
.1
(not required for CLI)
# RUN add-apt-repository ppa:beineri/opt-qt54
1
-trusty -y
# RUN apt-get update -y
# RUN apt-get install -y qt54quickcontrols qt54webengine mesa-common-dev libglu1-mesa-dev
# ENV PKG_CONFIG_PATH /opt/qt54/lib/pkgconfig
# Install Golang
RUN
wget https://storage.googleapis.com/golang/go1.4.
1
.linux-amd64.tar.gz
RUN
wget https://storage.googleapis.com/golang/go1.4.
2
.linux-amd64.tar.gz
RUN
tar
-C
/usr/local
-xzf
go
*
.tar.gz
&&
go version
# this is a workaround, to make sure that docker's cache is invalidated whenever the git repo changes
ADD
https://api.github.com/repos/ethereum/go-ethereum/git/refs/heads/develop file_does_not_exist
## Fetch and install go-ethereum
RUN
go get
-v
github.com/tools/godep
RUN
go get
-
v
-
d
github.com/ethereum/go-ethereum/...
RUN
go get github.com/tools/godep
RUN
go get
-d
github.com/ethereum/go-ethereum/...
WORKDIR
$GOPATH/src/github.com/ethereum/go-ethereum
RUN
git checkout develop
RUN
godep restore
...
...
Godeps/Godeps.json
View file @
af6971f8
{
"ImportPath"
:
"github.com/ethereum/go-ethereum"
,
"GoVersion"
:
"go1.4.
1
"
,
"GoVersion"
:
"go1.4.
2
"
,
"Packages"
:
[
"./..."
],
"Deps"
:
[
{
"ImportPath"
:
"bitbucket.org/kardianos/osext"
,
"Comment"
:
"null-13"
,
"Rev"
:
"5d3ddcf53a508cc2f7404eaebf546ef2cb5cdb6e"
},
{
"ImportPath"
:
"code.google.com/p/go-uuid/uuid"
,
"Comment"
:
"null-12"
,
...
...
@@ -37,6 +32,10 @@
"ImportPath"
:
"github.com/jackpal/go-nat-pmp"
,
"Rev"
:
"a45aa3d54aef73b504e15eb71bea0e5565b5e6e1"
},
{
"ImportPath"
:
"github.com/kardianos/osext"
,
"Rev"
:
"ccfcd0245381f0c94c68f50626665eed3c6b726a"
},
{
"ImportPath"
:
"github.com/obscuren/otto"
,
"Rev"
:
"cf13cc4228c5e5ce0fe27a7aea90bc10091c4f19"
...
...
Godeps/_workspace/src/bitbucket.org/kardianos/osext/LICENSE
deleted
100644 → 0
View file @
a60a18b0
Copyright (c) 2012 Daniel Theophanes
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.
Godeps/_workspace/src/github.com/kardianos/osext/LICENSE
0 → 100644
View file @
af6971f8
Copyright (c) 2012 The Go Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Godeps/_workspace/src/github.com/kardianos/osext/README.md
0 → 100644
View file @
af6971f8
### Extensions to the "os" package.
## Find the current Executable and ExecutableFolder.
There is sometimes utility in finding the current executable file
that is running. This can be used for upgrading the current executable
or finding resources located relative to the executable file.
Multi-platform and supports:
*
Linux
*
OS X
*
Windows
*
Plan 9
*
BSDs.
Godeps/_workspace/src/
bitbucket.org
/kardianos/osext/osext.go
→
Godeps/_workspace/src/
github.com
/kardianos/osext/osext.go
View file @
af6971f8
...
...
@@ -25,8 +25,3 @@ func ExecutableFolder() (string, error) {
folder
,
_
:=
filepath
.
Split
(
p
)
return
folder
,
nil
}
// Depricated. Same as Executable().
func
GetExePath
()
(
exePath
string
,
err
error
)
{
return
Executable
()
}
Godeps/_workspace/src/
bitbucket.org
/kardianos/osext/osext_plan9.go
→
Godeps/_workspace/src/
github.com
/kardianos/osext/osext_plan9.go
View file @
af6971f8
...
...
@@ -5,9 +5,9 @@
package
osext
import
(
"syscall"
"os"
"strconv"
"syscall"
)
func
executable
()
(
string
,
error
)
{
...
...
Godeps/_workspace/src/
bitbucket.org
/kardianos/osext/osext_procfs.go
→
Godeps/_workspace/src/
github.com
/kardianos/osext/osext_procfs.go
View file @
af6971f8
...
...
@@ -2,12 +2,13 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build linux netbsd openbsd
// +build linux netbsd openbsd
solaris dragonfly
package
osext
import
(
"errors"
"fmt"
"os"
"runtime"
)
...
...
@@ -18,8 +19,10 @@ func executable() (string, error) {
return
os
.
Readlink
(
"/proc/self/exe"
)
case
"netbsd"
:
return
os
.
Readlink
(
"/proc/curproc/exe"
)
case
"openbsd"
:
case
"openbsd"
,
"dragonfly"
:
return
os
.
Readlink
(
"/proc/curproc/file"
)
case
"solaris"
:
return
os
.
Readlink
(
fmt
.
Sprintf
(
"/proc/%d/path/a.out"
,
os
.
Getpid
()))
}
return
""
,
errors
.
New
(
"ExecPath not implemented for "
+
runtime
.
GOOS
)
}
Godeps/_workspace/src/
bitbucket.org
/kardianos/osext/osext_sysctl.go
→
Godeps/_workspace/src/
github.com
/kardianos/osext/osext_sysctl.go
View file @
af6971f8
File moved
Godeps/_workspace/src/
bitbucket.org
/kardianos/osext/osext_test.go
→
Godeps/_workspace/src/
github.com
/kardianos/osext/osext_test.go
View file @
af6971f8
File moved
Godeps/_workspace/src/
bitbucket.org
/kardianos/osext/osext_windows.go
→
Godeps/_workspace/src/
github.com
/kardianos/osext/osext_windows.go
View file @
af6971f8
File moved
accounts/account_manager.go
View file @
af6971f8
...
...
@@ -34,9 +34,16 @@ package accounts
import
(
crand
"crypto/rand"
"errors"
"sync"
"time"
"github.com/ethereum/go-ethereum/crypto"
)
var
ErrLocked
=
errors
.
New
(
"account is locked; please request passphrase"
)
// TODO: better name for this struct?
type
Account
struct
{
Address
[]
byte
...
...
@@ -44,14 +51,17 @@ type Account struct {
type
AccountManager
struct
{
keyStore
crypto
.
KeyStore2
unlockedKeys
map
[
string
]
crypto
.
Key
unlockMilliseconds
time
.
Duration
mutex
sync
.
RWMutex
}
// TODO: get key by addr - modify KeyStore2 GetKey to work with addr
// TODO: pass through passphrase for APIs which require access to private key?
func
NewAccountManager
(
keyStore
crypto
.
KeyStore2
)
AccountManager
{
func
NewAccountManager
(
keyStore
crypto
.
KeyStore2
,
unlockMilliseconds
time
.
Duration
)
AccountManager
{
keysMap
:=
make
(
map
[
string
]
crypto
.
Key
)
am
:=
&
AccountManager
{
keyStore
:
keyStore
,
unlockedKeys
:
keysMap
,
unlockMilliseconds
:
unlockMilliseconds
,
}
return
*
am
}
...
...
@@ -60,11 +70,26 @@ func (am AccountManager) DeleteAccount(address []byte, auth string) error {
return
am
.
keyStore
.
DeleteKey
(
address
,
auth
)
}
func
(
am
*
AccountManager
)
Sign
(
fromAccount
*
Account
,
keyAuth
string
,
toSign
[]
byte
)
(
signature
[]
byte
,
err
error
)
{
func
(
am
*
AccountManager
)
Sign
(
fromAccount
*
Account
,
toSign
[]
byte
)
(
signature
[]
byte
,
err
error
)
{
am
.
mutex
.
RLock
()
unlockedKey
:=
am
.
unlockedKeys
[
string
(
fromAccount
.
Address
)]
am
.
mutex
.
RUnlock
()
if
unlockedKey
.
Address
==
nil
{
return
nil
,
ErrLocked
}
signature
,
err
=
crypto
.
Sign
(
toSign
,
unlockedKey
.
PrivateKey
)
return
signature
,
err
}
func
(
am
*
AccountManager
)
SignLocked
(
fromAccount
*
Account
,
keyAuth
string
,
toSign
[]
byte
)
(
signature
[]
byte
,
err
error
)
{
key
,
err
:=
am
.
keyStore
.
GetKey
(
fromAccount
.
Address
,
keyAuth
)
if
err
!=
nil
{
return
nil
,
err
}
am
.
mutex
.
RLock
()
am
.
unlockedKeys
[
string
(
fromAccount
.
Address
)]
=
*
key
am
.
mutex
.
RUnlock
()
go
unlockLater
(
am
,
fromAccount
.
Address
)
signature
,
err
=
crypto
.
Sign
(
toSign
,
key
.
PrivateKey
)
return
signature
,
err
}
...
...
@@ -80,8 +105,6 @@ func (am AccountManager) NewAccount(auth string) (*Account, error) {
return
ua
,
err
}
// set of accounts == set of keys in given key store
// TODO: do we need persistence of accounts as well?
func
(
am
*
AccountManager
)
Accounts
()
([]
Account
,
error
)
{
addresses
,
err
:=
am
.
keyStore
.
GetKeyAddresses
()
if
err
!=
nil
{
...
...
@@ -97,3 +120,13 @@ func (am *AccountManager) Accounts() ([]Account, error) {
}
return
accounts
,
err
}
func
unlockLater
(
am
*
AccountManager
,
addr
[]
byte
)
{
select
{
case
<-
time
.
After
(
time
.
Millisecond
*
am
.
unlockMilliseconds
)
:
}
am
.
mutex
.
RLock
()
// TODO: how do we know the key is actually gone from memory?
delete
(
am
.
unlockedKeys
,
string
(
addr
))
am
.
mutex
.
RUnlock
()
}
accounts/accounts_test.go
View file @
af6971f8
...
...
@@ -6,19 +6,68 @@ import (
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/crypto/randentropy"
"github.com/ethereum/go-ethereum/ethutil"
"time"
)
func
TestAccountManager
(
t
*
testing
.
T
)
{
ks
:=
crypto
.
NewKeyStorePlain
(
ethutil
.
DefaultDataDir
()
+
"/testaccounts"
)
am
:=
NewAccountManager
(
ks
)
am
:=
NewAccountManager
(
ks
,
100
)
pass
:=
""
// not used but required by API
a1
,
err
:=
am
.
NewAccount
(
pass
)
toSign
:=
randentropy
.
GetEntropyCSPRNG
(
32
)
_
,
err
=
am
.
Sign
(
a1
,
pass
,
toSign
)
_
,
err
=
am
.
Sign
Locked
(
a1
,
pass
,
toSign
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
// Cleanup
time
.
Sleep
(
time
.
Millisecond
*
150
)
// wait for locking
accounts
,
err
:=
am
.
Accounts
()
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
for
_
,
account
:=
range
accounts
{
err
:=
am
.
DeleteAccount
(
account
.
Address
,
pass
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
}
}
func
TestAccountManagerLocking
(
t
*
testing
.
T
)
{
ks
:=
crypto
.
NewKeyStorePassphrase
(
ethutil
.
DefaultDataDir
()
+
"/testaccounts"
)
am
:=
NewAccountManager
(
ks
,
200
)
pass
:=
"foo"
a1
,
err
:=
am
.
NewAccount
(
pass
)
toSign
:=
randentropy
.
GetEntropyCSPRNG
(
32
)
// Signing without passphrase fails because account is locked
_
,
err
=
am
.
Sign
(
a1
,
toSign
)
if
err
!=
ErrLocked
{
t
.
Fatal
(
err
)
}
// Signing with passphrase works
_
,
err
=
am
.
SignLocked
(
a1
,
pass
,
toSign
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
// Signing without passphrase works because account is temp unlocked
_
,
err
=
am
.
Sign
(
a1
,
toSign
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
// Signing without passphrase fails after automatic locking
time
.
Sleep
(
time
.
Millisecond
*
time
.
Duration
(
250
))
_
,
err
=
am
.
Sign
(
a1
,
toSign
)
if
err
!=
ErrLocked
{
t
.
Fatal
(
err
)
}
// Cleanup
accounts
,
err
:=
am
.
Accounts
()
if
err
!=
nil
{
...
...
cmd/ethereum/flags.go
View file @
af6971f8
...
...
@@ -27,6 +27,7 @@ import (
"log"
"os"
"path"
"runtime"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethutil"
...
...
@@ -43,6 +44,7 @@ var (
KeyStore
string
StartRpc
bool
StartWebSockets
bool
RpcListenAddress
string
RpcPort
int
WsPort
int
OutboundPort
string
...
...
@@ -70,6 +72,7 @@ var (
SHH
bool
Dial
bool
PrintVersion
bool
MinerThreads
int
)
// flags specific to cli client
...
...
@@ -93,6 +96,7 @@ func Init() {
flag
.
StringVar
(
&
KeyRing
,
"keyring"
,
""
,
"identifier for keyring to use"
)
flag
.
StringVar
(
&
KeyStore
,
"keystore"
,
"db"
,
"system to store keyrings: db|file (db)"
)
flag
.
StringVar
(
&
RpcListenAddress
,
"rpcaddr"
,
"127.0.0.1"
,
"address for json-rpc server to listen on"
)
flag
.
IntVar
(
&
RpcPort
,
"rpcport"
,
8545
,
"port to start json-rpc server on"
)
flag
.
IntVar
(
&
WsPort
,
"wsport"
,
40404
,
"port to start websocket rpc server on"
)
flag
.
BoolVar
(
&
StartRpc
,
"rpc"
,
false
,
"start rpc server"
)
...
...
@@ -119,6 +123,7 @@ func Init() {
flag
.
BoolVar
(
&
StartMining
,
"mine"
,
false
,
"start dagger mining"
)
flag
.
BoolVar
(
&
StartJsConsole
,
"js"
,
false
,
"launches javascript console"
)
flag
.
BoolVar
(
&
PrintVersion
,
"version"
,
false
,
"prints version number"
)
flag
.
IntVar
(
&
MinerThreads
,
"minerthreads"
,
runtime
.
NumCPU
(),
"number of miner threads"
)
// Network stuff
var
(
...
...
@@ -135,6 +140,12 @@ func Init() {
flag
.
Parse
()
// When the javascript console is started log to a file instead
// of stdout
if
StartJsConsole
{
LogFile
=
path
.
Join
(
Datadir
,
"ethereum.log"
)
}
var
err
error
if
NAT
,
err
=
nat
.
Parse
(
*
natstr
);
err
!=
nil
{
log
.
Fatalf
(
"-nat: %v"
,
err
)
...
...
cmd/ethereum/main.go
View file @
af6971f8
...
...
@@ -37,7 +37,7 @@ import (
const
(
ClientIdentifier
=
"Ethereum(G)"
Version
=
"0.8.
5
"
Version
=
"0.8.
6
"
)
var
clilogger
=
logger
.
NewLogger
(
"CLI"
)
...
...
@@ -76,6 +76,7 @@ func main() {
Dial
:
Dial
,
BootNodes
:
BootNodes
,
NodeKey
:
NodeKey
,
MinerThreads
:
MinerThreads
,
})
if
err
!=
nil
{
...
...
@@ -113,10 +114,6 @@ func main() {
return
}
if
StartMining
{
utils
.
StartMining
(
ethereum
)
}
if
len
(
ImportChain
)
>
0
{
start
:=
time
.
Now
()
err
:=
utils
.
ImportChain
(
ethereum
,
ImportChain
)
...
...
@@ -128,7 +125,7 @@ func main() {
}
if
StartRpc
{
utils
.
StartRpc
(
ethereum
,
RpcPort
)
utils
.
StartRpc
(
ethereum
,
Rpc
ListenAddress
,
Rpc
Port
)
}
if
StartWebSockets
{
...
...
@@ -137,6 +134,12 @@ func main() {
utils
.
StartEthereum
(
ethereum
)
fmt
.
Printf
(
"Welcome to the FRONTIER
\n
"
)
if
StartMining
{
ethereum
.
Miner
()
.
Start
()
}
if
StartJsConsole
{
InitJsConsole
(
ethereum
)
}
else
if
len
(
InputFile
)
>
0
{
...
...
cmd/ethereum/repl/repl.go
View file @
af6971f8
...
...
@@ -60,6 +60,7 @@ func (self *JSRepl) Start() {
if
!
self
.
running
{
self
.
running
=
true
repllogger
.
Infoln
(
"init JS Console"
)
reader
:=
bufio
.
NewReader
(
self
.
history
)
for
{
line
,
err
:=
reader
.
ReadString
(
'\n'
)
...
...
cmd/mist/assets/examples/info.html
View file @
af6971f8
...
...
@@ -62,6 +62,8 @@
web3
.
setProvider
(
new
web3
.
providers
.
HttpSyncProvider
(
'http://localhost:8545'
));
eth
.
defaultBlock
=
-
2
document
.
querySelector
(
"#number"
).
innerHTML
=
eth
.
number
;
document
.
querySelector
(
"#coinbase"
).
innerHTML
=
eth
.
coinbase
document
.
querySelector
(
"#peer_count"
).
innerHTML
=
eth
.
peerCount
;
...
...
@@ -75,6 +77,7 @@
document
.
querySelector
(
"#number"
).
innerHTML
=
eth
.
number
;
});
</script>
</html>
...
...
cmd/mist/assets/ext/ethereum.js/dist/ethereum.js
View file @
af6971f8
...
...
@@ -53,7 +53,6 @@ var inputTypes = types.inputTypes();
/// @returns bytes representation of input params
var
formatInput
=
function
(
inputs
,
params
)
{
var
bytes
=
""
;
var
padding
=
c
.
ETH_PADDING
*
2
;
/// first we iterate in search for dynamic
inputs
.
forEach
(
function
(
input
,
index
)
{
...
...
@@ -110,6 +109,7 @@ var formatOutput = function (outs, output) {
output
=
output
.
slice
(
dynamicPartLength
);
outs
.
forEach
(
function
(
out
,
i
)
{
/*jshint maxcomplexity:6 */
var
typeMatch
=
false
;
for
(
var
j
=
0
;
j
<
outputTypes
.
length
&&
!
typeMatch
;
j
++
)
{
typeMatch
=
outputTypes
[
j
].
type
(
outs
[
i
].
type
);
...
...
@@ -210,7 +210,7 @@ module.exports = {
};
},{
"./const"
:
2
,
"./formatters"
:
6
,
"./types"
:
11
,
"./utils"
:
12
,
"./web3"
:
13
}],
2
:[
function
(
require
,
module
,
exports
){
},{
"./const"
:
2
,
"./formatters"
:
8
,
"./types"
:
14
,
"./utils"
:
15
,
"./web3"
:
17
}],
2
:[
function
(
require
,
module
,
exports
){
/*
This file is part of ethereum.js.
...
...
@@ -264,7 +264,8 @@ module.exports = {
ETH_PADDING
:
32
,
ETH_SIGNATURE_LENGTH
:
4
,
ETH_UNITS
:
ETH_UNITS
,
ETH_BIGNUMBER_ROUNDING_MODE
:
{
ROUNDING_MODE
:
BigNumber
.
ROUND_DOWN
}
ETH_BIGNUMBER_ROUNDING_MODE
:
{
ROUNDING_MODE
:
BigNumber
.
ROUND_DOWN
},
ETH_POLLING_TIMEOUT
:
1000
};
...
...
@@ -340,6 +341,7 @@ var addFunctionsToContract = function (contract, desc, address) {
var
typeName
=
utils
.
extractTypeName
(
method
.
name
);
var
impl
=
function
()
{
/*jshint maxcomplexity:7 */
var
params
=
Array
.
prototype
.
slice
.
call
(
arguments
);
var
signature
=
abi
.
signatureFromAscii
(
method
.
name
);
var
parsed
=
inputParser
[
displayName
][
typeName
].
apply
(
null
,
params
);
...
...
@@ -416,11 +418,11 @@ var addEventsToContract = function (contract, desc, address) {
var
signature
=
abi
.
eventSignatureFromAscii
(
e
.
name
);
var
event
=
eventImpl
.
inputParser
(
address
,
signature
,
e
);
var
o
=
event
.
apply
(
null
,
params
);
o
.
_onWatchEventResult
=
function
(
data
)
{
var
outputFormatter
=
function
(
data
)
{
var
parser
=
eventImpl
.
outputParser
(
e
);
return
parser
(
data
);
};
return
web3
.
eth
.
watch
(
o
);
return
web3
.
eth
.
watch
(
o
,
undefined
,
undefined
,
outputFormatter
);
};
// this property should be used by eth.filter to check if object is an event
...
...
@@ -487,7 +489,131 @@ var contract = function (address, desc) {
module
.
exports
=
contract
;
},{
"./abi"
:
1
,
"./event"
:
4
,
"./utils"
:
12
,
"./web3"
:
13
}],
4
:[
function
(
require
,
module
,
exports
){
},{
"./abi"
:
1
,
"./event"
:
6
,
"./utils"
:
15
,
"./web3"
:
17
}],
4
:[
function
(
require
,
module
,
exports
){
/*
This file is part of ethereum.js.
ethereum.js 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.
ethereum.js 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 ethereum.js. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file db.js
* @authors:
* Marek Kotewicz <marek@ethdev.com>
* @date 2015
*/
/// @returns an array of objects describing web3.db api methods
var
methods
=
function
()
{
return
[
{
name
:
'put'
,
call
:
'db_put'
},
{
name
:
'get'
,
call
:
'db_get'
},
{
name
:
'putString'
,
call
:
'db_putString'
},
{
name
:
'getString'
,
call
:
'db_getString'
}
];
};
module
.
exports
=
{
methods
:
methods
};
},{}],
5
:[
function
(
require
,
module
,
exports
){
/*
This file is part of ethereum.js.
ethereum.js 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.
ethereum.js 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 ethereum.js. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file eth.js
* @authors:
* Marek Kotewicz <marek@ethdev.com>
* @date 2015
*/
/// @returns an array of objects describing web3.eth api methods
var
methods
=
function
()
{
var
blockCall
=
function
(
args
)
{
return
typeof
args
[
0
]
===
"string"
?
"eth_blockByHash"
:
"eth_blockByNumber"
;
};
var
transactionCall
=
function
(
args
)
{
return
typeof
args
[
0
]
===
"string"
?
'eth_transactionByHash'
:
'eth_transactionByNumber'
;
};
var
uncleCall
=
function
(
args
)
{
return
typeof
args
[
0
]
===
"string"
?
'eth_uncleByHash'
:
'eth_uncleByNumber'
;
};
var
transactionCountCall
=
function
(
args
)
{
return
typeof
args
[
0
]
===
"string"
?
'eth_transactionCountByHash'
:
'eth_transactionCountByNumber'
;
};
var
uncleCountCall
=
function
(
args
)
{
return
typeof
args
[
0
]
===
"string"
?
'eth_uncleCountByHash'
:
'eth_uncleCountByNumber'
;
};
return
[
{
name
:
'balanceAt'
,
call
:
'eth_balanceAt'
},
{
name
:
'stateAt'
,
call
:
'eth_stateAt'
},
{
name
:
'storageAt'
,
call
:
'eth_storageAt'
},
{
name
:
'countAt'
,
call
:
'eth_countAt'
},
{
name
:
'codeAt'
,
call
:
'eth_codeAt'
},
{
name
:
'transact'
,
call
:
'eth_transact'
},
{
name
:
'call'
,
call
:
'eth_call'
},
{
name
:
'block'
,
call
:
blockCall
},
{
name
:
'transaction'
,
call
:
transactionCall
},
{
name
:
'uncle'
,
call
:
uncleCall
},
{
name
:
'compilers'
,
call
:
'eth_compilers'
},
{
name
:
'flush'
,
call
:
'eth_flush'
},
{
name
:
'lll'
,
call
:
'eth_lll'
},
{
name
:
'solidity'
,
call
:
'eth_solidity'
},
{
name
:
'serpent'
,
call
:
'eth_serpent'
},
{
name
:
'logs'
,
call
:
'eth_logs'
},
{
name
:
'transactionCount'
,
call
:
transactionCountCall
},
{
name
:
'uncleCount'
,
call
:
uncleCountCall
}
];
};
/// @returns an array of objects describing web3.eth api properties
var
properties
=
function
()
{
return
[
{
name
:
'coinbase'
,
getter
:
'eth_coinbase'
,
setter
:
'eth_setCoinbase'
},
{
name
:
'listening'
,
getter
:
'eth_listening'
,
setter
:
'eth_setListening'
},
{
name
:
'mining'
,
getter
:
'eth_mining'
,
setter
:
'eth_setMining'
},
{
name
:
'gasPrice'
,
getter
:
'eth_gasPrice'
},
{
name
:
'accounts'
,
getter
:
'eth_accounts'
},
{
name
:
'peerCount'
,
getter
:
'eth_peerCount'
},
{
name
:
'defaultBlock'
,
getter
:
'eth_defaultBlock'
,
setter
:
'eth_setDefaultBlock'
},
{
name
:
'number'
,
getter
:
'eth_number'
}
];
};
module
.
exports
=
{
methods
:
methods
,
properties
:
properties
};
},{}],
6
:[
function
(
require
,
module
,
exports
){
/*
This file is part of ethereum.js.
...
...
@@ -571,9 +697,9 @@ var getArgumentsObject = function (inputs, indexed, notIndexed) {
return
inputs
.
reduce
(
function
(
acc
,
current
)
{
var
value
;
if
(
current
.
indexed
)
value
=
indexed
.
splice
(
0
,
1
)[
0
];
value
=
indexed
Copy
.
splice
(
0
,
1
)[
0
];
else
value
=
notIndexed
.
splice
(
0
,
1
)[
0
];
value
=
notIndexed
Copy
.
splice
(
0
,
1
)[
0
];
acc
[
current
.
name
]
=
value
;
return
acc
;
...
...
@@ -589,6 +715,7 @@ var outputParser = function (event) {
args
:
{}
};
output
.
topics
=
output
.
topic
;
// fallback for go-ethereum
if
(
!
output
.
topic
)
{
return
result
;
}
...
...
@@ -624,7 +751,7 @@ module.exports = {
};
},{
"./abi"
:
1
,
"./utils"
:
1
2
}],
5
:[
function
(
require
,
module
,
exports
){
},{
"./abi"
:
1
,
"./utils"
:
1
5
}],
7
:[
function
(
require
,
module
,
exports
){
/*
This file is part of ethereum.js.
...
...
@@ -650,24 +777,33 @@ module.exports = {
* @date 2014
*/
var
web3
=
require
(
'./web3'
);
// jshint ignore:line
/// should be used when we want to watch something
/// it's using inner polling mechanism and is notified about changes
/// TODO: change 'options' name cause it may be not the best matching one, since we have events
var
Filter
=
function
(
options
,
impl
)
{
/// Should be called to check if filter implementation is valid
/// @returns true if it is, otherwise false
var
implementationIsValid
=
function
(
i
)
{
return
!!
i
&&
typeof
i
.
newFilter
===
'function'
&&
typeof
i
.
getMessages
===
'function'
&&
typeof
i
.
uninstallFilter
===
'function'
&&
typeof
i
.
startPolling
===
'function'
&&
typeof
i
.
stopPolling
===
'function'
;
};
/// This method should be called on options object, to verify deprecated properties && lazy load dynamic ones
/// @param should be string or object
/// @returns options string or object
var
getOptions
=
function
(
options
)
{
if
(
typeof
options
===
'string'
)
{
return
options
;
}
if
(
typeof
options
!==
"string"
)
{
options
=
options
||
{};
// topics property is deprecated, warn about it!
if
(
options
.
topics
)
{
console
.
warn
(
'"topics" is deprecated, use
"topic" instead'
);
console
.
warn
(
'"topics" is deprecated, is
"topic" instead'
);
}
this
.
_onWatchResult
=
options
.
_onWatchEventResult
;
// evaluate lazy properties
options
=
{
return
{
to
:
options
.
to
,
topic
:
options
.
topic
,
earliest
:
options
.
earliest
,
...
...
@@ -676,58 +812,61 @@ var Filter = function(options, impl) {
skip
:
options
.
skip
,
address
:
options
.
address
};
};
/// Should be used when we want to watch something
/// it's using inner polling mechanism and is notified about changes
/// @param options are filter options
/// @param implementation, an abstract polling implementation
/// @param formatter (optional), callback function which formats output before 'real' callback
var
filter
=
function
(
options
,
implementation
,
formatter
)
{
if
(
!
implementationIsValid
(
implementation
))
{
console
.
error
(
'filter implemenation is invalid'
);
return
;
}
this
.
impl
=
impl
;
this
.
callbacks
=
[];
options
=
getOptions
(
options
);
var
callbacks
=
[];
var
filterId
=
implementation
.
newFilter
(
options
);
var
onMessages
=
function
(
messages
)
{
messages
.
forEach
(
function
(
message
)
{
message
=
formatter
?
formatter
(
message
)
:
message
;
callbacks
.
forEach
(
function
(
callback
)
{
callback
(
message
);
});
});
};
this
.
id
=
impl
.
newFilter
(
options
);
web3
.
provider
.
startPolling
({
method
:
impl
.
changed
,
params
:
[
this
.
id
]},
this
.
id
,
this
.
trigger
.
bind
(
this
));
};
implementation
.
startPolling
(
filterId
,
onMessages
,
implementation
.
uninstallFilter
);
/// alias for changed*
Filter
.
prototype
.
arrived
=
function
(
callback
)
{
this
.
changed
(
callback
);
};
Filter
.
prototype
.
happened
=
function
(
callback
)
{
this
.
changed
(
callback
);
};
/// gets called when there is new eth/shh message
Filter
.
prototype
.
changed
=
function
(
callback
)
{
this
.
callbacks
.
push
(
callback
);
};
var
changed
=
function
(
callback
)
{
callbacks
.
push
(
callback
);
};
/// trigger calling new message from people
Filter
.
prototype
.
trigger
=
function
(
messages
)
{
for
(
var
i
=
0
;
i
<
this
.
callbacks
.
length
;
i
++
)
{
for
(
var
j
=
0
;
j
<
messages
.
length
;
j
++
)
{
var
message
=
this
.
_onWatchResult
?
this
.
_onWatchResult
(
messages
[
j
])
:
messages
[
j
];
this
.
callbacks
[
i
].
call
(
this
,
message
);
}
}
};
var
messages
=
function
()
{
return
implementation
.
getMessages
(
filterId
);
};
/// should be called to uninstall current filter
Filter
.
prototype
.
uninstall
=
function
()
{
this
.
impl
.
uninstallFilter
(
this
.
i
d
);
web3
.
provider
.
stopPolling
(
this
.
id
)
;
};
var
uninstall
=
function
()
{
implementation
.
stopPolling
(
filterId
);
implementation
.
uninstallFilter
(
filterI
d
);
callbacks
=
[]
;
};
/// should be called to manually trigger getting latest messages from the client
Filter
.
prototype
.
messages
=
function
()
{
return
this
.
impl
.
getMessages
(
this
.
id
);
return
{
changed
:
changed
,
arrived
:
changed
,
happened
:
changed
,
messages
:
messages
,
logs
:
messages
,
uninstall
:
uninstall
};
};
/// alias for messages
Filter
.
prototype
.
logs
=
function
()
{
return
this
.
messages
();
};
module
.
exports
=
filter
;
module
.
exports
=
Filter
;
},{
"./web3"
:
13
}],
6
:[
function
(
require
,
module
,
exports
){
},{
}],
8
:[
function
(
require
,
module
,
exports
){
/*
This file is part of ethereum.js.
...
...
@@ -770,6 +909,7 @@ var padLeft = function (string, chars, sign) {
/// If the value is floating point, round it down
/// @returns right-aligned byte representation of int
var
formatInputInt
=
function
(
value
)
{
/*jshint maxcomplexity:7 */
var
padding
=
c
.
ETH_PADDING
*
2
;
if
(
value
instanceof
BigNumber
||
typeof
value
===
'number'
)
{
if
(
typeof
value
===
'number'
)
...
...
@@ -883,7 +1023,7 @@ module.exports = {
};
},{
"./const"
:
2
,
"./utils"
:
1
2
}],
7
:[
function
(
require
,
module
,
exports
){
},{
"./const"
:
2
,
"./utils"
:
1
5
}],
9
:[
function
(
require
,
module
,
exports
){
/*
This file is part of ethereum.js.
...
...
@@ -923,15 +1063,17 @@ HttpSyncProvider.prototype.send = function (payload) {
request
.
open
(
'POST'
,
this
.
host
,
false
);
request
.
send
(
JSON
.
stringify
(
payload
));
// check request.status
var
result
=
request
.
responseText
;
// check request.status
if
(
request
.
status
!==
200
)
return
;
return
JSON
.
parse
(
result
);
};
module
.
exports
=
HttpSyncProvider
;
},{}],
8
:[
function
(
require
,
module
,
exports
){
},{}],
10
:[
function
(
require
,
module
,
exports
){
/*
This file is part of ethereum.js.
...
...
@@ -998,7 +1140,7 @@ module.exports = {
},{}],
9
:[
function
(
require
,
module
,
exports
){
},{}],
11
:[
function
(
require
,
module
,
exports
){
/*
This file is part of ethereum.js.
...
...
@@ -1015,7 +1157,42 @@ module.exports = {
You should have received a copy of the GNU Lesser General Public License
along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file providermanager.js
/** @file qtsync.js
* @authors:
* Marek Kotewicz <marek@ethdev.com>
* Marian Oancea <marian@ethdev.com>
* @date 2014
*/
var
QtSyncProvider
=
function
()
{
};
QtSyncProvider
.
prototype
.
send
=
function
(
payload
)
{
var
result
=
navigator
.
qt
.
callMethod
(
JSON
.
stringify
(
payload
));
return
JSON
.
parse
(
result
);
};
module
.
exports
=
QtSyncProvider
;
},{}],
12
:[
function
(
require
,
module
,
exports
){
/*
This file is part of ethereum.js.
ethereum.js 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.
ethereum.js 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 ethereum.js. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file requestmanager.js
* @authors:
* Jeffrey Wilcke <jeff@ethdev.com>
* Marek Kotewicz <marek@ethdev.com>
...
...
@@ -1024,51 +1201,28 @@ module.exports = {
* @date 2014
*/
var
web3
=
require
(
'./web3'
);
var
jsonrpc
=
require
(
'./jsonrpc'
);
var
c
=
require
(
'./const'
);
/**
* Provider manager object prototype
* It's responsible for passing messages to providers
* If no provider is set it's responsible for queuing requests
* It's also responsible for polling the ethereum node for incoming messages
* Default poll timeout is 12 seconds
* If we are running ethereum.js inside ethereum browser, there are backend based tools responsible for polling,
* and provider manager polling mechanism is not used
* Default poll timeout is 1 second
*/
var
ProviderManager
=
function
()
{
this
.
polls
=
[];
this
.
provider
=
undefined
;
var
self
=
this
;
var
poll
=
function
()
{
self
.
polls
.
forEach
(
function
(
data
)
{
var
result
=
self
.
send
(
data
.
data
);
if
(
!
(
result
instanceof
Array
)
||
result
.
length
===
0
)
{
return
;
}
data
.
callback
(
result
);
});
setTimeout
(
poll
,
1000
);
};
poll
();
};
var
requestManager
=
function
()
{
var
polls
=
[];
var
timeout
=
null
;
var
provider
;
/// sends outgoing requests
/// @params data - an object with at least 'method' property
ProviderManager
.
prototype
.
send
=
function
(
data
)
{
var
send
=
function
(
data
)
{
var
payload
=
jsonrpc
.
toPayload
(
data
.
method
,
data
.
params
);
if
(
this
.
provider
===
undefined
)
{
if
(
!
provider
)
{
console
.
error
(
'provider is not set'
);
return
null
;
}
var
result
=
this
.
provider
.
send
(
payload
);
var
result
=
provider
.
send
(
payload
);
if
(
!
jsonrpc
.
isValidResponse
(
result
))
{
console
.
log
(
result
);
...
...
@@ -1076,33 +1230,66 @@ ProviderManager.prototype.send = function(data) {
}
return
result
.
result
;
};
};
/// setups provider, which will be used for sending messages
ProviderManager
.
prototype
.
set
=
function
(
provider
)
{
this
.
provider
=
provider
;
};
var
setProvider
=
function
(
p
)
{
provider
=
p
;
};
/// this method is only used, when we do not have native qt bindings and have to do polling on our own
/// should be callled, on start watching for eth/shh changes
ProviderManager
.
prototype
.
startPolling
=
function
(
data
,
pollId
,
callback
)
{
this
.
polls
.
push
({
data
:
data
,
id
:
pollId
,
callback
:
callback
})
;
};
/*jshint maxparams:4 */
var
startPolling
=
function
(
data
,
pollId
,
callback
,
uninstall
)
{
polls
.
push
({
data
:
data
,
id
:
pollId
,
callback
:
callback
,
uninstall
:
uninstall
});
}
;
/*jshint maxparams:3 */
/// should be called to stop polling for certain watch changes
ProviderManager
.
prototype
.
stopPolling
=
function
(
pollId
)
{
for
(
var
i
=
this
.
polls
.
length
;
i
--
;)
{
var
poll
=
this
.
polls
[
i
];
var
stopPolling
=
function
(
pollId
)
{
for
(
var
i
=
polls
.
length
;
i
--
;)
{
var
poll
=
polls
[
i
];
if
(
poll
.
id
===
pollId
)
{
this
.
polls
.
splice
(
i
,
1
);
polls
.
splice
(
i
,
1
);
}
}
};
var
reset
=
function
()
{
polls
.
forEach
(
function
(
poll
)
{
poll
.
uninstall
(
poll
.
id
);
});
polls
=
[];
if
(
timeout
)
{
clearTimeout
(
timeout
);
timeout
=
null
;
}
poll
();
};
var
poll
=
function
()
{
polls
.
forEach
(
function
(
data
)
{
var
result
=
send
(
data
.
data
);
if
(
!
(
result
instanceof
Array
)
||
result
.
length
===
0
)
{
return
;
}
data
.
callback
(
result
);
});
timeout
=
setTimeout
(
poll
,
c
.
ETH_POLLING_TIMEOUT
);
};
poll
();
return
{
send
:
send
,
setProvider
:
setProvider
,
startPolling
:
startPolling
,
stopPolling
:
stopPolling
,
reset
:
reset
};
};
module
.
exports
=
Provider
Manager
;
module
.
exports
=
request
Manager
;
},{
"./
jsonrpc"
:
8
,
"./web3"
:
13
}],
10
:[
function
(
require
,
module
,
exports
){
},{
"./
const"
:
2
,
"./jsonrpc"
:
10
}],
13
:[
function
(
require
,
module
,
exports
){
/*
This file is part of ethereum.js.
...
...
@@ -1119,25 +1306,29 @@ module.exports = ProviderManager;
You should have received a copy of the GNU Lesser General Public License
along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file
qtsync
.js
/** @file
shh
.js
* @authors:
* Marek Kotewicz <marek@ethdev.com>
* Marian Oancea <marian@ethdev.com>
* @date 2014
* @date 2015
*/
var
QtSyncProvider
=
function
()
{
/// @returns an array of objects describing web3.shh api methods
var
methods
=
function
()
{
return
[
{
name
:
'post'
,
call
:
'shh_post'
},
{
name
:
'newIdentity'
,
call
:
'shh_newIdentity'
},
{
name
:
'haveIdentity'
,
call
:
'shh_haveIdentity'
},
{
name
:
'newGroup'
,
call
:
'shh_newGroup'
},
{
name
:
'addToGroup'
,
call
:
'shh_addToGroup'
}
];
};
QtSyncProvider
.
prototype
.
send
=
function
(
payload
)
{
var
result
=
navigator
.
qt
.
callMethod
(
JSON
.
stringify
(
payload
));
return
JSON
.
parse
(
result
);
module
.
exports
=
{
methods
:
methods
};
module
.
exports
=
QtSyncProvider
;
},{}],
1
1
:[
function
(
require
,
module
,
exports
){
},{}],
1
4
:[
function
(
require
,
module
,
exports
){
/*
This file is part of ethereum.js.
...
...
@@ -1218,7 +1409,7 @@ module.exports = {
};
},{
"./formatters"
:
6
}],
12
:[
function
(
require
,
module
,
exports
){
},{
"./formatters"
:
8
}],
15
:[
function
(
require
,
module
,
exports
){
/*
This file is part of ethereum.js.
...
...
@@ -1328,6 +1519,7 @@ var filterEvents = function (json) {
/// TODO: use BigNumber.js to parse int
/// TODO: add tests for it!
var
toEth
=
function
(
str
)
{
/*jshint maxcomplexity:7 */
var
val
=
typeof
str
===
"string"
?
str
.
indexOf
(
'0x'
)
===
0
?
parseInt
(
str
.
substr
(
2
),
16
)
:
parseInt
(
str
)
:
str
;
var
unit
=
0
;
var
units
=
c
.
ETH_UNITS
;
...
...
@@ -1362,7 +1554,7 @@ module.exports = {
};
},{
"./const"
:
2
}],
1
3
:[
function
(
require
,
module
,
exports
){
},{
"./const"
:
2
}],
1
6
:[
function
(
require
,
module
,
exports
){
/*
This file is part of ethereum.js.
...
...
@@ -1379,102 +1571,14 @@ module.exports = {
You should have received a copy of the GNU Lesser General Public License
along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file w
eb3
.js
/** @file w
atches
.js
* @authors:
* Jeffrey Wilcke <jeff@ethdev.com>
* Marek Kotewicz <marek@ethdev.com>
* Marian Oancea <marian@ethdev.com>
* Gav Wood <g@ethdev.com>
* @date 2014
* @date 2015
*/
if
(
"build"
!==
'build'
)
{
/*
var BigNumber = require('bignumber.js');
*/
}
var
utils
=
require
(
'./utils'
);
/// @returns an array of objects describing web3 api methods
var
web3Methods
=
function
()
{
return
[
{
name
:
'sha3'
,
call
:
'web3_sha3'
}
];
};
/// @returns an array of objects describing web3.eth api methods
var
ethMethods
=
function
()
{
var
blockCall
=
function
(
args
)
{
return
typeof
args
[
0
]
===
"string"
?
"eth_blockByHash"
:
"eth_blockByNumber"
;
};
var
transactionCall
=
function
(
args
)
{
return
typeof
args
[
0
]
===
"string"
?
'eth_transactionByHash'
:
'eth_transactionByNumber'
;
};
var
uncleCall
=
function
(
args
)
{
return
typeof
args
[
0
]
===
"string"
?
'eth_uncleByHash'
:
'eth_uncleByNumber'
;
};
var
methods
=
[
{
name
:
'balanceAt'
,
call
:
'eth_balanceAt'
},
{
name
:
'register'
,
call
:
'eth_register'
},
{
name
:
'unregister'
,
call
:
'eth_unregister'
},
{
name
:
'stateAt'
,
call
:
'eth_stateAt'
},
{
name
:
'storageAt'
,
call
:
'eth_storageAt'
},
{
name
:
'countAt'
,
call
:
'eth_countAt'
},
{
name
:
'codeAt'
,
call
:
'eth_codeAt'
},
{
name
:
'transact'
,
call
:
'eth_transact'
},
{
name
:
'call'
,
call
:
'eth_call'
},
{
name
:
'block'
,
call
:
blockCall
},
{
name
:
'transaction'
,
call
:
transactionCall
},
{
name
:
'uncle'
,
call
:
uncleCall
},
{
name
:
'compilers'
,
call
:
'eth_compilers'
},
{
name
:
'flush'
,
call
:
'eth_flush'
},
{
name
:
'lll'
,
call
:
'eth_lll'
},
{
name
:
'solidity'
,
call
:
'eth_solidity'
},
{
name
:
'serpent'
,
call
:
'eth_serpent'
},
{
name
:
'logs'
,
call
:
'eth_logs'
}
];
return
methods
;
};
/// @returns an array of objects describing web3.eth api properties
var
ethProperties
=
function
()
{
return
[
{
name
:
'coinbase'
,
getter
:
'eth_coinbase'
,
setter
:
'eth_setCoinbase'
},
{
name
:
'listening'
,
getter
:
'eth_listening'
,
setter
:
'eth_setListening'
},
{
name
:
'mining'
,
getter
:
'eth_mining'
,
setter
:
'eth_setMining'
},
{
name
:
'gasPrice'
,
getter
:
'eth_gasPrice'
},
{
name
:
'accounts'
,
getter
:
'eth_accounts'
},
{
name
:
'peerCount'
,
getter
:
'eth_peerCount'
},
{
name
:
'defaultBlock'
,
getter
:
'eth_defaultBlock'
,
setter
:
'eth_setDefaultBlock'
},
{
name
:
'number'
,
getter
:
'eth_number'
}
];
};
/// @returns an array of objects describing web3.db api methods
var
dbMethods
=
function
()
{
return
[
{
name
:
'put'
,
call
:
'db_put'
},
{
name
:
'get'
,
call
:
'db_get'
},
{
name
:
'putString'
,
call
:
'db_putString'
},
{
name
:
'getString'
,
call
:
'db_getString'
}
];
};
/// @returns an array of objects describing web3.shh api methods
var
shhMethods
=
function
()
{
return
[
{
name
:
'post'
,
call
:
'shh_post'
},
{
name
:
'newIdentity'
,
call
:
'shh_newIdentity'
},
{
name
:
'haveIdentity'
,
call
:
'shh_haveIdentity'
},
{
name
:
'newGroup'
,
call
:
'shh_newGroup'
},
{
name
:
'addToGroup'
,
call
:
'shh_addToGroup'
}
];
};
/// @returns an array of objects describing web3.eth.watch api methods
var
eth
WatchMethods
=
function
()
{
var
eth
=
function
()
{
var
newFilter
=
function
(
args
)
{
return
typeof
args
[
0
]
===
'string'
?
'eth_newFilterString'
:
'eth_newFilter'
;
};
...
...
@@ -1487,7 +1591,7 @@ var ethWatchMethods = function () {
};
/// @returns an array of objects describing web3.shh.watch api methods
var
shh
WatchMethods
=
function
()
{
var
shh
=
function
()
{
return
[
{
name
:
'newFilter'
,
call
:
'shh_newFilter'
},
{
name
:
'uninstallFilter'
,
call
:
'shh_uninstallFilter'
},
...
...
@@ -1495,6 +1599,57 @@ var shhWatchMethods = function () {
];
};
module
.
exports
=
{
eth
:
eth
,
shh
:
shh
};
},{}],
17
:[
function
(
require
,
module
,
exports
){
/*
This file is part of ethereum.js.
ethereum.js 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.
ethereum.js 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 ethereum.js. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file web3.js
* @authors:
* Jeffrey Wilcke <jeff@ethdev.com>
* Marek Kotewicz <marek@ethdev.com>
* Marian Oancea <marian@ethdev.com>
* Gav Wood <g@ethdev.com>
* @date 2014
*/
if
(
"build"
!==
'build'
)
{
/*
var BigNumber = require('bignumber.js');
*/
}
var
eth
=
require
(
'./eth'
);
var
db
=
require
(
'./db'
);
var
shh
=
require
(
'./shh'
);
var
watches
=
require
(
'./watches'
);
var
filter
=
require
(
'./filter'
);
var
utils
=
require
(
'./utils'
);
var
requestManager
=
require
(
'./requestmanager'
);
/// @returns an array of objects describing web3 api methods
var
web3Methods
=
function
()
{
return
[
{
name
:
'sha3'
,
call
:
'web3_sha3'
}
];
};
/// creates methods in a given object based on method description on input
/// setups api calls for these methods
var
setupMethods
=
function
(
obj
,
methods
)
{
...
...
@@ -1502,7 +1657,7 @@ var setupMethods = function (obj, methods) {
obj
[
method
.
name
]
=
function
()
{
var
args
=
Array
.
prototype
.
slice
.
call
(
arguments
);
var
call
=
typeof
method
.
call
===
'function'
?
method
.
call
(
args
)
:
method
.
call
;
return
web3
.
provid
er
.
send
({
return
web3
.
manag
er
.
send
({
method
:
call
,
params
:
args
});
...
...
@@ -1516,14 +1671,14 @@ var setupProperties = function (obj, properties) {
properties
.
forEach
(
function
(
property
)
{
var
proto
=
{};
proto
.
get
=
function
()
{
return
web3
.
provid
er
.
send
({
return
web3
.
manag
er
.
send
({
method
:
property
.
getter
});
};
if
(
property
.
setter
)
{
proto
.
set
=
function
(
val
)
{
return
web3
.
provid
er
.
send
({
return
web3
.
manag
er
.
send
({
method
:
property
.
setter
,
params
:
[
val
]
});
...
...
@@ -1533,10 +1688,32 @@ var setupProperties = function (obj, properties) {
});
};
/*jshint maxparams:4 */
var
startPolling
=
function
(
method
,
id
,
callback
,
uninstall
)
{
web3
.
manager
.
startPolling
({
method
:
method
,
params
:
[
id
]
},
id
,
callback
,
uninstall
);
};
/*jshint maxparams:3 */
var
stopPolling
=
function
(
id
)
{
web3
.
manager
.
stopPolling
(
id
);
};
var
ethWatch
=
{
startPolling
:
startPolling
.
bind
(
null
,
'eth_changed'
),
stopPolling
:
stopPolling
};
var
shhWatch
=
{
startPolling
:
startPolling
.
bind
(
null
,
'shh_changed'
),
stopPolling
:
stopPolling
};
/// setups web3 object, and it's in-browser executed methods
var
web3
=
{
_callbacks
:
{},
_events
:
{},
manager
:
requestManager
(),
providers
:
{},
/// @returns ascii string representation of hex value prefixed with 0x
...
...
@@ -1575,12 +1752,15 @@ var web3 = {
/// @param filter may be a string, object or event
/// @param indexed is optional, this is an object with optional event indexed params
/// @param options is optional, this is an object with optional event options ('max'...)
watch
:
function
(
filter
,
indexed
,
options
)
{
if
(
filter
.
_isEvent
)
{
return
filter
(
indexed
,
options
);
/// TODO: fix it, 4 params? no way
/*jshint maxparams:4 */
watch
:
function
(
fil
,
indexed
,
options
,
formatter
)
{
if
(
fil
.
_isEvent
)
{
return
fil
(
indexed
,
options
);
}
return
new
web3
.
filter
(
filter
,
ethWatch
);
return
filter
(
fil
,
ethWatch
,
formatter
);
}
/*jshint maxparams:3 */
},
/// db object prototype
...
...
@@ -1588,54 +1768,44 @@ var web3 = {
/// shh object prototype
shh
:
{
/// @param filter may be a string, object or event
watch
:
function
(
fil
ter
,
indexed
)
{
return
new
web3
.
filter
(
filter
,
shhWatch
);
watch
:
function
(
fil
)
{
return
filter
(
fil
,
shhWatch
);
}
},
setProvider
:
function
(
provider
)
{
web3
.
manager
.
setProvider
(
provider
);
},
/// Should be called to reset state of web3 object
/// Resets everything except manager
reset
:
function
()
{
web3
.
manager
.
reset
();
}
};
/// setups all api methods
setupMethods
(
web3
,
web3Methods
());
setupMethods
(
web3
.
eth
,
ethMethods
());
setupProperties
(
web3
.
eth
,
ethProperties
());
setupMethods
(
web3
.
db
,
dbMethods
());
setupMethods
(
web3
.
shh
,
shhMethods
());
var
ethWatch
=
{
changed
:
'eth_changed'
};
setupMethods
(
ethWatch
,
ethWatchMethods
());
var
shhWatch
=
{
changed
:
'shh_changed'
};
setupMethods
(
shhWatch
,
shhWatchMethods
());
web3
.
setProvider
=
function
(
provider
)
{
web3
.
provider
.
set
(
provider
);
};
setupMethods
(
web3
.
eth
,
eth
.
methods
());
setupProperties
(
web3
.
eth
,
eth
.
properties
());
setupMethods
(
web3
.
db
,
db
.
methods
());
setupMethods
(
web3
.
shh
,
shh
.
methods
());
setupMethods
(
ethWatch
,
watches
.
eth
());
setupMethods
(
shhWatch
,
watches
.
shh
());
module
.
exports
=
web3
;
},{
"./
utils"
:
12
}],
"web3"
:[
function
(
require
,
module
,
exports
){
},{
"./
db"
:
4
,
"./eth"
:
5
,
"./filter"
:
7
,
"./requestmanager"
:
12
,
"./shh"
:
13
,
"./utils"
:
15
,
"./watches"
:
16
}],
"web3"
:[
function
(
require
,
module
,
exports
){
var
web3
=
require
(
'./lib/web3'
);
var
ProviderManager
=
require
(
'./lib/providermanager'
);
web3
.
provider
=
new
ProviderManager
();
web3
.
filter
=
require
(
'./lib/filter'
);
web3
.
providers
.
HttpSyncProvider
=
require
(
'./lib/httpsync'
);
web3
.
providers
.
QtSyncProvider
=
require
(
'./lib/qtsync'
);
web3
.
eth
.
contract
=
require
(
'./lib/contract'
);
web3
.
abi
=
require
(
'./lib/abi'
);
module
.
exports
=
web3
;
},{
"./lib/abi"
:
1
,
"./lib/contract"
:
3
,
"./lib/
filter"
:
5
,
"./lib/httpsync"
:
7
,
"./lib/providermanager"
:
9
,
"./lib/qtsync"
:
10
,
"./lib/web3"
:
13
}]},{},[
"web3"
])
},{
"./lib/abi"
:
1
,
"./lib/contract"
:
3
,
"./lib/
httpsync"
:
9
,
"./lib/qtsync"
:
11
,
"./lib/web3"
:
17
}]},{},[
"web3"
])
//# sourceMappingURL=ethereum.js.map
cmd/mist/assets/qml/main.qml
View file @
af6971f8
...
...
@@ -964,7 +964,7 @@ ApplicationWindow {
anchors.top
:
parent
.
top
anchors.topMargin
:
30
font.pointSize
:
12
text
:
"<h2>Mist (0.8.
5
)</h2><br><h3>Development</h3>Jeffrey Wilcke<br>Viktor Trón<br>Felix Lange<br>Taylor Gerring<br>Daniel Nagy<br>Gustav Simonsson<br><h3>UX/UI</h3>Alex van de Sande<br>Fabian Vogelsteller"
text
:
"<h2>Mist (0.8.
6
)</h2><br><h3>Development</h3>Jeffrey Wilcke<br>Viktor Trón<br>Felix Lange<br>Taylor Gerring<br>Daniel Nagy<br>Gustav Simonsson<br><h3>UX/UI</h3>Alex van de Sande<br>Fabian Vogelsteller"
}
}
...
...
cmd/mist/flags.go
View file @
af6971f8
...
...
@@ -27,10 +27,8 @@ import (
"log"
"os"
"path"
"path/filepath"
"runtime"
"bitbucket.org/kardianos/osext"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/logger"
...
...
@@ -44,6 +42,7 @@ var (
KeyStore
string
StartRpc
bool
StartWebSockets
bool
RpcListenAddress
string
RpcPort
int
WsPort
int
OutboundPort
string
...
...
@@ -68,33 +67,6 @@ var (
// flags specific to gui client
var
AssetPath
string
//TODO: If we re-use the one defined in cmd.go the binary osx image crashes. If somebody finds out why we can dry this up.
func
defaultAssetPath
()
string
{
var
assetPath
string
// If the current working directory is the go-ethereum dir
// assume a debug build and use the source directory as
// asset directory.
pwd
,
_
:=
os
.
Getwd
()
if
pwd
==
path
.
Join
(
os
.
Getenv
(
"GOPATH"
),
"src"
,
"github.com"
,
"ethereum"
,
"go-ethereum"
,
"cmd"
,
"mist"
)
{
assetPath
=
path
.
Join
(
pwd
,
"assets"
)
}
else
{
switch
runtime
.
GOOS
{
case
"darwin"
:
// Get Binary Directory
exedir
,
_
:=
osext
.
ExecutableFolder
()
assetPath
=
filepath
.
Join
(
exedir
,
"../Resources"
)
case
"linux"
:
assetPath
=
"/usr/share/mist"
case
"windows"
:
assetPath
=
"./assets"
default
:
assetPath
=
"."
}
}
return
assetPath
}
var
defaultConfigFile
=
path
.
Join
(
ethutil
.
DefaultDataDir
(),
"conf.ini"
)
func
Init
()
{
...
...
@@ -108,6 +80,7 @@ func Init() {
flag
.
StringVar
(
&
Identifier
,
"id"
,
""
,
"Custom client identifier"
)
flag
.
StringVar
(
&
KeyRing
,
"keyring"
,
""
,
"identifier for keyring to use"
)
flag
.
StringVar
(
&
KeyStore
,
"keystore"
,
"db"
,
"system to store keyrings: db|file (db)"
)
flag
.
StringVar
(
&
RpcListenAddress
,
"rpcaddr"
,
"127.0.0.1"
,
"address for json-rpc server to listen on"
)
flag
.
IntVar
(
&
RpcPort
,
"rpcport"
,
8545
,
"port to start json-rpc server on"
)
flag
.
IntVar
(
&
WsPort
,
"wsport"
,
40404
,
"port to start websocket rpc server on"
)
flag
.
BoolVar
(
&
StartRpc
,
"rpc"
,
true
,
"start rpc server"
)
...
...
@@ -122,7 +95,7 @@ func Init() {
flag
.
StringVar
(
&
DebugFile
,
"debug"
,
""
,
"debug file (no debugging if not set)"
)
flag
.
IntVar
(
&
LogLevel
,
"loglevel"
,
int
(
logger
.
InfoLevel
),
"loglevel: 0-5: silent,error,warn,info,debug,debug detail)"
)
flag
.
StringVar
(
&
AssetPath
,
"asset_path"
,
d
efaultAssetPath
(),
"absolute path to GUI assets directory"
)
flag
.
StringVar
(
&
AssetPath
,
"asset_path"
,
ethutil
.
D
efaultAssetPath
(),
"absolute path to GUI assets directory"
)
// Network stuff
var
(
...
...
cmd/mist/main.go
View file @
af6971f8
...
...
@@ -36,7 +36,7 @@ import (
const
(
ClientIdentifier
=
"Mist"
Version
=
"0.8.
5
"
Version
=
"0.8.
6
"
)
var
ethereum
*
eth
.
Ethereum
...
...
@@ -73,7 +73,7 @@ func run() error {
utils
.
KeyTasks
(
ethereum
.
KeyManager
(),
KeyRing
,
GenAddr
,
SecretFile
,
ExportDir
,
NonInteractive
)
if
StartRpc
{
utils
.
StartRpc
(
ethereum
,
RpcPort
)
utils
.
StartRpc
(
ethereum
,
Rpc
ListenAddress
,
Rpc
Port
)
}
if
StartWebSockets
{
...
...
cmd/utils/cmd.go
View file @
af6971f8
...
...
@@ -25,12 +25,8 @@ import (
"fmt"
"os"
"os/signal"
"path"
"path/filepath"
"regexp"
"runtime"
"bitbucket.org/kardianos/osext"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/eth"
...
...
@@ -132,31 +128,6 @@ func StartEthereum(ethereum *eth.Ethereum) {
})
}
func
DefaultAssetPath
()
string
{
var
assetPath
string
// If the current working directory is the go-ethereum dir
// assume a debug build and use the source directory as
// asset directory.
pwd
,
_
:=
os
.
Getwd
()
if
pwd
==
path
.
Join
(
os
.
Getenv
(
"GOPATH"
),
"src"
,
"github.com"
,
"ethereum"
,
"go-ethereum"
,
"cmd"
,
"mist"
)
{
assetPath
=
path
.
Join
(
pwd
,
"assets"
)
}
else
{
switch
runtime
.
GOOS
{
case
"darwin"
:
// Get Binary Directory
exedir
,
_
:=
osext
.
ExecutableFolder
()
assetPath
=
filepath
.
Join
(
exedir
,
"../Resources"
)
case
"linux"
:
assetPath
=
"/usr/share/mist"
case
"windows"
:
assetPath
=
"./assets"
default
:
assetPath
=
"."
}
}
return
assetPath
}
func
KeyTasks
(
keyManager
*
crypto
.
KeyManager
,
KeyRing
string
,
GenAddr
bool
,
SecretFile
string
,
ExportDir
string
,
NonInteractive
bool
)
{
var
err
error
...
...
@@ -189,9 +160,9 @@ func KeyTasks(keyManager *crypto.KeyManager, KeyRing string, GenAddr bool, Secre
clilogger
.
Infof
(
"Main address %x
\n
"
,
keyManager
.
Address
())
}
func
StartRpc
(
ethereum
*
eth
.
Ethereum
,
RpcPort
int
)
{
func
StartRpc
(
ethereum
*
eth
.
Ethereum
,
Rpc
ListenAddress
string
,
Rpc
Port
int
)
{
var
err
error
ethereum
.
RpcServer
,
err
=
rpchttp
.
NewRpcHttpServer
(
xeth
.
New
(
ethereum
),
RpcPort
)
ethereum
.
RpcServer
,
err
=
rpchttp
.
NewRpcHttpServer
(
xeth
.
New
(
ethereum
),
Rpc
ListenAddress
,
Rpc
Port
)
if
err
!=
nil
{
clilogger
.
Errorf
(
"Could not start RPC interface (port %v): %v"
,
RpcPort
,
err
)
}
else
{
...
...
core/block_processor.go
View file @
af6971f8
...
...
@@ -50,7 +50,6 @@ func NewBlockProcessor(db ethutil.Database, txpool *TxPool, chainManager *ChainM
sm
:=
&
BlockProcessor
{
db
:
db
,
mem
:
make
(
map
[
string
]
*
big
.
Int
),
//Pow: ðash.Ethash{},
Pow
:
ezp
.
New
(),
bc
:
chainManager
,
eventMux
:
eventMux
,
...
...
@@ -62,7 +61,7 @@ func NewBlockProcessor(db ethutil.Database, txpool *TxPool, chainManager *ChainM
func
(
sm
*
BlockProcessor
)
TransitionState
(
statedb
*
state
.
StateDB
,
parent
,
block
*
types
.
Block
,
transientProcess
bool
)
(
receipts
types
.
Receipts
,
err
error
)
{
coinbase
:=
statedb
.
GetOrNewStateObject
(
block
.
Header
()
.
Coinbase
)
coinbase
.
SetGasPool
(
CalcGasLimit
(
parent
,
block
)
)
coinbase
.
SetGasPool
(
block
.
Header
()
.
GasLimit
)
// Process the transactions on to parent state
receipts
,
_
,
_
,
_
,
err
=
sm
.
ApplyTransactions
(
coinbase
,
statedb
,
block
,
block
.
Transactions
(),
transientProcess
)
...
...
@@ -100,7 +99,8 @@ func (self *BlockProcessor) ApplyTransaction(coinbase *state.StateObject, stated
// Notify all subscribers
if
!
transientProcess
{
go
self
.
eventMux
.
Post
(
TxPostEvent
{
tx
})
go
self
.
eventMux
.
Post
(
statedb
.
Logs
())
logs
:=
statedb
.
Logs
()
go
self
.
eventMux
.
Post
(
logs
)
}
return
receipt
,
txGas
,
err
...
...
@@ -247,6 +247,11 @@ func (sm *BlockProcessor) ValidateBlock(block, parent *types.Block) error {
return
fmt
.
Errorf
(
"Difficulty check failed for block %v, %v"
,
block
.
Header
()
.
Difficulty
,
expd
)
}
expl
:=
CalcGasLimit
(
parent
,
block
)
if
expl
.
Cmp
(
block
.
Header
()
.
GasLimit
)
!=
0
{
return
fmt
.
Errorf
(
"GasLimit check failed for block %v, %v"
,
block
.
Header
()
.
GasLimit
,
expl
)
}
if
block
.
Time
()
<
parent
.
Time
()
{
return
ValidationError
(
"Block timestamp not after prev block (%v - %v)"
,
block
.
Header
()
.
Time
,
parent
.
Header
()
.
Time
)
}
...
...
core/genesis.go
View file @
af6971f8
...
...
@@ -51,8 +51,6 @@ func GenesisBlock(db ethutil.Database) *types.Block {
statedb
.
Sync
()
genesis
.
Header
()
.
Root
=
statedb
.
Root
()
fmt
.
Printf
(
"+++ genesis +++
\n
Root: %x
\n
Hash: %x
\n
"
,
genesis
.
Header
()
.
Root
,
genesis
.
Hash
())
return
genesis
}
...
...
core/state_transition.go
View file @
af6971f8
...
...
@@ -126,7 +126,7 @@ func (self *StateTransition) BuyGas() error {
self
.
AddGas
(
self
.
msg
.
Gas
())
self
.
initialGas
.
Set
(
self
.
msg
.
Gas
())
sender
.
Sub
Amount
(
MessageGasValue
(
self
.
msg
))
sender
.
Sub
Balance
(
MessageGasValue
(
self
.
msg
))
return
nil
}
...
...
@@ -251,7 +251,7 @@ func (self *StateTransition) RefundGas() {
coinbase
,
sender
:=
self
.
Coinbase
(),
self
.
From
()
// Return remaining gas
remaining
:=
new
(
big
.
Int
)
.
Mul
(
self
.
gas
,
self
.
msg
.
GasPrice
())
sender
.
Add
Amount
(
remaining
)
sender
.
Add
Balance
(
remaining
)
uhalf
:=
new
(
big
.
Int
)
.
Div
(
self
.
GasUsed
(),
ethutil
.
Big2
)
for
addr
,
ref
:=
range
self
.
state
.
Refunds
()
{
...
...
eth/backend.go
View file @
af6971f8
...
...
@@ -148,7 +148,8 @@ func New(config *Config) (*Ethereum, error) {
d
,
_
:=
db
.
Get
([]
byte
(
"ProtocolVersion"
))
protov
:=
ethutil
.
NewValue
(
d
)
.
Uint
()
if
protov
!=
ProtocolVersion
&&
protov
!=
0
{
return
nil
,
fmt
.
Errorf
(
"Database version mismatch. Protocol(%d / %d). `rm -rf %s`"
,
protov
,
ProtocolVersion
,
ethutil
.
Config
.
ExecPath
+
"/database"
)
path
:=
path
.
Join
(
config
.
DataDir
,
"database"
)
return
nil
,
fmt
.
Errorf
(
"Database version mismatch. Protocol(%d / %d). `rm -rf %s`"
,
protov
,
ProtocolVersion
,
path
)
}
// Create new keymanager
...
...
ethutil/common.go
View file @
af6971f8
...
...
@@ -3,12 +3,50 @@ package ethutil
import
(
"fmt"
"math/big"
"os"
"os/user"
"path"
"path/filepath"
"runtime"
"time"
"github.com/kardianos/osext"
)
func
DefaultAssetPath
()
string
{
var
assetPath
string
pwd
,
_
:=
os
.
Getwd
()
srcdir
:=
path
.
Join
(
os
.
Getenv
(
"GOPATH"
),
"src"
,
"github.com"
,
"ethereum"
,
"go-ethereum"
,
"cmd"
,
"mist"
)
// If the current working directory is the go-ethereum dir
// assume a debug build and use the source directory as
// asset directory.
if
pwd
==
srcdir
{
assetPath
=
path
.
Join
(
pwd
,
"assets"
)
}
else
{
switch
runtime
.
GOOS
{
case
"darwin"
:
// Get Binary Directory
exedir
,
_
:=
osext
.
ExecutableFolder
()
assetPath
=
filepath
.
Join
(
exedir
,
"../Resources"
)
case
"linux"
:
assetPath
=
"/usr/share/mist"
case
"windows"
:
assetPath
=
"./assets"
default
:
assetPath
=
"."
}
}
// Check if the assetPath exists. If not, try the source directory
// This happens when binary is run from outside cmd/mist directory
if
_
,
err
:=
os
.
Stat
(
assetPath
);
os
.
IsNotExist
(
err
)
{
assetPath
=
path
.
Join
(
srcdir
,
"assets"
)
}
return
assetPath
}
func
DefaultDataDir
()
string
{
usr
,
_
:=
user
.
Current
()
if
runtime
.
GOOS
==
"darwin"
{
...
...
javascript/javascript_runtime.go
View file @
af6971f8
...
...
@@ -24,7 +24,7 @@ var jsrelogger = logger.NewLogger("JSRE")
type
JSRE
struct
{
ethereum
*
eth
.
Ethereum
Vm
*
otto
.
Otto
pipe
*
xeth
.
XEth
xeth
*
xeth
.
XEth
events
event
.
Subscription
...
...
@@ -67,7 +67,7 @@ func NewJSRE(ethereum *eth.Ethereum) *JSRE {
// We have to make sure that, whoever calls this, calls "Stop"
go
re
.
mainLoop
()
re
.
Bind
(
"eth"
,
&
JSEthereum
{
re
.
pipe
,
re
.
Vm
,
ethereum
})
re
.
Bind
(
"eth"
,
&
JSEthereum
{
re
.
xeth
,
re
.
Vm
,
ethereum
})
re
.
initStdFuncs
()
...
...
@@ -113,12 +113,10 @@ func (self *JSRE) mainLoop() {
func
(
self
*
JSRE
)
initStdFuncs
()
{
t
,
_
:=
self
.
Vm
.
Get
(
"eth"
)
eth
:=
t
.
Object
()
eth
.
Set
(
"watch"
,
self
.
watch
)
eth
.
Set
(
"addPeer"
,
self
.
addPeer
)
eth
.
Set
(
"connect"
,
self
.
connect
)
eth
.
Set
(
"require"
,
self
.
require
)
eth
.
Set
(
"stopMining"
,
self
.
stopMining
)
eth
.
Set
(
"startMining"
,
self
.
startMining
)
eth
.
Set
(
"execBlock"
,
self
.
execBlock
)
eth
.
Set
(
"dump"
,
self
.
dump
)
eth
.
Set
(
"export"
,
self
.
export
)
}
...
...
@@ -152,7 +150,8 @@ func (self *JSRE) dump(call otto.FunctionCall) otto.Value {
}
statedb
:=
state
.
New
(
block
.
Root
(),
self
.
ethereum
.
Db
())
v
,
_
:=
self
.
Vm
.
ToValue
(
statedb
.
Dump
())
v
,
_
:=
self
.
Vm
.
ToValue
(
statedb
.
RawDump
())
return
v
}
...
...
@@ -167,36 +166,7 @@ func (self *JSRE) startMining(call otto.FunctionCall) otto.Value {
return
v
}
// eth.watch
func
(
self
*
JSRE
)
watch
(
call
otto
.
FunctionCall
)
otto
.
Value
{
addr
,
_
:=
call
.
Argument
(
0
)
.
ToString
()
var
storageAddr
string
var
cb
otto
.
Value
var
storageCallback
bool
if
len
(
call
.
ArgumentList
)
>
2
{
storageCallback
=
true
storageAddr
,
_
=
call
.
Argument
(
1
)
.
ToString
()
cb
=
call
.
Argument
(
2
)
}
else
{
cb
=
call
.
Argument
(
1
)
}
if
storageCallback
{
self
.
objectCb
[
addr
+
storageAddr
]
=
append
(
self
.
objectCb
[
addr
+
storageAddr
],
cb
)
// event := "storage:" + string(ethutil.Hex2Bytes(addr)) + ":" + string(ethutil.Hex2Bytes(storageAddr))
// self.ethereum.EventMux().Subscribe(event, self.changeChan)
}
else
{
self
.
objectCb
[
addr
]
=
append
(
self
.
objectCb
[
addr
],
cb
)
// event := "object:" + string(ethutil.Hex2Bytes(addr))
// self.ethereum.EventMux().Subscribe(event, self.changeChan)
}
return
otto
.
UndefinedValue
()
}
func
(
self
*
JSRE
)
addPeer
(
call
otto
.
FunctionCall
)
otto
.
Value
{
func
(
self
*
JSRE
)
connect
(
call
otto
.
FunctionCall
)
otto
.
Value
{
nodeURL
,
err
:=
call
.
Argument
(
0
)
.
ToString
()
if
err
!=
nil
{
return
otto
.
FalseValue
()
...
...
@@ -222,22 +192,12 @@ func (self *JSRE) require(call otto.FunctionCall) otto.Value {
return
t
}
func
(
self
*
JSRE
)
execBlock
(
call
otto
.
FunctionCall
)
otto
.
Value
{
hash
,
err
:=
call
.
Argument
(
0
)
.
ToString
()
if
err
!=
nil
{
return
otto
.
UndefinedValue
()
}
err
=
utils
.
BlockDo
(
self
.
ethereum
,
ethutil
.
Hex2Bytes
(
hash
))
if
err
!=
nil
{
fmt
.
Println
(
err
)
func
(
self
*
JSRE
)
export
(
call
otto
.
FunctionCall
)
otto
.
Value
{
if
len
(
call
.
ArgumentList
)
==
0
{
fmt
.
Println
(
"err: require file name"
)
return
otto
.
FalseValue
()
}
return
otto
.
TrueValue
()
}
func
(
self
*
JSRE
)
export
(
call
otto
.
FunctionCall
)
otto
.
Value
{
fn
,
err
:=
call
.
Argument
(
0
)
.
ToString
()
if
err
!=
nil
{
fmt
.
Println
(
err
)
...
...
javascript/js_lib.go
View file @
af6971f8
...
...
@@ -16,7 +16,7 @@ function pp(object) {
str += " ]";
} else if(typeof(object) === "object") {
str += "{ ";
var last = Object.keys(object).
sort().
pop()
var last = Object.keys(object).pop()
for(var k in object) {
str += k + ": " + pp(object[k]);
...
...
miner/miner.go
View file @
af6971f8
...
...
@@ -52,10 +52,5 @@ func (self *Miner) Stop() {
}
func
(
self
*
Miner
)
HashRate
()
int64
{
var
tot
int64
for
_
,
agent
:=
range
self
.
worker
.
agents
{
tot
+=
agent
.
Pow
()
.
GetHashrate
()
}
return
tot
return
self
.
worker
.
HashRate
()
}
miner/worker.go
View file @
af6971f8
...
...
@@ -5,6 +5,7 @@ import (
"math/big"
"sort"
"sync"
"time"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
...
...
@@ -111,6 +112,8 @@ func (self *worker) register(agent Agent) {
func
(
self
*
worker
)
update
()
{
events
:=
self
.
mux
.
Subscribe
(
core
.
ChainEvent
{},
core
.
NewMinedBlockEvent
{})
timer
:=
time
.
NewTicker
(
2
*
time
.
Second
)
out
:
for
{
select
{
...
...
@@ -129,6 +132,8 @@ out:
agent
.
Stop
()
}
break
out
case
<-
timer
.
C
:
minerlogger
.
Debugln
(
"Hash rate:"
,
self
.
HashRate
(),
"Khash"
)
}
}
...
...
@@ -197,7 +202,7 @@ gasLimit:
}
self
.
eth
.
TxPool
()
.
RemoveSet
(
remove
)
self
.
current
.
coinbase
.
Add
Amount
(
core
.
BlockReward
)
self
.
current
.
coinbase
.
Add
Balance
(
core
.
BlockReward
)
self
.
current
.
state
.
Update
(
ethutil
.
Big0
)
self
.
push
()
...
...
@@ -225,7 +230,7 @@ func (self *worker) commitUncle(uncle *types.Header) error {
}
uncleAccount
:=
self
.
current
.
state
.
GetAccount
(
uncle
.
Coinbase
)
uncleAccount
.
Add
Amount
(
uncleReward
)
uncleAccount
.
Add
Balance
(
uncleReward
)
self
.
current
.
coinbase
.
AddBalance
(
uncleReward
)
...
...
@@ -244,3 +249,12 @@ func (self *worker) commitTransaction(tx *types.Transaction) error {
return
nil
}
func
(
self
*
worker
)
HashRate
()
int64
{
var
tot
int64
for
_
,
agent
:=
range
self
.
agents
{
tot
+=
agent
.
Pow
()
.
GetHashrate
()
}
return
tot
}
rpc/api.go
View file @
af6971f8
...
...
@@ -9,6 +9,7 @@ For each request type, define the following:
package
rpc
import
(
"fmt"
"math/big"
"strings"
"sync"
...
...
@@ -19,8 +20,10 @@ import (
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/event"
"github.com/ethereum/go-ethereum/event/filter"
"github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/ui"
"github.com/ethereum/go-ethereum/xeth"
)
...
...
@@ -31,7 +34,10 @@ var (
)
type
EthereumApi
struct
{
xeth
*
xeth
.
XEth
eth
*
xeth
.
XEth
xethMu
sync
.
RWMutex
mux
*
event
.
TypeMux
quit
chan
struct
{}
filterManager
*
filter
.
FilterManager
...
...
@@ -45,17 +51,21 @@ type EthereumApi struct {
register
map
[
string
][]
*
NewTxArgs
db
ethutil
.
Database
defaultBlockAge
int64
}
func
NewEthereumApi
(
eth
*
xeth
.
XEth
)
*
EthereumApi
{
db
,
_
:=
ethdb
.
NewLDBDatabase
(
"dapps"
)
api
:=
&
EthereumApi
{
xeth
:
eth
,
eth
:
eth
,
mux
:
eth
.
Backend
()
.
EventMux
(),
quit
:
make
(
chan
struct
{}),
filterManager
:
filter
.
NewFilterManager
(
eth
.
Backend
()
.
EventMux
()),
logs
:
make
(
map
[
int
]
*
logFilter
),
messages
:
make
(
map
[
int
]
*
whisperFilter
),
db
:
db
,
defaultBlockAge
:
-
1
,
}
go
api
.
filterManager
.
Start
()
go
api
.
start
()
...
...
@@ -63,11 +73,36 @@ func NewEthereumApi(eth *xeth.XEth) *EthereumApi {
return
api
}
func
(
self
*
EthereumApi
)
setStateByBlockNumber
(
num
int64
)
{
chain
:=
self
.
xeth
()
.
Backend
()
.
ChainManager
()
var
block
*
types
.
Block
if
self
.
defaultBlockAge
<
0
{
num
=
chain
.
CurrentBlock
()
.
Number
()
.
Int64
()
+
num
+
1
}
block
=
chain
.
GetBlockByNumber
(
uint64
(
num
))
if
block
!=
nil
{
self
.
useState
(
state
.
New
(
block
.
Root
(),
self
.
xeth
()
.
Backend
()
.
Db
()))
}
else
{
self
.
useState
(
chain
.
State
())
}
}
func
(
self
*
EthereumApi
)
start
()
{
timer
:=
time
.
NewTicker
(
filterTickerTime
)
events
:=
self
.
mux
.
Subscribe
(
core
.
ChainEvent
{})
done
:
for
{
select
{
case
ev
:=
<-
events
.
Chan
()
:
switch
ev
.
(
type
)
{
case
core
.
ChainEvent
:
if
self
.
defaultBlockAge
<
0
{
self
.
setStateByBlockNumber
(
self
.
defaultBlockAge
)
}
}
case
<-
timer
.
C
:
self
.
logMut
.
Lock
()
self
.
messagesMut
.
Lock
()
...
...
@@ -80,7 +115,7 @@ done:
for
id
,
filter
:=
range
self
.
messages
{
if
time
.
Since
(
filter
.
timeout
)
>
20
*
time
.
Second
{
self
.
xeth
.
Whisper
()
.
Unwatch
(
id
)
self
.
xeth
()
.
Whisper
()
.
Unwatch
(
id
)
delete
(
self
.
messages
,
id
)
}
}
...
...
@@ -128,7 +163,7 @@ func (self *EthereumApi) WatchTx(args string, reply *interface{}) error {
func
(
self
*
EthereumApi
)
NewFilter
(
args
*
FilterOptions
,
reply
*
interface
{})
error
{
var
id
int
filter
:=
core
.
NewFilter
(
self
.
xeth
.
Backend
())
filter
:=
core
.
NewFilter
(
self
.
xeth
()
.
Backend
())
filter
.
SetOptions
(
toFilterOptions
(
args
))
filter
.
LogsCallback
=
func
(
logs
state
.
Logs
)
{
self
.
logMut
.
Lock
()
...
...
@@ -153,7 +188,7 @@ func (self *EthereumApi) UninstallFilter(id int, reply *interface{}) error {
func
(
self
*
EthereumApi
)
NewFilterString
(
args
string
,
reply
*
interface
{})
error
{
var
id
int
filter
:=
core
.
NewFilter
(
self
.
xeth
.
Backend
())
filter
:=
core
.
NewFilter
(
self
.
xeth
()
.
Backend
())
callback
:=
func
(
block
*
types
.
Block
)
{
self
.
logMut
.
Lock
()
...
...
@@ -198,7 +233,7 @@ func (self *EthereumApi) Logs(id int, reply *interface{}) error {
}
func
(
self
*
EthereumApi
)
AllLogs
(
args
*
FilterOptions
,
reply
*
interface
{})
error
{
filter
:=
core
.
NewFilter
(
self
.
xeth
.
Backend
())
filter
:=
core
.
NewFilter
(
self
.
xeth
()
.
Backend
())
filter
.
SetOptions
(
toFilterOptions
(
args
))
*
reply
=
toLogs
(
filter
.
Find
())
...
...
@@ -209,9 +244,9 @@ func (self *EthereumApi) AllLogs(args *FilterOptions, reply *interface{}) error
func
(
p
*
EthereumApi
)
GetBlock
(
args
*
GetBlockArgs
,
reply
*
interface
{})
error
{
// This seems a bit precarious Maybe worth splitting to discrete functions
if
len
(
args
.
Hash
)
>
0
{
*
reply
=
p
.
xeth
.
BlockByHash
(
args
.
Hash
)
*
reply
=
p
.
xeth
()
.
BlockByHash
(
args
.
Hash
)
}
else
{
*
reply
=
p
.
xeth
.
BlockByNumber
(
args
.
BlockNumber
)
*
reply
=
p
.
xeth
()
.
BlockByNumber
(
args
.
BlockNumber
)
}
return
nil
}
...
...
@@ -226,18 +261,35 @@ func (p *EthereumApi) Transact(args *NewTxArgs, reply *interface{}) error {
}
// TODO if no_private_key then
if
_
,
exists
:=
p
.
register
[
args
.
From
];
exists
{
p
.
register
[
args
.
From
]
=
append
(
p
.
register
[
args
.
From
],
args
)
}
else
{
result
,
_
:=
p
.
xeth
.
Transact
(
/* TODO specify account */
args
.
To
,
args
.
Value
,
args
.
Gas
,
args
.
GasPrice
,
args
.
Data
)
*
reply
=
result
//if _, exists := p.register[args.From]; exists {
// p.register[args.From] = append(p.register[args.From], args)
//} else {
/*
account := accounts.Get(fromHex(args.From))
if account != nil {
if account.Unlocked() {
if !unlockAccount(account) {
return
}
}
result, _ := account.Transact(fromHex(args.To), fromHex(args.Value), fromHex(args.Gas), fromHex(args.GasPrice), fromHex(args.Data))
if len(result) > 0 {
*reply = toHex(result)
}
} else if _, exists := p.register[args.From]; exists {
p.register[ags.From] = append(p.register[args.From], args)
}
*/
result
,
_
:=
p
.
xeth
()
.
Transact
(
/* TODO specify account */
args
.
To
,
args
.
Value
,
args
.
Gas
,
args
.
GasPrice
,
args
.
Data
)
*
reply
=
result
//}
return
nil
}
func
(
p
*
EthereumApi
)
Call
(
args
*
NewTxArgs
,
reply
*
interface
{})
error
{
result
,
err
:=
p
.
xeth
.
Call
(
/* TODO specify account */
args
.
To
,
args
.
Value
,
args
.
Gas
,
args
.
GasPrice
,
args
.
Data
)
result
,
err
:=
p
.
xeth
()
.
Call
(
/* TODO specify account */
args
.
To
,
args
.
Value
,
args
.
Gas
,
args
.
GasPrice
,
args
.
Data
)
if
err
!=
nil
{
return
err
}
...
...
@@ -251,7 +303,7 @@ func (p *EthereumApi) PushTx(args *PushTxArgs, reply *interface{}) error {
if
err
!=
nil
{
return
err
}
result
,
_
:=
p
.
xeth
.
PushTx
(
args
.
Tx
)
result
,
_
:=
p
.
xeth
()
.
PushTx
(
args
.
Tx
)
*
reply
=
result
return
nil
}
...
...
@@ -262,7 +314,7 @@ func (p *EthereumApi) GetStateAt(args *GetStateArgs, reply *interface{}) error {
return
err
}
state
:=
p
.
xeth
.
State
()
.
SafeGet
(
args
.
Address
)
state
:=
p
.
xeth
()
.
State
()
.
SafeGet
(
args
.
Address
)
value
:=
state
.
StorageString
(
args
.
Key
)
var
hx
string
...
...
@@ -284,42 +336,55 @@ func (p *EthereumApi) GetStorageAt(args *GetStorageArgs, reply *interface{}) err
return
err
}
*
reply
=
p
.
xeth
.
State
()
.
SafeGet
(
args
.
Address
)
.
Storage
()
*
reply
=
p
.
xeth
()
.
State
()
.
SafeGet
(
args
.
Address
)
.
Storage
()
return
nil
}
func
(
p
*
EthereumApi
)
GetPeerCount
(
reply
*
interface
{})
error
{
*
reply
=
p
.
xeth
.
PeerCount
()
*
reply
=
p
.
xeth
()
.
PeerCount
()
return
nil
}
func
(
p
*
EthereumApi
)
GetIsListening
(
reply
*
interface
{})
error
{
*
reply
=
p
.
xeth
.
IsListening
()
*
reply
=
p
.
xeth
()
.
IsListening
()
return
nil
}
func
(
p
*
EthereumApi
)
GetCoinbase
(
reply
*
interface
{})
error
{
*
reply
=
p
.
xeth
.
Coinbase
()
*
reply
=
p
.
xeth
()
.
Coinbase
()
return
nil
}
func
(
p
*
EthereumApi
)
Accounts
(
reply
*
interface
{})
error
{
*
reply
=
p
.
xeth
.
Accounts
()
*
reply
=
p
.
xeth
()
.
Accounts
()
return
nil
}
func
(
p
*
EthereumApi
)
GetIsMining
(
reply
*
interface
{})
error
{
*
reply
=
p
.
xeth
.
IsMining
()
*
reply
=
p
.
xeth
()
.
IsMining
()
return
nil
}
func
(
p
*
EthereumApi
)
SetMining
(
shouldmine
bool
,
reply
*
interface
{})
error
{
*
reply
=
p
.
xeth
.
SetMining
(
shouldmine
)
*
reply
=
p
.
xeth
()
.
SetMining
(
shouldmine
)
return
nil
}
func
(
p
*
EthereumApi
)
GetDefaultBlockAge
(
reply
*
interface
{})
error
{
*
reply
=
p
.
defaultBlockAge
return
nil
}
func
(
p
*
EthereumApi
)
SetDefaultBlockAge
(
defaultBlockAge
int64
,
reply
*
interface
{})
error
{
p
.
defaultBlockAge
=
defaultBlockAge
p
.
setStateByBlockNumber
(
p
.
defaultBlockAge
)
*
reply
=
true
return
nil
}
func
(
p
*
EthereumApi
)
BlockNumber
(
reply
*
interface
{})
error
{
*
reply
=
p
.
xeth
.
Backend
()
.
ChainManager
()
.
CurrentBlock
()
.
Number
()
*
reply
=
p
.
xeth
()
.
Backend
()
.
ChainManager
()
.
CurrentBlock
()
.
Number
()
return
nil
}
...
...
@@ -328,7 +393,7 @@ func (p *EthereumApi) GetTxCountAt(args *GetTxCountArgs, reply *interface{}) err
if
err
!=
nil
{
return
err
}
*
reply
=
p
.
xeth
.
TxCountAt
(
args
.
Address
)
*
reply
=
p
.
xeth
()
.
TxCountAt
(
args
.
Address
)
return
nil
}
...
...
@@ -337,7 +402,7 @@ func (p *EthereumApi) GetBalanceAt(args *GetBalanceArgs, reply *interface{}) err
if
err
!=
nil
{
return
err
}
state
:=
p
.
xeth
.
State
()
.
SafeGet
(
args
.
Address
)
state
:=
p
.
xeth
()
.
State
()
.
SafeGet
(
args
.
Address
)
*
reply
=
toHex
(
state
.
Balance
()
.
Bytes
())
return
nil
}
...
...
@@ -347,7 +412,7 @@ func (p *EthereumApi) GetCodeAt(args *GetCodeAtArgs, reply *interface{}) error {
if
err
!=
nil
{
return
err
}
*
reply
=
p
.
xeth
.
CodeAt
(
args
.
Address
)
*
reply
=
p
.
xeth
()
.
CodeAt
(
args
.
Address
)
return
nil
}
...
...
@@ -394,7 +459,7 @@ func (p *EthereumApi) DbGet(args *DbArgs, reply *interface{}) error {
}
func
(
p
*
EthereumApi
)
NewWhisperIdentity
(
reply
*
interface
{})
error
{
*
reply
=
p
.
xeth
.
Whisper
()
.
NewIdentity
()
*
reply
=
p
.
xeth
()
.
Whisper
()
.
NewIdentity
()
return
nil
}
...
...
@@ -405,7 +470,7 @@ func (p *EthereumApi) NewWhisperFilter(args *xeth.Options, reply *interface{}) e
defer
p
.
messagesMut
.
Unlock
()
p
.
messages
[
id
]
.
add
(
msg
)
// = append(p.messages[id], msg)
}
id
=
p
.
xeth
.
Whisper
()
.
Watch
(
args
)
id
=
p
.
xeth
()
.
Whisper
()
.
Watch
(
args
)
p
.
messages
[
id
]
=
&
whisperFilter
{
timeout
:
time
.
Now
()}
*
reply
=
id
return
nil
...
...
@@ -423,7 +488,7 @@ func (self *EthereumApi) MessagesChanged(id int, reply *interface{}) error {
}
func
(
p
*
EthereumApi
)
WhisperPost
(
args
*
WhisperMessageArgs
,
reply
*
interface
{})
error
{
err
:=
p
.
xeth
.
Whisper
()
.
Post
(
args
.
Payload
,
args
.
To
,
args
.
From
,
args
.
Topic
,
args
.
Priority
,
args
.
Ttl
)
err
:=
p
.
xeth
()
.
Whisper
()
.
Post
(
args
.
Payload
,
args
.
To
,
args
.
From
,
args
.
Topic
,
args
.
Priority
,
args
.
Ttl
)
if
err
!=
nil
{
return
err
}
...
...
@@ -433,12 +498,12 @@ func (p *EthereumApi) WhisperPost(args *WhisperMessageArgs, reply *interface{})
}
func
(
p
*
EthereumApi
)
HasWhisperIdentity
(
args
string
,
reply
*
interface
{})
error
{
*
reply
=
p
.
xeth
.
Whisper
()
.
HasIdentity
(
args
)
*
reply
=
p
.
xeth
()
.
Whisper
()
.
HasIdentity
(
args
)
return
nil
}
func
(
p
*
EthereumApi
)
WhisperMessages
(
id
int
,
reply
*
interface
{})
error
{
*
reply
=
p
.
xeth
.
Whisper
()
.
Messages
(
id
)
*
reply
=
p
.
xeth
()
.
Whisper
()
.
Messages
(
id
)
return
nil
}
...
...
@@ -458,6 +523,14 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error
return
err
}
return
p
.
SetMining
(
args
,
reply
)
case
"eth_defaultBlock"
:
return
p
.
GetDefaultBlockAge
(
reply
)
case
"eth_setDefaultBlock"
:
args
,
err
:=
req
.
ToIntArgs
()
if
err
!=
nil
{
return
err
}
return
p
.
SetDefaultBlockAge
(
int64
(
args
),
reply
)
case
"eth_peerCount"
:
return
p
.
GetPeerCount
(
reply
)
case
"eth_number"
:
...
...
@@ -634,3 +707,28 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error
rpclogger
.
DebugDetailf
(
"Reply: %T %s"
,
reply
,
reply
)
return
nil
}
func
(
self
*
EthereumApi
)
xeth
()
*
xeth
.
XEth
{
self
.
xethMu
.
RLock
()
defer
self
.
xethMu
.
RUnlock
()
return
self
.
eth
}
func
(
self
*
EthereumApi
)
useState
(
statedb
*
state
.
StateDB
)
{
self
.
xethMu
.
Lock
()
defer
self
.
xethMu
.
Unlock
()
self
.
eth
=
self
.
eth
.
UseState
(
statedb
)
}
func
t
(
f
ui
.
Frontend
)
{
// Call the password dialog
ret
,
err
:=
f
.
Call
(
"PasswordDialog"
)
if
err
!=
nil
{
fmt
.
Println
(
err
)
}
// Get the first argument
t
,
_
:=
ret
.
Get
(
0
)
fmt
.
Println
(
"return:"
,
t
)
}
rpc/http/server.go
View file @
af6971f8
...
...
@@ -29,8 +29,8 @@ import (
var
rpchttplogger
=
logger
.
NewLogger
(
"RPC-HTTP"
)
var
JSON
rpc
.
JsonWrapper
func
NewRpcHttpServer
(
pipe
*
xeth
.
XEth
,
port
int
)
(
*
RpcHttpServer
,
error
)
{
sport
:=
fmt
.
Sprintf
(
"
127.0.0.1:%d"
,
port
)
func
NewRpcHttpServer
(
pipe
*
xeth
.
XEth
,
address
string
,
port
int
)
(
*
RpcHttpServer
,
error
)
{
sport
:=
fmt
.
Sprintf
(
"
%s:%d"
,
address
,
port
)
l
,
err
:=
net
.
Listen
(
"tcp"
,
sport
)
if
err
!=
nil
{
return
nil
,
err
...
...
@@ -41,6 +41,7 @@ func NewRpcHttpServer(pipe *xeth.XEth, port int) (*RpcHttpServer, error) {
quit
:
make
(
chan
bool
),
pipe
:
pipe
,
port
:
port
,
addr
:
address
,
},
nil
}
...
...
@@ -49,6 +50,7 @@ type RpcHttpServer struct {
listener
net
.
Listener
pipe
*
xeth
.
XEth
port
int
addr
string
}
func
(
s
*
RpcHttpServer
)
exitHandler
()
{
...
...
@@ -69,7 +71,7 @@ func (s *RpcHttpServer) Stop() {
}
func
(
s
*
RpcHttpServer
)
Start
()
{
rpchttplogger
.
Infof
(
"Starting RPC-HTTP server on
port %d"
,
s
.
port
)
rpchttplogger
.
Infof
(
"Starting RPC-HTTP server on
%s:%d"
,
s
.
addr
,
s
.
port
)
go
s
.
exitHandler
()
api
:=
rpc
.
NewEthereumApi
(
s
.
pipe
)
...
...
rpc/messages.go
View file @
af6971f8
...
...
@@ -210,6 +210,19 @@ func (req *RpcRequest) ToBoolArgs() (bool, error) {
return
args
,
nil
}
func
(
req
*
RpcRequest
)
ToIntArgs
()
(
int
,
error
)
{
if
len
(
req
.
Params
)
<
1
{
return
0
,
errArguments
}
var
args
int
if
err
:=
json
.
Unmarshal
(
req
.
Params
[
0
],
&
args
);
err
!=
nil
{
return
0
,
errArguments
}
return
args
,
nil
}
func
(
req
*
RpcRequest
)
ToCompileArgs
()
(
string
,
error
)
{
if
len
(
req
.
Params
)
<
1
{
return
""
,
errArguments
...
...
state/dump.go
View file @
af6971f8
...
...
@@ -20,7 +20,7 @@ type World struct {
Accounts
map
[
string
]
Account
`json:"accounts"`
}
func
(
self
*
StateDB
)
Dump
()
[]
byte
{
func
(
self
*
StateDB
)
RawDump
()
World
{
world
:=
World
{
Root
:
ethutil
.
Bytes2Hex
(
self
.
trie
.
Root
()),
Accounts
:
make
(
map
[
string
]
Account
),
...
...
@@ -35,12 +35,15 @@ func (self *StateDB) Dump() []byte {
storageIt
:=
stateObject
.
State
.
trie
.
Iterator
()
for
storageIt
.
Next
()
{
account
.
Storage
[
ethutil
.
Bytes2Hex
(
it
.
Key
)]
=
ethutil
.
Bytes2Hex
(
i
t
.
Value
)
account
.
Storage
[
ethutil
.
Bytes2Hex
(
storageIt
.
Key
)]
=
ethutil
.
Bytes2Hex
(
storageI
t
.
Value
)
}
world
.
Accounts
[
ethutil
.
Bytes2Hex
(
it
.
Key
)]
=
account
}
return
world
}
json
,
err
:=
json
.
MarshalIndent
(
world
,
""
,
" "
)
func
(
self
*
StateDB
)
Dump
()
[]
byte
{
json
,
err
:=
json
.
MarshalIndent
(
self
.
RawDump
(),
""
,
" "
)
if
err
!=
nil
{
fmt
.
Println
(
"dump err"
,
err
)
}
...
...
state/state_object.go
View file @
af6971f8
...
...
@@ -19,6 +19,14 @@ func (self Code) String() string {
type
Storage
map
[
string
]
*
ethutil
.
Value
func
(
self
Storage
)
String
()
(
str
string
)
{
for
key
,
value
:=
range
self
{
str
+=
fmt
.
Sprintf
(
"%X : %X
\n
"
,
key
,
value
.
Bytes
())
}
return
}
func
(
self
Storage
)
Copy
()
Storage
{
cpy
:=
make
(
Storage
)
for
key
,
value
:=
range
self
{
...
...
@@ -119,10 +127,9 @@ func (self *StateObject) GetStorage(key *big.Int) *ethutil.Value {
}
func
(
self
*
StateObject
)
SetStorage
(
key
*
big
.
Int
,
value
*
ethutil
.
Value
)
{
self
.
SetState
(
key
.
Bytes
(),
value
)
self
.
dirty
=
true
}
func
(
self
*
StateObject
)
Storage
()
map
[
string
]
*
ethutil
.
Valu
e
{
func
(
self
*
StateObject
)
Storage
()
Storag
e
{
return
self
.
storage
}
...
...
@@ -172,20 +179,22 @@ func (c *StateObject) AddBalance(amount *big.Int) {
statelogger
.
Debugf
(
"%x: #%d %v (+ %v)
\n
"
,
c
.
Address
(),
c
.
nonce
,
c
.
balance
,
amount
)
}
func
(
c
*
StateObject
)
AddAmount
(
amount
*
big
.
Int
)
{
c
.
AddBalance
(
amount
)
}
func
(
c
*
StateObject
)
SubBalance
(
amount
*
big
.
Int
)
{
c
.
SetBalance
(
new
(
big
.
Int
)
.
Sub
(
c
.
balance
,
amount
))
statelogger
.
Debugf
(
"%x: #%d %v (- %v)
\n
"
,
c
.
Address
(),
c
.
nonce
,
c
.
balance
,
amount
)
}
func
(
c
*
StateObject
)
SubAmount
(
amount
*
big
.
Int
)
{
c
.
SubBalance
(
amount
)
}
func
(
c
*
StateObject
)
SetBalance
(
amount
*
big
.
Int
)
{
c
.
balance
=
amount
c
.
dirty
=
true
}
func
(
c
*
StateObject
)
St
()
Storage
{
return
c
.
storage
}
//
// Gas setters and getters
//
...
...
@@ -198,7 +207,7 @@ func (c *StateObject) ConvertGas(gas, price *big.Int) error {
return
fmt
.
Errorf
(
"insufficient amount: %v, %v"
,
c
.
balance
,
total
)
}
c
.
Sub
Amount
(
total
)
c
.
Sub
Balance
(
total
)
c
.
dirty
=
true
...
...
@@ -221,7 +230,7 @@ func (self *StateObject) BuyGas(gas, price *big.Int) error {
rGas
:=
new
(
big
.
Int
)
.
Set
(
gas
)
rGas
.
Mul
(
rGas
,
price
)
self
.
Add
Amount
(
rGas
)
self
.
Add
Balance
(
rGas
)
self
.
dirty
=
true
...
...
ui/frontend.go
0 → 100644
View file @
af6971f8
package
ui
// ReturnInterface is returned by the Intercom interface when a method is called
type
ReturnInterface
interface
{
Get
(
i
int
)
(
interface
{},
error
)
Size
()
int
}
// Frontend is the basic interface for calling arbitrary methods on something that
// implements a front end (GUI, CLI, etc)
type
Frontend
interface
{
// Checks whether a specific method is implemented
Supports
(
method
string
)
bool
// Call calls the given method on interface it implements. This will return
// an error with errNotImplemented if the method hasn't been implemented
// and will return a ReturnInterface if it does.
Call
(
method
string
)
(
ReturnInterface
,
error
)
}
vm/vm.go
View file @
af6971f8
...
...
@@ -16,6 +16,8 @@ type Vm struct {
logStr
string
err
error
// For logging
debug
bool
Dbg
Debugger
...
...
@@ -32,7 +34,7 @@ func New(env Environment) *Vm {
lt
=
LogTyDiff
}
return
&
Vm
{
env
:
env
,
logTy
:
lt
,
Recoverable
:
true
}
return
&
Vm
{
debug
:
false
,
env
:
env
,
logTy
:
lt
,
Recoverable
:
true
}
}
func
(
self
*
Vm
)
Run
(
me
,
caller
ContextRef
,
code
[]
byte
,
value
,
gas
,
price
*
big
.
Int
,
callData
[]
byte
)
(
ret
[]
byte
,
err
error
)
{
...
...
@@ -664,6 +666,7 @@ func (self *Vm) Run(me, caller ContextRef, code []byte, value, gas, price *big.I
}
addr
=
ref
.
Address
()
fmt
.
Printf
(
"CREATE %X
\n
"
,
addr
)
stack
.
Push
(
ethutil
.
BigD
(
addr
))
}
...
...
@@ -727,7 +730,7 @@ func (self *Vm) Run(me, caller ContextRef, code []byte, value, gas, price *big.I
self
.
Printf
(
" => (%x) %v"
,
receiver
.
Address
()[
:
4
],
balance
)
receiver
.
Add
Amount
(
balance
)
receiver
.
Add
Balance
(
balance
)
statedb
.
Delete
(
context
.
Address
())
fallthrough
...
...
@@ -828,7 +831,7 @@ func (self *Vm) calculateGasAndSize(context *Context, caller ContextRef, op OpCo
// 0 => non 0
mult
=
ethutil
.
Big3
}
else
if
len
(
val
)
>
0
&&
len
(
y
.
Bytes
())
==
0
{
statedb
.
Refund
(
caller
.
Address
(),
GasSStoreRefund
)
statedb
.
Refund
(
self
.
env
.
Origin
(),
GasSStoreRefund
)
mult
=
ethutil
.
Big0
}
else
{
...
...
@@ -937,18 +940,22 @@ func (self *Vm) RunPrecompiled(p *PrecompiledAccount, callData []byte, context *
}
func
(
self
*
Vm
)
Printf
(
format
string
,
v
...
interface
{})
VirtualMachine
{
if
self
.
debug
{
if
self
.
logTy
==
LogTyPretty
{
self
.
logStr
+=
fmt
.
Sprintf
(
format
,
v
...
)
}
}
return
self
}
func
(
self
*
Vm
)
Endl
()
VirtualMachine
{
if
self
.
debug
{
if
self
.
logTy
==
LogTyPretty
{
vmlogger
.
Debugln
(
self
.
logStr
)
self
.
logStr
=
""
}
}
return
self
}
...
...
xeth/
world
.go
→
xeth/
state
.go
View file @
af6971f8
...
...
@@ -4,18 +4,19 @@ import "github.com/ethereum/go-ethereum/state"
type
State
struct
{
xeth
*
XEth
state
*
state
.
StateDB
}
func
NewState
(
xeth
*
XEth
)
*
State
{
return
&
State
{
xeth
}
func
NewState
(
xeth
*
XEth
,
statedb
*
state
.
StateDB
)
*
State
{
return
&
State
{
xeth
,
statedb
}
}
func
(
self
*
State
)
State
()
*
state
.
StateDB
{
return
self
.
xeth
.
chainManager
.
TransState
()
return
self
.
state
}
func
(
self
*
State
)
Get
(
addr
string
)
*
Object
{
return
&
Object
{
self
.
State
()
.
GetStateObject
(
fromHex
(
addr
))}
return
&
Object
{
self
.
state
.
GetStateObject
(
fromHex
(
addr
))}
}
func
(
self
*
State
)
SafeGet
(
addr
string
)
*
Object
{
...
...
@@ -23,7 +24,7 @@ func (self *State) SafeGet(addr string) *Object {
}
func
(
self
*
State
)
safeGet
(
addr
string
)
*
state
.
StateObject
{
object
:=
self
.
State
()
.
GetStateObject
(
fromHex
(
addr
))
object
:=
self
.
state
.
GetStateObject
(
fromHex
(
addr
))
if
object
==
nil
{
object
=
state
.
NewStateObject
(
fromHex
(
addr
),
self
.
xeth
.
eth
.
Db
())
}
...
...
xeth/xeth.go
View file @
af6971f8
...
...
@@ -17,6 +17,7 @@ import (
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/miner"
"github.com/ethereum/go-ethereum/p2p"
"github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/whisper"
)
...
...
@@ -54,13 +55,26 @@ func New(eth Backend) *XEth {
whisper
:
NewWhisper
(
eth
.
Whisper
()),
miner
:
eth
.
Miner
(),
}
xeth
.
state
=
NewState
(
xeth
)
xeth
.
state
=
NewState
(
xeth
,
xeth
.
chainManager
.
TransState
()
)
return
xeth
}
func
(
self
*
XEth
)
Backend
()
Backend
{
return
self
.
eth
}
func
(
self
*
XEth
)
UseState
(
statedb
*
state
.
StateDB
)
*
XEth
{
xeth
:=
&
XEth
{
eth
:
self
.
eth
,
blockProcessor
:
self
.
blockProcessor
,
chainManager
:
self
.
chainManager
,
whisper
:
self
.
whisper
,
miner
:
self
.
miner
,
}
xeth
.
state
=
NewState
(
xeth
,
statedb
)
return
xeth
}
func
(
self
*
XEth
)
State
()
*
State
{
return
self
.
state
}
func
(
self
*
XEth
)
Whisper
()
*
Whisper
{
return
self
.
whisper
}
func
(
self
*
XEth
)
Miner
()
*
miner
.
Miner
{
return
self
.
miner
}
...
...
@@ -229,7 +243,7 @@ func (self *XEth) Call(toStr, valueStr, gasStr, gasPriceStr, dataStr string) (st
}
var
(
statedb
=
self
.
chainManager
.
TransState
()
statedb
=
self
.
State
()
.
State
()
//self.
chainManager.TransState()
key
=
self
.
eth
.
KeyManager
()
.
KeyPair
()
from
=
statedb
.
GetOrNewStateObject
(
key
.
Address
())
block
=
self
.
chainManager
.
CurrentBlock
()
...
...
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