mirror of
https://github.com/status-im/status-go.git
synced 2025-02-24 20:58:26 +00:00
Upgrade geth to 1.8.13 (#1140)
This commit is contained in:
parent
27e432a5b1
commit
ecc39735f5
22
Gopkg.lock
generated
22
Gopkg.lock
generated
@ -73,6 +73,13 @@
|
|||||||
pruneopts = "NUT"
|
pruneopts = "NUT"
|
||||||
revision = "346938d642f2ec3594ed81d874461961cd0faa76"
|
revision = "346938d642f2ec3594ed81d874461961cd0faa76"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:f843994cb2667148fd97faca6699ce392f1a4c367801a0c13df8802497b261fe"
|
||||||
|
name = "github.com/deckarep/golang-set"
|
||||||
|
packages = ["."]
|
||||||
|
pruneopts = "NUT"
|
||||||
|
revision = "504e848d77ea4752b3057b8fb46da0e7f746ccf3"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:e72bf8962d37cf1dccf27a58ad0b9545fb4c8ea3b9e3bb0319de627d13b8a8d9"
|
digest = "1:e72bf8962d37cf1dccf27a58ad0b9545fb4c8ea3b9e3bb0319de627d13b8a8d9"
|
||||||
name = "github.com/edsrzf/mmap-go"
|
name = "github.com/edsrzf/mmap-go"
|
||||||
@ -81,7 +88,7 @@
|
|||||||
revision = "935e0e8a636ca4ba70b713f3e38a19e1b77739e8"
|
revision = "935e0e8a636ca4ba70b713f3e38a19e1b77739e8"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:3238a0c355a81640974751f7d3bab21bf91035165f75c2c457959425c0422a4b"
|
digest = "1:b2f36e5422bda96da299f9e48c7dcdd3177b18477297f84ff1a45ec3032c2994"
|
||||||
name = "github.com/ethereum/go-ethereum"
|
name = "github.com/ethereum/go-ethereum"
|
||||||
packages = [
|
packages = [
|
||||||
".",
|
".",
|
||||||
@ -113,7 +120,6 @@
|
|||||||
"crypto/bn256/cloudflare",
|
"crypto/bn256/cloudflare",
|
||||||
"crypto/bn256/google",
|
"crypto/bn256/google",
|
||||||
"crypto/ecies",
|
"crypto/ecies",
|
||||||
"crypto/randentropy",
|
|
||||||
"crypto/secp256k1",
|
"crypto/secp256k1",
|
||||||
"crypto/sha3",
|
"crypto/sha3",
|
||||||
"eth",
|
"eth",
|
||||||
@ -149,8 +155,8 @@
|
|||||||
"whisper/whisperv6",
|
"whisper/whisperv6",
|
||||||
]
|
]
|
||||||
pruneopts = "T"
|
pruneopts = "T"
|
||||||
revision = "dea1ce052a10cd7d401a5c04f83f371a06fe293c"
|
revision = "225171a4bfcc16bd12a1906b1e0d43d0b18c353b"
|
||||||
version = "v1.8.11"
|
version = "v1.8.13"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:5ac7ecd476a2355a5201229081df2e5f57333ecf703e1f69dde699ae34169c1b"
|
digest = "1:5ac7ecd476a2355a5201229081df2e5f57333ecf703e1f69dde699ae34169c1b"
|
||||||
@ -966,14 +972,6 @@
|
|||||||
pruneopts = "NUT"
|
pruneopts = "NUT"
|
||||||
revision = "ac136b6c2db7c4d43955e4bc7174db36dc0539c0"
|
revision = "ac136b6c2db7c4d43955e4bc7174db36dc0539c0"
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
branch = "v0.1.1"
|
|
||||||
digest = "1:0d0b6541386224b81c732450e5d6e28ece856ec5ba17f693ffbbb38c02ed93b9"
|
|
||||||
name = "gopkg.in/fatih/set.v0"
|
|
||||||
packages = ["."]
|
|
||||||
pruneopts = "NUT"
|
|
||||||
revision = "27c40922c40b43fe04554d8223a402af3ea333f3"
|
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:6aba14c40a7d987288b30c37893238d136e027788f27f8bb9c7ad98b15d30040"
|
digest = "1:6aba14c40a7d987288b30c37893238d136e027788f27f8bb9c7ad98b15d30040"
|
||||||
name = "gopkg.in/go-playground/validator.v9"
|
name = "gopkg.in/go-playground/validator.v9"
|
||||||
|
@ -27,7 +27,7 @@ ignored = [ "github.com/ethereum/go-ethereum/ethapi" ]
|
|||||||
|
|
||||||
[[constraint]]
|
[[constraint]]
|
||||||
name = "github.com/ethereum/go-ethereum"
|
name = "github.com/ethereum/go-ethereum"
|
||||||
version = "v1.8.5"
|
version = "v1.8.13"
|
||||||
|
|
||||||
# * * * * * `go-ethereum` dependencies * * * * *
|
# * * * * * `go-ethereum` dependencies * * * * *
|
||||||
# Pinned down SHAs from `go-ethereum/vendor/vendor.json`
|
# Pinned down SHAs from `go-ethereum/vendor/vendor.json`
|
||||||
@ -151,3 +151,7 @@ ignored = [ "github.com/ethereum/go-ethereum/ethapi" ]
|
|||||||
[[constraint]]
|
[[constraint]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
name = "github.com/status-im/rendezvous"
|
name = "github.com/status-im/rendezvous"
|
||||||
|
|
||||||
|
[[override]]
|
||||||
|
name = "github.com/deckarep/golang-set"
|
||||||
|
revision = "504e848d77ea4752b3057b8fb46da0e7f746ccf3"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
diff --git a/accounts/keystore/key.go b/accounts/keystore/key.go
|
diff --git a/accounts/keystore/key.go b/accounts/keystore/key.go
|
||||||
index 211fa863d..65c83f3b0 100644
|
index 211fa863..65c83f3b 100644
|
||||||
--- a/accounts/keystore/key.go
|
--- a/accounts/keystore/key.go
|
||||||
+++ b/accounts/keystore/key.go
|
+++ b/accounts/keystore/key.go
|
||||||
@@ -33,6 +33,7 @@ import (
|
@@ -33,6 +33,7 @@ import (
|
||||||
@ -80,7 +80,7 @@ index 211fa863d..65c83f3b0 100644
|
|||||||
// into the Direct ICAP spec. for simplicity and easier compatibility with other libs, we
|
// into the Direct ICAP spec. for simplicity and easier compatibility with other libs, we
|
||||||
// retry until the first byte is 0.
|
// retry until the first byte is 0.
|
||||||
diff --git a/accounts/keystore/keystore.go b/accounts/keystore/keystore.go
|
diff --git a/accounts/keystore/keystore.go b/accounts/keystore/keystore.go
|
||||||
index 80ccd3741..750608145 100644
|
index 6b04acd0..ac2ab008 100644
|
||||||
--- a/accounts/keystore/keystore.go
|
--- a/accounts/keystore/keystore.go
|
||||||
+++ b/accounts/keystore/keystore.go
|
+++ b/accounts/keystore/keystore.go
|
||||||
@@ -38,6 +38,7 @@ import (
|
@@ -38,6 +38,7 @@ import (
|
||||||
@ -165,18 +165,18 @@ index 80ccd3741..750608145 100644
|
|||||||
for i := range b {
|
for i := range b {
|
||||||
b[i] = 0
|
b[i] = 0
|
||||||
diff --git a/accounts/keystore/keystore_passphrase.go b/accounts/keystore/keystore_passphrase.go
|
diff --git a/accounts/keystore/keystore_passphrase.go b/accounts/keystore/keystore_passphrase.go
|
||||||
index eaec39f7d..902b213e2 100644
|
index 59738abe..2b6ef252 100644
|
||||||
--- a/accounts/keystore/keystore_passphrase.go
|
--- a/accounts/keystore/keystore_passphrase.go
|
||||||
+++ b/accounts/keystore/keystore_passphrase.go
|
+++ b/accounts/keystore/keystore_passphrase.go
|
||||||
@@ -41,6 +41,7 @@ import (
|
@@ -41,6 +41,7 @@ import (
|
||||||
|
"github.com/ethereum/go-ethereum/common/math"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/ethereum/go-ethereum/crypto/randentropy"
|
|
||||||
"github.com/pborman/uuid"
|
"github.com/pborman/uuid"
|
||||||
+ "github.com/status-im/status-go/extkeys"
|
+ "github.com/status-im/status-go/extkeys"
|
||||||
"golang.org/x/crypto/pbkdf2"
|
"golang.org/x/crypto/pbkdf2"
|
||||||
"golang.org/x/crypto/scrypt"
|
"golang.org/x/crypto/scrypt"
|
||||||
)
|
)
|
||||||
@@ -151,15 +152,62 @@ func EncryptKey(key *Key, auth string, scryptN, scryptP int) ([]byte, error) {
|
@@ -157,15 +158,68 @@ func EncryptKey(key *Key, auth string, scryptN, scryptP int) ([]byte, error) {
|
||||||
KDFParams: scryptParamsJSON,
|
KDFParams: scryptParamsJSON,
|
||||||
MAC: hex.EncodeToString(mac),
|
MAC: hex.EncodeToString(mac),
|
||||||
}
|
}
|
||||||
@ -200,7 +200,10 @@ index eaec39f7d..902b213e2 100644
|
|||||||
+ return cryptoJSON{}, nil
|
+ return cryptoJSON{}, nil
|
||||||
+ }
|
+ }
|
||||||
+ authArray := []byte(auth)
|
+ authArray := []byte(auth)
|
||||||
+ salt := randentropy.GetEntropyCSPRNG(32)
|
+ salt := make([]byte, 32)
|
||||||
|
+ if _, err := io.ReadFull(rand.Reader, salt); err != nil {
|
||||||
|
+ panic("reading from crypto/rand failed: " + err.Error())
|
||||||
|
+ }
|
||||||
+ derivedKey, err := scrypt.Key(authArray, salt, scryptN, scryptR, scryptP, scryptDKLen)
|
+ derivedKey, err := scrypt.Key(authArray, salt, scryptN, scryptR, scryptP, scryptDKLen)
|
||||||
+ if err != nil {
|
+ if err != nil {
|
||||||
+ return cryptoJSON{}, err
|
+ return cryptoJSON{}, err
|
||||||
@ -208,7 +211,10 @@ index eaec39f7d..902b213e2 100644
|
|||||||
+ encryptKey := derivedKey[:16]
|
+ encryptKey := derivedKey[:16]
|
||||||
+ keyBytes := []byte(extKey.String())
|
+ keyBytes := []byte(extKey.String())
|
||||||
+
|
+
|
||||||
+ iv := randentropy.GetEntropyCSPRNG(aes.BlockSize) // 16
|
+ iv := make([]byte, aes.BlockSize) // 16
|
||||||
|
+ if _, err := io.ReadFull(rand.Reader, iv); err != nil {
|
||||||
|
+ panic("reading from crypto/rand failed: " + err.Error())
|
||||||
|
+ }
|
||||||
+ cipherText, err := aesCTRXOR(encryptKey, keyBytes, iv)
|
+ cipherText, err := aesCTRXOR(encryptKey, keyBytes, iv)
|
||||||
+ if err != nil {
|
+ if err != nil {
|
||||||
+ return cryptoJSON{}, err
|
+ return cryptoJSON{}, err
|
||||||
@ -239,7 +245,7 @@ index eaec39f7d..902b213e2 100644
|
|||||||
// DecryptKey decrypts a key from a json blob, returning the private key itself.
|
// DecryptKey decrypts a key from a json blob, returning the private key itself.
|
||||||
func DecryptKey(keyjson []byte, auth string) (*Key, error) {
|
func DecryptKey(keyjson []byte, auth string) (*Key, error) {
|
||||||
// Parse the json into a simple map to fetch the key version
|
// Parse the json into a simple map to fetch the key version
|
||||||
@@ -171,20 +219,43 @@ func DecryptKey(keyjson []byte, auth string) (*Key, error) {
|
@@ -177,20 +231,43 @@ func DecryptKey(keyjson []byte, auth string) (*Key, error) {
|
||||||
var (
|
var (
|
||||||
keyBytes, keyId []byte
|
keyBytes, keyId []byte
|
||||||
err error
|
err error
|
||||||
@ -283,7 +289,7 @@ index eaec39f7d..902b213e2 100644
|
|||||||
// Handle any decryption errors and return the key
|
// Handle any decryption errors and return the key
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -192,9 +263,11 @@ func DecryptKey(keyjson []byte, auth string) (*Key, error) {
|
@@ -198,9 +275,11 @@ func DecryptKey(keyjson []byte, auth string) (*Key, error) {
|
||||||
key := crypto.ToECDSAUnsafe(keyBytes)
|
key := crypto.ToECDSAUnsafe(keyBytes)
|
||||||
|
|
||||||
return &Key{
|
return &Key{
|
||||||
@ -298,7 +304,7 @@ index eaec39f7d..902b213e2 100644
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -274,6 +347,51 @@ func decryptKeyV1(keyProtected *encryptedKeyJSONV1, auth string) (keyBytes []byt
|
@@ -280,6 +359,51 @@ func decryptKeyV1(keyProtected *encryptedKeyJSONV1, auth string) (keyBytes []byt
|
||||||
return plainText, keyId, err
|
return plainText, keyId, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,26 +0,0 @@
|
|||||||
diff --git a/whisper/whisperv5/whisper.go b/whisper/whisperv5/whisper.go
|
|
||||||
index 62bd1ce17..cec233cb0 100644
|
|
||||||
--- a/whisper/whisperv5/whisper.go
|
|
||||||
+++ b/whisper/whisperv5/whisper.go
|
|
||||||
@@ -499,7 +499,7 @@ func (w *Whisper) runMessageLoop(p *Peer, rw p2p.MsgReadWriter) error {
|
|
||||||
// fetch the next packet
|
|
||||||
packet, err := rw.ReadMsg()
|
|
||||||
if err != nil {
|
|
||||||
- log.Warn("message loop", "peer", p.peer.ID(), "err", err)
|
|
||||||
+ log.Info("message loop", "peer", p.peer.ID(), "err", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if packet.Size > w.MaxMessageSize() {
|
|
||||||
diff --git a/whisper/whisperv6/whisper.go b/whisper/whisperv6/whisper.go
|
|
||||||
index 880cced09..91d448217 100644
|
|
||||||
--- a/whisper/whisperv6/whisper.go
|
|
||||||
+++ b/whisper/whisperv6/whisper.go
|
|
||||||
@@ -650,7 +747,7 @@ func (whisper *Whisper) runMessageLoop(p *Peer, rw p2p.MsgReadWriter) error {
|
|
||||||
// fetch the next packet
|
|
||||||
packet, err := rw.ReadMsg()
|
|
||||||
if err != nil {
|
|
||||||
- log.Warn("message loop", "peer", p.peer.ID(), "err", err)
|
|
||||||
+ log.Info("message loop", "peer", p.peer.ID(), "err", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if packet.Size > whisper.MaxMessageSize() {
|
|
@ -1,7 +1,7 @@
|
|||||||
diff --git i/node/node.go w/node/node.go
|
diff --git a/node/node.go b/node/node.go
|
||||||
index 83b6c4c07..fe42b8bbd 100644
|
index ada38372..5ea58e13 100644
|
||||||
--- i/node/node.go
|
--- a/node/node.go
|
||||||
+++ w/node/node.go
|
+++ b/node/node.go
|
||||||
@@ -51,8 +51,9 @@ type Node struct {
|
@@ -51,8 +51,9 @@ type Node struct {
|
||||||
serviceFuncs []ServiceConstructor // Service constructors (in dependency order)
|
serviceFuncs []ServiceConstructor // Service constructors (in dependency order)
|
||||||
services map[reflect.Type]Service // Currently running services
|
services map[reflect.Type]Service // Currently running services
|
||||||
@ -27,7 +27,7 @@ index 83b6c4c07..fe42b8bbd 100644
|
|||||||
n.stopInProc()
|
n.stopInProc()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := n.startHTTP(n.httpEndpoint, apis, n.config.HTTPModules, n.config.HTTPCors, n.config.HTTPVirtualHosts); err != nil {
|
if err := n.startHTTP(n.httpEndpoint, apis, n.config.HTTPModules, n.config.HTTPCors, n.config.HTTPVirtualHosts, n.config.HTTPTimeouts); err != nil {
|
||||||
n.stopIPC()
|
n.stopIPC()
|
||||||
+ n.stopPublicInProc()
|
+ n.stopPublicInProc()
|
||||||
n.stopInProc()
|
n.stopInProc()
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
diff --git c/whisper/whisperv6/events.go w/whisper/whisperv6/events.go
|
diff --git a/whisper/whisperv6/events.go b/whisper/whisperv6/events.go
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 000000000..4f204ab5d
|
index 00000000..e03ec9de
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ w/whisper/whisperv6/events.go
|
+++ b/whisper/whisperv6/events.go
|
||||||
@@ -0,0 +1,23 @@
|
@@ -0,0 +1,23 @@
|
||||||
+package whisperv6
|
+package whisperv6
|
||||||
+
|
+
|
||||||
@ -27,10 +27,10 @@ index 000000000..4f204ab5d
|
|||||||
+ Hash common.Hash
|
+ Hash common.Hash
|
||||||
+ Peer discover.NodeID
|
+ Peer discover.NodeID
|
||||||
+}
|
+}
|
||||||
diff --git i/whisper/whisperv6/peer.go w/whisper/whisperv6/peer.go
|
diff --git a/whisper/whisperv6/peer.go b/whisper/whisperv6/peer.go
|
||||||
index 2bf1c905b..427127290 100644
|
index 79cc2127..018d8f82 100644
|
||||||
--- i/whisper/whisperv6/peer.go
|
--- a/whisper/whisperv6/peer.go
|
||||||
+++ w/whisper/whisperv6/peer.go
|
+++ b/whisper/whisperv6/peer.go
|
||||||
@@ -204,6 +204,11 @@ func (peer *Peer) broadcast() error {
|
@@ -204,6 +204,11 @@ func (peer *Peer) broadcast() error {
|
||||||
// mark envelopes only if they were successfully sent
|
// mark envelopes only if they were successfully sent
|
||||||
for _, e := range bundle {
|
for _, e := range bundle {
|
||||||
@ -43,12 +43,12 @@ index 2bf1c905b..427127290 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
log.Trace("broadcast", "num. messages", len(bundle))
|
log.Trace("broadcast", "num. messages", len(bundle))
|
||||||
diff --git i/whisper/whisperv6/whisper.go w/whisper/whisperv6/whisper.go
|
diff --git a/whisper/whisperv6/whisper.go b/whisper/whisperv6/whisper.go
|
||||||
index 9aaf5687c..eb637b4ca 100644
|
index 414aa788..3c3c66ad 100644
|
||||||
--- i/whisper/whisperv6/whisper.go
|
--- a/whisper/whisperv6/whisper.go
|
||||||
+++ w/whisper/whisperv6/whisper.go
|
+++ b/whisper/whisperv6/whisper.go
|
||||||
@@ -28,6 +28,7 @@ import (
|
@@ -29,6 +29,7 @@ import (
|
||||||
|
mapset "github.com/deckarep/golang-set"
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
+ "github.com/ethereum/go-ethereum/event"
|
+ "github.com/ethereum/go-ethereum/event"
|
||||||
|
@ -1,24 +0,0 @@
|
|||||||
diff --git a/node/api.go b/node/api.go
|
|
||||||
index 6d5df7d..dc7d6ae 100644
|
|
||||||
--- a/node/api.go
|
|
||||||
+++ b/node/api.go
|
|
||||||
@@ -348,13 +348,13 @@ func (api *PublicDebugAPI) Metrics(raw bool) (map[string]interface{}, error) {
|
|
||||||
ps := t.Percentiles([]float64{5, 20, 50, 80, 95})
|
|
||||||
root[name] = map[string]interface{}{
|
|
||||||
"Measurements": len(t.Values()),
|
|
||||||
- "Mean": time.Duration(t.Mean()).String(),
|
|
||||||
+ "Mean": t.Mean(),
|
|
||||||
"Percentiles": map[string]interface{}{
|
|
||||||
- "5": time.Duration(ps[0]).String(),
|
|
||||||
- "20": time.Duration(ps[1]).String(),
|
|
||||||
- "50": time.Duration(ps[2]).String(),
|
|
||||||
- "80": time.Duration(ps[3]).String(),
|
|
||||||
- "95": time.Duration(ps[4]).String(),
|
|
||||||
+ "5": ps[0],
|
|
||||||
+ "20": ps[1],
|
|
||||||
+ "50": ps[2],
|
|
||||||
+ "80": ps[3],
|
|
||||||
+ "95": ps[4],
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
|||||||
diff --git a/metrics/metrics.go b/metrics/metrics.go
|
diff --git a/metrics/metrics.go b/metrics/metrics.go
|
||||||
index 2356f2b1..802f1363 100644
|
index 2a2b804e..d4d703df 100644
|
||||||
--- a/metrics/metrics.go
|
--- a/metrics/metrics.go
|
||||||
+++ b/metrics/metrics.go
|
+++ b/metrics/metrics.go
|
||||||
@@ -56,6 +56,7 @@ func CollectProcessMetrics(refresh time.Duration) {
|
@@ -56,6 +56,7 @@ func CollectProcessMetrics(refresh time.Duration) {
|
||||||
@ -9,10 +9,10 @@ index 2356f2b1..802f1363 100644
|
|||||||
+ goroutines := GetOrRegisterGauge("system/goroutines", DefaultRegistry)
|
+ goroutines := GetOrRegisterGauge("system/goroutines", DefaultRegistry)
|
||||||
|
|
||||||
var diskReads, diskReadBytes, diskWrites, diskWriteBytes Meter
|
var diskReads, diskReadBytes, diskWrites, diskWriteBytes Meter
|
||||||
if err := ReadDiskStats(diskstats[0]); err == nil {
|
var diskReadBytesCounter, diskWriteBytesCounter Counter
|
||||||
@@ -83,6 +84,10 @@ func CollectProcessMetrics(refresh time.Duration) {
|
@@ -89,6 +90,10 @@ func CollectProcessMetrics(refresh time.Duration) {
|
||||||
diskWrites.Mark(diskstats[location1].WriteCount - diskstats[location2].WriteCount)
|
diskReadBytesCounter.Inc(diskstats[location1].ReadBytes - diskstats[location2].ReadBytes)
|
||||||
diskWriteBytes.Mark(diskstats[location1].WriteBytes - diskstats[location2].WriteBytes)
|
diskWriteBytesCounter.Inc(diskstats[location1].WriteBytes - diskstats[location2].WriteBytes)
|
||||||
}
|
}
|
||||||
+
|
+
|
||||||
+ goroutines.Update(int64(runtime.NumGoroutine()))
|
+ goroutines.Update(int64(runtime.NumGoroutine()))
|
||||||
|
22
vendor/gopkg.in/fatih/set.v0/LICENSE.md → vendor/github.com/deckarep/golang-set/LICENSE
generated
vendored
22
vendor/gopkg.in/fatih/set.v0/LICENSE.md → vendor/github.com/deckarep/golang-set/LICENSE
generated
vendored
@ -1,20 +1,22 @@
|
|||||||
The MIT License (MIT)
|
Open Source Initiative OSI - The MIT License (MIT):Licensing
|
||||||
|
|
||||||
Copyright (c) 2013 Fatih Arslan
|
The MIT License (MIT)
|
||||||
|
Copyright (c) 2013 Ralph Caraveo (deckarep@gmail.com)
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
the Software without restriction, including without limitation the rights to
|
the Software without restriction, including without limitation the rights to
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
subject to the following conditions:
|
so, subject to the following conditions:
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
58
vendor/github.com/deckarep/golang-set/iterator.go
generated
vendored
Normal file
58
vendor/github.com/deckarep/golang-set/iterator.go
generated
vendored
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
Open Source Initiative OSI - The MIT License (MIT):Licensing
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
Copyright (c) 2013 Ralph Caraveo (deckarep@gmail.com)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
|
so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package mapset
|
||||||
|
|
||||||
|
// Iterator defines an iterator over a Set, its C channel can be used to range over the Set's
|
||||||
|
// elements.
|
||||||
|
type Iterator struct {
|
||||||
|
C <-chan interface{}
|
||||||
|
stop chan struct{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop stops the Iterator, no further elements will be received on C, C will be closed.
|
||||||
|
func (i *Iterator) Stop() {
|
||||||
|
// Allows for Stop() to be called multiple times
|
||||||
|
// (close() panics when called on already closed channel)
|
||||||
|
defer func() {
|
||||||
|
recover()
|
||||||
|
}()
|
||||||
|
|
||||||
|
close(i.stop)
|
||||||
|
|
||||||
|
// Exhaust any remaining elements.
|
||||||
|
for range i.C {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// newIterator returns a new Iterator instance together with its item and stop channels.
|
||||||
|
func newIterator() (*Iterator, chan<- interface{}, <-chan struct{}) {
|
||||||
|
itemChan := make(chan interface{})
|
||||||
|
stopChan := make(chan struct{})
|
||||||
|
return &Iterator{
|
||||||
|
C: itemChan,
|
||||||
|
stop: stopChan,
|
||||||
|
}, itemChan, stopChan
|
||||||
|
}
|
217
vendor/github.com/deckarep/golang-set/set.go
generated
vendored
Normal file
217
vendor/github.com/deckarep/golang-set/set.go
generated
vendored
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
/*
|
||||||
|
Open Source Initiative OSI - The MIT License (MIT):Licensing
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
Copyright (c) 2013 Ralph Caraveo (deckarep@gmail.com)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
|
so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Package mapset implements a simple and generic set collection.
|
||||||
|
// Items stored within it are unordered and unique. It supports
|
||||||
|
// typical set operations: membership testing, intersection, union,
|
||||||
|
// difference, symmetric difference and cloning.
|
||||||
|
//
|
||||||
|
// Package mapset provides two implementations of the Set
|
||||||
|
// interface. The default implementation is safe for concurrent
|
||||||
|
// access, but a non-thread-safe implementation is also provided for
|
||||||
|
// programs that can benefit from the slight speed improvement and
|
||||||
|
// that can enforce mutual exclusion through other means.
|
||||||
|
package mapset
|
||||||
|
|
||||||
|
// Set is the primary interface provided by the mapset package. It
|
||||||
|
// represents an unordered set of data and a large number of
|
||||||
|
// operations that can be applied to that set.
|
||||||
|
type Set interface {
|
||||||
|
// Adds an element to the set. Returns whether
|
||||||
|
// the item was added.
|
||||||
|
Add(i interface{}) bool
|
||||||
|
|
||||||
|
// Returns the number of elements in the set.
|
||||||
|
Cardinality() int
|
||||||
|
|
||||||
|
// Removes all elements from the set, leaving
|
||||||
|
// the empty set.
|
||||||
|
Clear()
|
||||||
|
|
||||||
|
// Returns a clone of the set using the same
|
||||||
|
// implementation, duplicating all keys.
|
||||||
|
Clone() Set
|
||||||
|
|
||||||
|
// Returns whether the given items
|
||||||
|
// are all in the set.
|
||||||
|
Contains(i ...interface{}) bool
|
||||||
|
|
||||||
|
// Returns the difference between this set
|
||||||
|
// and other. The returned set will contain
|
||||||
|
// all elements of this set that are not also
|
||||||
|
// elements of other.
|
||||||
|
//
|
||||||
|
// Note that the argument to Difference
|
||||||
|
// must be of the same type as the receiver
|
||||||
|
// of the method. Otherwise, Difference will
|
||||||
|
// panic.
|
||||||
|
Difference(other Set) Set
|
||||||
|
|
||||||
|
// Determines if two sets are equal to each
|
||||||
|
// other. If they have the same cardinality
|
||||||
|
// and contain the same elements, they are
|
||||||
|
// considered equal. The order in which
|
||||||
|
// the elements were added is irrelevant.
|
||||||
|
//
|
||||||
|
// Note that the argument to Equal must be
|
||||||
|
// of the same type as the receiver of the
|
||||||
|
// method. Otherwise, Equal will panic.
|
||||||
|
Equal(other Set) bool
|
||||||
|
|
||||||
|
// Returns a new set containing only the elements
|
||||||
|
// that exist only in both sets.
|
||||||
|
//
|
||||||
|
// Note that the argument to Intersect
|
||||||
|
// must be of the same type as the receiver
|
||||||
|
// of the method. Otherwise, Intersect will
|
||||||
|
// panic.
|
||||||
|
Intersect(other Set) Set
|
||||||
|
|
||||||
|
// Determines if every element in this set is in
|
||||||
|
// the other set but the two sets are not equal.
|
||||||
|
//
|
||||||
|
// Note that the argument to IsProperSubset
|
||||||
|
// must be of the same type as the receiver
|
||||||
|
// of the method. Otherwise, IsProperSubset
|
||||||
|
// will panic.
|
||||||
|
IsProperSubset(other Set) bool
|
||||||
|
|
||||||
|
// Determines if every element in the other set
|
||||||
|
// is in this set but the two sets are not
|
||||||
|
// equal.
|
||||||
|
//
|
||||||
|
// Note that the argument to IsSuperset
|
||||||
|
// must be of the same type as the receiver
|
||||||
|
// of the method. Otherwise, IsSuperset will
|
||||||
|
// panic.
|
||||||
|
IsProperSuperset(other Set) bool
|
||||||
|
|
||||||
|
// Determines if every element in this set is in
|
||||||
|
// the other set.
|
||||||
|
//
|
||||||
|
// Note that the argument to IsSubset
|
||||||
|
// must be of the same type as the receiver
|
||||||
|
// of the method. Otherwise, IsSubset will
|
||||||
|
// panic.
|
||||||
|
IsSubset(other Set) bool
|
||||||
|
|
||||||
|
// Determines if every element in the other set
|
||||||
|
// is in this set.
|
||||||
|
//
|
||||||
|
// Note that the argument to IsSuperset
|
||||||
|
// must be of the same type as the receiver
|
||||||
|
// of the method. Otherwise, IsSuperset will
|
||||||
|
// panic.
|
||||||
|
IsSuperset(other Set) bool
|
||||||
|
|
||||||
|
// Iterates over elements and executes the passed func against each element.
|
||||||
|
// If passed func returns true, stop iteration at the time.
|
||||||
|
Each(func(interface{}) bool)
|
||||||
|
|
||||||
|
// Returns a channel of elements that you can
|
||||||
|
// range over.
|
||||||
|
Iter() <-chan interface{}
|
||||||
|
|
||||||
|
// Returns an Iterator object that you can
|
||||||
|
// use to range over the set.
|
||||||
|
Iterator() *Iterator
|
||||||
|
|
||||||
|
// Remove a single element from the set.
|
||||||
|
Remove(i interface{})
|
||||||
|
|
||||||
|
// Provides a convenient string representation
|
||||||
|
// of the current state of the set.
|
||||||
|
String() string
|
||||||
|
|
||||||
|
// Returns a new set with all elements which are
|
||||||
|
// in either this set or the other set but not in both.
|
||||||
|
//
|
||||||
|
// Note that the argument to SymmetricDifference
|
||||||
|
// must be of the same type as the receiver
|
||||||
|
// of the method. Otherwise, SymmetricDifference
|
||||||
|
// will panic.
|
||||||
|
SymmetricDifference(other Set) Set
|
||||||
|
|
||||||
|
// Returns a new set with all elements in both sets.
|
||||||
|
//
|
||||||
|
// Note that the argument to Union must be of the
|
||||||
|
|
||||||
|
// same type as the receiver of the method.
|
||||||
|
// Otherwise, IsSuperset will panic.
|
||||||
|
Union(other Set) Set
|
||||||
|
|
||||||
|
// Pop removes and returns an arbitrary item from the set.
|
||||||
|
Pop() interface{}
|
||||||
|
|
||||||
|
// Returns all subsets of a given set (Power Set).
|
||||||
|
PowerSet() Set
|
||||||
|
|
||||||
|
// Returns the Cartesian Product of two sets.
|
||||||
|
CartesianProduct(other Set) Set
|
||||||
|
|
||||||
|
// Returns the members of the set as a slice.
|
||||||
|
ToSlice() []interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewSet creates and returns a reference to an empty set. Operations
|
||||||
|
// on the resulting set are thread-safe.
|
||||||
|
func NewSet(s ...interface{}) Set {
|
||||||
|
set := newThreadSafeSet()
|
||||||
|
for _, item := range s {
|
||||||
|
set.Add(item)
|
||||||
|
}
|
||||||
|
return &set
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewSetWith creates and returns a new set with the given elements.
|
||||||
|
// Operations on the resulting set are thread-safe.
|
||||||
|
func NewSetWith(elts ...interface{}) Set {
|
||||||
|
return NewSetFromSlice(elts)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewSetFromSlice creates and returns a reference to a set from an
|
||||||
|
// existing slice. Operations on the resulting set are thread-safe.
|
||||||
|
func NewSetFromSlice(s []interface{}) Set {
|
||||||
|
a := NewSet(s...)
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewThreadUnsafeSet creates and returns a reference to an empty set.
|
||||||
|
// Operations on the resulting set are not thread-safe.
|
||||||
|
func NewThreadUnsafeSet() Set {
|
||||||
|
set := newThreadUnsafeSet()
|
||||||
|
return &set
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewThreadUnsafeSetFromSlice creates and returns a reference to a
|
||||||
|
// set from an existing slice. Operations on the resulting set are
|
||||||
|
// not thread-safe.
|
||||||
|
func NewThreadUnsafeSetFromSlice(s []interface{}) Set {
|
||||||
|
a := NewThreadUnsafeSet()
|
||||||
|
for _, item := range s {
|
||||||
|
a.Add(item)
|
||||||
|
}
|
||||||
|
return a
|
||||||
|
}
|
277
vendor/github.com/deckarep/golang-set/threadsafe.go
generated
vendored
Normal file
277
vendor/github.com/deckarep/golang-set/threadsafe.go
generated
vendored
Normal file
@ -0,0 +1,277 @@
|
|||||||
|
/*
|
||||||
|
Open Source Initiative OSI - The MIT License (MIT):Licensing
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
Copyright (c) 2013 Ralph Caraveo (deckarep@gmail.com)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
|
so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package mapset
|
||||||
|
|
||||||
|
import "sync"
|
||||||
|
|
||||||
|
type threadSafeSet struct {
|
||||||
|
s threadUnsafeSet
|
||||||
|
sync.RWMutex
|
||||||
|
}
|
||||||
|
|
||||||
|
func newThreadSafeSet() threadSafeSet {
|
||||||
|
return threadSafeSet{s: newThreadUnsafeSet()}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) Add(i interface{}) bool {
|
||||||
|
set.Lock()
|
||||||
|
ret := set.s.Add(i)
|
||||||
|
set.Unlock()
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) Contains(i ...interface{}) bool {
|
||||||
|
set.RLock()
|
||||||
|
ret := set.s.Contains(i...)
|
||||||
|
set.RUnlock()
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) IsSubset(other Set) bool {
|
||||||
|
o := other.(*threadSafeSet)
|
||||||
|
|
||||||
|
set.RLock()
|
||||||
|
o.RLock()
|
||||||
|
|
||||||
|
ret := set.s.IsSubset(&o.s)
|
||||||
|
set.RUnlock()
|
||||||
|
o.RUnlock()
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) IsProperSubset(other Set) bool {
|
||||||
|
o := other.(*threadSafeSet)
|
||||||
|
|
||||||
|
set.RLock()
|
||||||
|
defer set.RUnlock()
|
||||||
|
o.RLock()
|
||||||
|
defer o.RUnlock()
|
||||||
|
|
||||||
|
return set.s.IsProperSubset(&o.s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) IsSuperset(other Set) bool {
|
||||||
|
return other.IsSubset(set)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) IsProperSuperset(other Set) bool {
|
||||||
|
return other.IsProperSubset(set)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) Union(other Set) Set {
|
||||||
|
o := other.(*threadSafeSet)
|
||||||
|
|
||||||
|
set.RLock()
|
||||||
|
o.RLock()
|
||||||
|
|
||||||
|
unsafeUnion := set.s.Union(&o.s).(*threadUnsafeSet)
|
||||||
|
ret := &threadSafeSet{s: *unsafeUnion}
|
||||||
|
set.RUnlock()
|
||||||
|
o.RUnlock()
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) Intersect(other Set) Set {
|
||||||
|
o := other.(*threadSafeSet)
|
||||||
|
|
||||||
|
set.RLock()
|
||||||
|
o.RLock()
|
||||||
|
|
||||||
|
unsafeIntersection := set.s.Intersect(&o.s).(*threadUnsafeSet)
|
||||||
|
ret := &threadSafeSet{s: *unsafeIntersection}
|
||||||
|
set.RUnlock()
|
||||||
|
o.RUnlock()
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) Difference(other Set) Set {
|
||||||
|
o := other.(*threadSafeSet)
|
||||||
|
|
||||||
|
set.RLock()
|
||||||
|
o.RLock()
|
||||||
|
|
||||||
|
unsafeDifference := set.s.Difference(&o.s).(*threadUnsafeSet)
|
||||||
|
ret := &threadSafeSet{s: *unsafeDifference}
|
||||||
|
set.RUnlock()
|
||||||
|
o.RUnlock()
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) SymmetricDifference(other Set) Set {
|
||||||
|
o := other.(*threadSafeSet)
|
||||||
|
|
||||||
|
set.RLock()
|
||||||
|
o.RLock()
|
||||||
|
|
||||||
|
unsafeDifference := set.s.SymmetricDifference(&o.s).(*threadUnsafeSet)
|
||||||
|
ret := &threadSafeSet{s: *unsafeDifference}
|
||||||
|
set.RUnlock()
|
||||||
|
o.RUnlock()
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) Clear() {
|
||||||
|
set.Lock()
|
||||||
|
set.s = newThreadUnsafeSet()
|
||||||
|
set.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) Remove(i interface{}) {
|
||||||
|
set.Lock()
|
||||||
|
delete(set.s, i)
|
||||||
|
set.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) Cardinality() int {
|
||||||
|
set.RLock()
|
||||||
|
defer set.RUnlock()
|
||||||
|
return len(set.s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) Each(cb func(interface{}) bool) {
|
||||||
|
set.RLock()
|
||||||
|
for elem := range set.s {
|
||||||
|
if cb(elem) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set.RUnlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) Iter() <-chan interface{} {
|
||||||
|
ch := make(chan interface{})
|
||||||
|
go func() {
|
||||||
|
set.RLock()
|
||||||
|
|
||||||
|
for elem := range set.s {
|
||||||
|
ch <- elem
|
||||||
|
}
|
||||||
|
close(ch)
|
||||||
|
set.RUnlock()
|
||||||
|
}()
|
||||||
|
|
||||||
|
return ch
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) Iterator() *Iterator {
|
||||||
|
iterator, ch, stopCh := newIterator()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
set.RLock()
|
||||||
|
L:
|
||||||
|
for elem := range set.s {
|
||||||
|
select {
|
||||||
|
case <-stopCh:
|
||||||
|
break L
|
||||||
|
case ch <- elem:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(ch)
|
||||||
|
set.RUnlock()
|
||||||
|
}()
|
||||||
|
|
||||||
|
return iterator
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) Equal(other Set) bool {
|
||||||
|
o := other.(*threadSafeSet)
|
||||||
|
|
||||||
|
set.RLock()
|
||||||
|
o.RLock()
|
||||||
|
|
||||||
|
ret := set.s.Equal(&o.s)
|
||||||
|
set.RUnlock()
|
||||||
|
o.RUnlock()
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) Clone() Set {
|
||||||
|
set.RLock()
|
||||||
|
|
||||||
|
unsafeClone := set.s.Clone().(*threadUnsafeSet)
|
||||||
|
ret := &threadSafeSet{s: *unsafeClone}
|
||||||
|
set.RUnlock()
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) String() string {
|
||||||
|
set.RLock()
|
||||||
|
ret := set.s.String()
|
||||||
|
set.RUnlock()
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) PowerSet() Set {
|
||||||
|
set.RLock()
|
||||||
|
ret := set.s.PowerSet()
|
||||||
|
set.RUnlock()
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) Pop() interface{} {
|
||||||
|
set.Lock()
|
||||||
|
defer set.Unlock()
|
||||||
|
return set.s.Pop()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) CartesianProduct(other Set) Set {
|
||||||
|
o := other.(*threadSafeSet)
|
||||||
|
|
||||||
|
set.RLock()
|
||||||
|
o.RLock()
|
||||||
|
|
||||||
|
unsafeCartProduct := set.s.CartesianProduct(&o.s).(*threadUnsafeSet)
|
||||||
|
ret := &threadSafeSet{s: *unsafeCartProduct}
|
||||||
|
set.RUnlock()
|
||||||
|
o.RUnlock()
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) ToSlice() []interface{} {
|
||||||
|
keys := make([]interface{}, 0, set.Cardinality())
|
||||||
|
set.RLock()
|
||||||
|
for elem := range set.s {
|
||||||
|
keys = append(keys, elem)
|
||||||
|
}
|
||||||
|
set.RUnlock()
|
||||||
|
return keys
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) MarshalJSON() ([]byte, error) {
|
||||||
|
set.RLock()
|
||||||
|
b, err := set.s.MarshalJSON()
|
||||||
|
set.RUnlock()
|
||||||
|
|
||||||
|
return b, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadSafeSet) UnmarshalJSON(p []byte) error {
|
||||||
|
set.RLock()
|
||||||
|
err := set.s.UnmarshalJSON(p)
|
||||||
|
set.RUnlock()
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
337
vendor/github.com/deckarep/golang-set/threadunsafe.go
generated
vendored
Normal file
337
vendor/github.com/deckarep/golang-set/threadunsafe.go
generated
vendored
Normal file
@ -0,0 +1,337 @@
|
|||||||
|
/*
|
||||||
|
Open Source Initiative OSI - The MIT License (MIT):Licensing
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
Copyright (c) 2013 Ralph Caraveo (deckarep@gmail.com)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
|
so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package mapset
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type threadUnsafeSet map[interface{}]struct{}
|
||||||
|
|
||||||
|
// An OrderedPair represents a 2-tuple of values.
|
||||||
|
type OrderedPair struct {
|
||||||
|
First interface{}
|
||||||
|
Second interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func newThreadUnsafeSet() threadUnsafeSet {
|
||||||
|
return make(threadUnsafeSet)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Equal says whether two 2-tuples contain the same values in the same order.
|
||||||
|
func (pair *OrderedPair) Equal(other OrderedPair) bool {
|
||||||
|
if pair.First == other.First &&
|
||||||
|
pair.Second == other.Second {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) Add(i interface{}) bool {
|
||||||
|
_, found := (*set)[i]
|
||||||
|
if found {
|
||||||
|
return false //False if it existed already
|
||||||
|
}
|
||||||
|
|
||||||
|
(*set)[i] = struct{}{}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) Contains(i ...interface{}) bool {
|
||||||
|
for _, val := range i {
|
||||||
|
if _, ok := (*set)[val]; !ok {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) IsSubset(other Set) bool {
|
||||||
|
_ = other.(*threadUnsafeSet)
|
||||||
|
for elem := range *set {
|
||||||
|
if !other.Contains(elem) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) IsProperSubset(other Set) bool {
|
||||||
|
return set.IsSubset(other) && !set.Equal(other)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) IsSuperset(other Set) bool {
|
||||||
|
return other.IsSubset(set)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) IsProperSuperset(other Set) bool {
|
||||||
|
return set.IsSuperset(other) && !set.Equal(other)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) Union(other Set) Set {
|
||||||
|
o := other.(*threadUnsafeSet)
|
||||||
|
|
||||||
|
unionedSet := newThreadUnsafeSet()
|
||||||
|
|
||||||
|
for elem := range *set {
|
||||||
|
unionedSet.Add(elem)
|
||||||
|
}
|
||||||
|
for elem := range *o {
|
||||||
|
unionedSet.Add(elem)
|
||||||
|
}
|
||||||
|
return &unionedSet
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) Intersect(other Set) Set {
|
||||||
|
o := other.(*threadUnsafeSet)
|
||||||
|
|
||||||
|
intersection := newThreadUnsafeSet()
|
||||||
|
// loop over smaller set
|
||||||
|
if set.Cardinality() < other.Cardinality() {
|
||||||
|
for elem := range *set {
|
||||||
|
if other.Contains(elem) {
|
||||||
|
intersection.Add(elem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for elem := range *o {
|
||||||
|
if set.Contains(elem) {
|
||||||
|
intersection.Add(elem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return &intersection
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) Difference(other Set) Set {
|
||||||
|
_ = other.(*threadUnsafeSet)
|
||||||
|
|
||||||
|
difference := newThreadUnsafeSet()
|
||||||
|
for elem := range *set {
|
||||||
|
if !other.Contains(elem) {
|
||||||
|
difference.Add(elem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return &difference
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) SymmetricDifference(other Set) Set {
|
||||||
|
_ = other.(*threadUnsafeSet)
|
||||||
|
|
||||||
|
aDiff := set.Difference(other)
|
||||||
|
bDiff := other.Difference(set)
|
||||||
|
return aDiff.Union(bDiff)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) Clear() {
|
||||||
|
*set = newThreadUnsafeSet()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) Remove(i interface{}) {
|
||||||
|
delete(*set, i)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) Cardinality() int {
|
||||||
|
return len(*set)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) Each(cb func(interface{}) bool) {
|
||||||
|
for elem := range *set {
|
||||||
|
if cb(elem) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) Iter() <-chan interface{} {
|
||||||
|
ch := make(chan interface{})
|
||||||
|
go func() {
|
||||||
|
for elem := range *set {
|
||||||
|
ch <- elem
|
||||||
|
}
|
||||||
|
close(ch)
|
||||||
|
}()
|
||||||
|
|
||||||
|
return ch
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) Iterator() *Iterator {
|
||||||
|
iterator, ch, stopCh := newIterator()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
L:
|
||||||
|
for elem := range *set {
|
||||||
|
select {
|
||||||
|
case <-stopCh:
|
||||||
|
break L
|
||||||
|
case ch <- elem:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(ch)
|
||||||
|
}()
|
||||||
|
|
||||||
|
return iterator
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) Equal(other Set) bool {
|
||||||
|
_ = other.(*threadUnsafeSet)
|
||||||
|
|
||||||
|
if set.Cardinality() != other.Cardinality() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
for elem := range *set {
|
||||||
|
if !other.Contains(elem) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) Clone() Set {
|
||||||
|
clonedSet := newThreadUnsafeSet()
|
||||||
|
for elem := range *set {
|
||||||
|
clonedSet.Add(elem)
|
||||||
|
}
|
||||||
|
return &clonedSet
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) String() string {
|
||||||
|
items := make([]string, 0, len(*set))
|
||||||
|
|
||||||
|
for elem := range *set {
|
||||||
|
items = append(items, fmt.Sprintf("%v", elem))
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("Set{%s}", strings.Join(items, ", "))
|
||||||
|
}
|
||||||
|
|
||||||
|
// String outputs a 2-tuple in the form "(A, B)".
|
||||||
|
func (pair OrderedPair) String() string {
|
||||||
|
return fmt.Sprintf("(%v, %v)", pair.First, pair.Second)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) Pop() interface{} {
|
||||||
|
for item := range *set {
|
||||||
|
delete(*set, item)
|
||||||
|
return item
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) PowerSet() Set {
|
||||||
|
powSet := NewThreadUnsafeSet()
|
||||||
|
nullset := newThreadUnsafeSet()
|
||||||
|
powSet.Add(&nullset)
|
||||||
|
|
||||||
|
for es := range *set {
|
||||||
|
u := newThreadUnsafeSet()
|
||||||
|
j := powSet.Iter()
|
||||||
|
for er := range j {
|
||||||
|
p := newThreadUnsafeSet()
|
||||||
|
if reflect.TypeOf(er).Name() == "" {
|
||||||
|
k := er.(*threadUnsafeSet)
|
||||||
|
for ek := range *(k) {
|
||||||
|
p.Add(ek)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
p.Add(er)
|
||||||
|
}
|
||||||
|
p.Add(es)
|
||||||
|
u.Add(&p)
|
||||||
|
}
|
||||||
|
|
||||||
|
powSet = powSet.Union(&u)
|
||||||
|
}
|
||||||
|
|
||||||
|
return powSet
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) CartesianProduct(other Set) Set {
|
||||||
|
o := other.(*threadUnsafeSet)
|
||||||
|
cartProduct := NewThreadUnsafeSet()
|
||||||
|
|
||||||
|
for i := range *set {
|
||||||
|
for j := range *o {
|
||||||
|
elem := OrderedPair{First: i, Second: j}
|
||||||
|
cartProduct.Add(elem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return cartProduct
|
||||||
|
}
|
||||||
|
|
||||||
|
func (set *threadUnsafeSet) ToSlice() []interface{} {
|
||||||
|
keys := make([]interface{}, 0, set.Cardinality())
|
||||||
|
for elem := range *set {
|
||||||
|
keys = append(keys, elem)
|
||||||
|
}
|
||||||
|
|
||||||
|
return keys
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON creates a JSON array from the set, it marshals all elements
|
||||||
|
func (set *threadUnsafeSet) MarshalJSON() ([]byte, error) {
|
||||||
|
items := make([]string, 0, set.Cardinality())
|
||||||
|
|
||||||
|
for elem := range *set {
|
||||||
|
b, err := json.Marshal(elem)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
items = append(items, string(b))
|
||||||
|
}
|
||||||
|
|
||||||
|
return []byte(fmt.Sprintf("[%s]", strings.Join(items, ","))), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON recreates a set from a JSON array, it only decodes
|
||||||
|
// primitive types. Numbers are decoded as json.Number.
|
||||||
|
func (set *threadUnsafeSet) UnmarshalJSON(b []byte) error {
|
||||||
|
var i []interface{}
|
||||||
|
|
||||||
|
d := json.NewDecoder(bytes.NewReader(b))
|
||||||
|
d.UseNumber()
|
||||||
|
err := d.Decode(&i)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range i {
|
||||||
|
switch t := v.(type) {
|
||||||
|
case []interface{}, map[string]interface{}:
|
||||||
|
continue
|
||||||
|
default:
|
||||||
|
set.Add(t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
38
vendor/github.com/ethereum/go-ethereum/.github/CODEOWNERS
generated
vendored
38
vendor/github.com/ethereum/go-ethereum/.github/CODEOWNERS
generated
vendored
@ -1,12 +1,32 @@
|
|||||||
# Lines starting with '#' are comments.
|
# Lines starting with '#' are comments.
|
||||||
# Each line is a file pattern followed by one or more owners.
|
# Each line is a file pattern followed by one or more owners.
|
||||||
|
|
||||||
accounts/usbwallet @karalabe
|
accounts/usbwallet @karalabe
|
||||||
consensus @karalabe
|
consensus @karalabe
|
||||||
core/ @karalabe @holiman
|
core/ @karalabe @holiman
|
||||||
eth/ @karalabe
|
eth/ @karalabe
|
||||||
les/ @zsfelfoldi
|
les/ @zsfelfoldi
|
||||||
light/ @zsfelfoldi
|
light/ @zsfelfoldi
|
||||||
mobile/ @karalabe
|
mobile/ @karalabe
|
||||||
p2p/ @fjl @zsfelfoldi
|
p2p/ @fjl @zsfelfoldi
|
||||||
whisper/ @gballet @gluk256
|
swarm/bmt @zelig
|
||||||
|
swarm/dev @lmars
|
||||||
|
swarm/fuse @jmozah @holisticode
|
||||||
|
swarm/grafana_dashboards @nonsense
|
||||||
|
swarm/metrics @nonsense @holisticode
|
||||||
|
swarm/multihash @nolash
|
||||||
|
swarm/network/bitvector @zelig @janos @gbalint
|
||||||
|
swarm/network/priorityqueue @zelig @janos @gbalint
|
||||||
|
swarm/network/simulations @zelig
|
||||||
|
swarm/network/stream @janos @zelig @gbalint @holisticode @justelad
|
||||||
|
swarm/network/stream/intervals @janos
|
||||||
|
swarm/network/stream/testing @zelig
|
||||||
|
swarm/pot @zelig
|
||||||
|
swarm/pss @nolash @zelig @nonsense
|
||||||
|
swarm/services @zelig
|
||||||
|
swarm/state @justelad
|
||||||
|
swarm/storage/encryption @gbalint @zelig @nagydani
|
||||||
|
swarm/storage/mock @janos
|
||||||
|
swarm/storage/mru @nolash
|
||||||
|
swarm/testutil @lmars
|
||||||
|
whisper/ @gballet @gluk256
|
||||||
|
10
vendor/github.com/ethereum/go-ethereum/.travis.yml
generated
vendored
10
vendor/github.com/ethereum/go-ethereum/.travis.yml
generated
vendored
@ -146,16 +146,16 @@ matrix:
|
|||||||
git:
|
git:
|
||||||
submodules: false # avoid cloning ethereum/tests
|
submodules: false # avoid cloning ethereum/tests
|
||||||
before_install:
|
before_install:
|
||||||
- curl https://storage.googleapis.com/golang/go1.10.2.linux-amd64.tar.gz | tar -xz
|
- curl https://storage.googleapis.com/golang/go1.10.3.linux-amd64.tar.gz | tar -xz
|
||||||
- export PATH=`pwd`/go/bin:$PATH
|
- export PATH=`pwd`/go/bin:$PATH
|
||||||
- export GOROOT=`pwd`/go
|
- export GOROOT=`pwd`/go
|
||||||
- export GOPATH=$HOME/go
|
- export GOPATH=$HOME/go
|
||||||
script:
|
script:
|
||||||
# Build the Android archive and upload it to Maven Central and Azure
|
# Build the Android archive and upload it to Maven Central and Azure
|
||||||
- curl https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip -o android-ndk-r16b.zip
|
- curl https://dl.google.com/android/repository/android-ndk-r17b-linux-x86_64.zip -o android-ndk-r17b.zip
|
||||||
- unzip -q android-ndk-r16b.zip && rm android-ndk-r16b.zip
|
- unzip -q android-ndk-r17b.zip && rm android-ndk-r17b.zip
|
||||||
- mv android-ndk-r16b $HOME
|
- mv android-ndk-r17b $HOME
|
||||||
- export ANDROID_NDK=$HOME/android-ndk-r16b
|
- export ANDROID_NDK=$HOME/android-ndk-r17b
|
||||||
|
|
||||||
- mkdir -p $GOPATH/src/github.com/ethereum
|
- mkdir -p $GOPATH/src/github.com/ethereum
|
||||||
- ln -s `pwd` $GOPATH/src/github.com/ethereum
|
- ln -s `pwd` $GOPATH/src/github.com/ethereum
|
||||||
|
1
vendor/github.com/ethereum/go-ethereum/AUTHORS
generated
vendored
1
vendor/github.com/ethereum/go-ethereum/AUTHORS
generated
vendored
@ -171,3 +171,4 @@ xiekeyang <xiekeyang@users.noreply.github.com>
|
|||||||
yoza <yoza.is12s@gmail.com>
|
yoza <yoza.is12s@gmail.com>
|
||||||
ΞTHΞЯSPHΞЯΞ <{viktor.tron,nagydani,zsfelfoldi}@gmail.com>
|
ΞTHΞЯSPHΞЯΞ <{viktor.tron,nagydani,zsfelfoldi}@gmail.com>
|
||||||
Максим Чусовлянов <mchusovlianov@gmail.com>
|
Максим Чусовлянов <mchusovlianov@gmail.com>
|
||||||
|
Ralph Caraveo <deckarep@gmail.com>
|
||||||
|
1
vendor/github.com/ethereum/go-ethereum/Makefile
generated
vendored
1
vendor/github.com/ethereum/go-ethereum/Makefile
generated
vendored
@ -41,6 +41,7 @@ lint: ## Run linters.
|
|||||||
build/env.sh go run build/ci.go lint
|
build/env.sh go run build/ci.go lint
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
./build/clean_go_build_cache.sh
|
||||||
rm -fr build/_workspace/pkg/ $(GOBIN)/*
|
rm -fr build/_workspace/pkg/ $(GOBIN)/*
|
||||||
|
|
||||||
# The devtools target installs tools required for 'go generate'.
|
# The devtools target installs tools required for 'go generate'.
|
||||||
|
2
vendor/github.com/ethereum/go-ethereum/README.md
generated
vendored
2
vendor/github.com/ethereum/go-ethereum/README.md
generated
vendored
@ -40,7 +40,7 @@ The go-ethereum project comes with several wrappers/executables found in the `cm
|
|||||||
| `evm` | Developer utility version of the EVM (Ethereum Virtual Machine) that is capable of running bytecode snippets within a configurable environment and execution mode. Its purpose is to allow isolated, fine-grained debugging of EVM opcodes (e.g. `evm --code 60ff60ff --debug`). |
|
| `evm` | Developer utility version of the EVM (Ethereum Virtual Machine) that is capable of running bytecode snippets within a configurable environment and execution mode. Its purpose is to allow isolated, fine-grained debugging of EVM opcodes (e.g. `evm --code 60ff60ff --debug`). |
|
||||||
| `gethrpctest` | Developer utility tool to support our [ethereum/rpc-test](https://github.com/ethereum/rpc-tests) test suite which validates baseline conformity to the [Ethereum JSON RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC) specs. Please see the [test suite's readme](https://github.com/ethereum/rpc-tests/blob/master/README.md) for details. |
|
| `gethrpctest` | Developer utility tool to support our [ethereum/rpc-test](https://github.com/ethereum/rpc-tests) test suite which validates baseline conformity to the [Ethereum JSON RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC) specs. Please see the [test suite's readme](https://github.com/ethereum/rpc-tests/blob/master/README.md) for details. |
|
||||||
| `rlpdump` | Developer utility tool to convert binary RLP ([Recursive Length Prefix](https://github.com/ethereum/wiki/wiki/RLP)) dumps (data encoding used by the Ethereum protocol both network as well as consensus wise) to user friendlier hierarchical representation (e.g. `rlpdump --hex CE0183FFFFFFC4C304050583616263`). |
|
| `rlpdump` | Developer utility tool to convert binary RLP ([Recursive Length Prefix](https://github.com/ethereum/wiki/wiki/RLP)) dumps (data encoding used by the Ethereum protocol both network as well as consensus wise) to user friendlier hierarchical representation (e.g. `rlpdump --hex CE0183FFFFFFC4C304050583616263`). |
|
||||||
| `swarm` | swarm daemon and tools. This is the entrypoint for the swarm network. `swarm --help` for command line options and subcommands. See https://swarm-guide.readthedocs.io for swarm documentation. |
|
| `swarm` | Swarm daemon and tools. This is the entrypoint for the Swarm network. `swarm --help` for command line options and subcommands. See [Swarm README](https://github.com/ethereum/go-ethereum/tree/master/swarm) for more information. |
|
||||||
| `puppeth` | a CLI wizard that aids in creating a new Ethereum network. |
|
| `puppeth` | a CLI wizard that aids in creating a new Ethereum network. |
|
||||||
|
|
||||||
## Running geth
|
## Running geth
|
||||||
|
1
vendor/github.com/ethereum/go-ethereum/VERSION
generated
vendored
1
vendor/github.com/ethereum/go-ethereum/VERSION
generated
vendored
@ -1 +0,0 @@
|
|||||||
1.8.11
|
|
32
vendor/github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go
generated
vendored
32
vendor/github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go
generated
vendored
@ -323,18 +323,24 @@ func (b *SimulatedBackend) SendTransaction(ctx context.Context, tx *types.Transa
|
|||||||
//
|
//
|
||||||
// TODO(karalabe): Deprecate when the subscription one can return past data too.
|
// TODO(karalabe): Deprecate when the subscription one can return past data too.
|
||||||
func (b *SimulatedBackend) FilterLogs(ctx context.Context, query ethereum.FilterQuery) ([]types.Log, error) {
|
func (b *SimulatedBackend) FilterLogs(ctx context.Context, query ethereum.FilterQuery) ([]types.Log, error) {
|
||||||
// Initialize unset filter boundaried to run from genesis to chain head
|
var filter *filters.Filter
|
||||||
from := int64(0)
|
if query.BlockHash != nil {
|
||||||
if query.FromBlock != nil {
|
// Block filter requested, construct a single-shot filter
|
||||||
from = query.FromBlock.Int64()
|
filter = filters.NewBlockFilter(&filterBackend{b.database, b.blockchain}, *query.BlockHash, query.Addresses, query.Topics)
|
||||||
|
} else {
|
||||||
|
// Initialize unset filter boundaried to run from genesis to chain head
|
||||||
|
from := int64(0)
|
||||||
|
if query.FromBlock != nil {
|
||||||
|
from = query.FromBlock.Int64()
|
||||||
|
}
|
||||||
|
to := int64(-1)
|
||||||
|
if query.ToBlock != nil {
|
||||||
|
to = query.ToBlock.Int64()
|
||||||
|
}
|
||||||
|
// Construct the range filter
|
||||||
|
filter = filters.NewRangeFilter(&filterBackend{b.database, b.blockchain}, from, to, query.Addresses, query.Topics)
|
||||||
}
|
}
|
||||||
to := int64(-1)
|
// Run the filter and return all the logs
|
||||||
if query.ToBlock != nil {
|
|
||||||
to = query.ToBlock.Int64()
|
|
||||||
}
|
|
||||||
// Construct and execute the filter
|
|
||||||
filter := filters.New(&filterBackend{b.database, b.blockchain}, from, to, query.Addresses, query.Topics)
|
|
||||||
|
|
||||||
logs, err := filter.Logs(ctx)
|
logs, err := filter.Logs(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -429,6 +435,10 @@ func (fb *filterBackend) HeaderByNumber(ctx context.Context, block rpc.BlockNumb
|
|||||||
return fb.bc.GetHeaderByNumber(uint64(block.Int64())), nil
|
return fb.bc.GetHeaderByNumber(uint64(block.Int64())), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (fb *filterBackend) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) {
|
||||||
|
return fb.bc.GetHeaderByHash(hash), nil
|
||||||
|
}
|
||||||
|
|
||||||
func (fb *filterBackend) GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) {
|
func (fb *filterBackend) GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) {
|
||||||
number := rawdb.ReadHeaderNumber(fb.db, hash)
|
number := rawdb.ReadHeaderNumber(fb.db, hash)
|
||||||
if number == nil {
|
if number == nil {
|
||||||
|
4
vendor/github.com/ethereum/go-ethereum/accounts/abi/method.go
generated
vendored
4
vendor/github.com/ethereum/go-ethereum/accounts/abi/method.go
generated
vendored
@ -47,10 +47,8 @@ type Method struct {
|
|||||||
// Please note that "int" is substitute for its canonical representation "int256"
|
// Please note that "int" is substitute for its canonical representation "int256"
|
||||||
func (method Method) Sig() string {
|
func (method Method) Sig() string {
|
||||||
types := make([]string, len(method.Inputs))
|
types := make([]string, len(method.Inputs))
|
||||||
i := 0
|
for i, input := range method.Inputs {
|
||||||
for _, input := range method.Inputs {
|
|
||||||
types[i] = input.Type.String()
|
types[i] = input.Type.String()
|
||||||
i++
|
|
||||||
}
|
}
|
||||||
return fmt.Sprintf("%v(%v)", method.Name, strings.Join(types, ","))
|
return fmt.Sprintf("%v(%v)", method.Name, strings.Join(types, ","))
|
||||||
}
|
}
|
||||||
|
15
vendor/github.com/ethereum/go-ethereum/accounts/abi/numbers.go
generated
vendored
15
vendor/github.com/ethereum/go-ethereum/accounts/abi/numbers.go
generated
vendored
@ -31,29 +31,14 @@ var (
|
|||||||
uint16T = reflect.TypeOf(uint16(0))
|
uint16T = reflect.TypeOf(uint16(0))
|
||||||
uint32T = reflect.TypeOf(uint32(0))
|
uint32T = reflect.TypeOf(uint32(0))
|
||||||
uint64T = reflect.TypeOf(uint64(0))
|
uint64T = reflect.TypeOf(uint64(0))
|
||||||
intT = reflect.TypeOf(int(0))
|
|
||||||
int8T = reflect.TypeOf(int8(0))
|
int8T = reflect.TypeOf(int8(0))
|
||||||
int16T = reflect.TypeOf(int16(0))
|
int16T = reflect.TypeOf(int16(0))
|
||||||
int32T = reflect.TypeOf(int32(0))
|
int32T = reflect.TypeOf(int32(0))
|
||||||
int64T = reflect.TypeOf(int64(0))
|
int64T = reflect.TypeOf(int64(0))
|
||||||
addressT = reflect.TypeOf(common.Address{})
|
addressT = reflect.TypeOf(common.Address{})
|
||||||
intTS = reflect.TypeOf([]int(nil))
|
|
||||||
int8TS = reflect.TypeOf([]int8(nil))
|
|
||||||
int16TS = reflect.TypeOf([]int16(nil))
|
|
||||||
int32TS = reflect.TypeOf([]int32(nil))
|
|
||||||
int64TS = reflect.TypeOf([]int64(nil))
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// U256 converts a big Int into a 256bit EVM number.
|
// U256 converts a big Int into a 256bit EVM number.
|
||||||
func U256(n *big.Int) []byte {
|
func U256(n *big.Int) []byte {
|
||||||
return math.PaddedBigBytes(math.U256(n), 32)
|
return math.PaddedBigBytes(math.U256(n), 32)
|
||||||
}
|
}
|
||||||
|
|
||||||
// checks whether the given reflect value is signed. This also works for slices with a number type
|
|
||||||
func isSigned(v reflect.Value) bool {
|
|
||||||
switch v.Type() {
|
|
||||||
case intTS, int8TS, int16TS, int32TS, int64TS, intT, int8T, int16T, int32T, int64T:
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
12
vendor/github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go
generated
vendored
12
vendor/github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go
generated
vendored
@ -27,10 +27,10 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
mapset "github.com/deckarep/golang-set"
|
||||||
"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/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"gopkg.in/fatih/set.v0"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Minimum amount of time between cache reloads. This limit applies if the platform does
|
// Minimum amount of time between cache reloads. This limit applies if the platform does
|
||||||
@ -79,7 +79,7 @@ func newAccountCache(keydir string) (*accountCache, chan struct{}) {
|
|||||||
keydir: keydir,
|
keydir: keydir,
|
||||||
byAddr: make(map[common.Address][]accounts.Account),
|
byAddr: make(map[common.Address][]accounts.Account),
|
||||||
notify: make(chan struct{}, 1),
|
notify: make(chan struct{}, 1),
|
||||||
fileC: fileCache{all: set.NewNonTS()},
|
fileC: fileCache{all: mapset.NewThreadUnsafeSet()},
|
||||||
}
|
}
|
||||||
ac.watcher = newWatcher(ac)
|
ac.watcher = newWatcher(ac)
|
||||||
return ac, ac.notify
|
return ac, ac.notify
|
||||||
@ -237,7 +237,7 @@ func (ac *accountCache) scanAccounts() error {
|
|||||||
log.Debug("Failed to reload keystore contents", "err", err)
|
log.Debug("Failed to reload keystore contents", "err", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if creates.Size() == 0 && deletes.Size() == 0 && updates.Size() == 0 {
|
if creates.Cardinality() == 0 && deletes.Cardinality() == 0 && updates.Cardinality() == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// Create a helper method to scan the contents of the key files
|
// Create a helper method to scan the contents of the key files
|
||||||
@ -272,15 +272,15 @@ func (ac *accountCache) scanAccounts() error {
|
|||||||
// Process all the file diffs
|
// Process all the file diffs
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
|
|
||||||
for _, p := range creates.List() {
|
for _, p := range creates.ToSlice() {
|
||||||
if a := readAccount(p.(string)); a != nil {
|
if a := readAccount(p.(string)); a != nil {
|
||||||
ac.add(*a)
|
ac.add(*a)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, p := range deletes.List() {
|
for _, p := range deletes.ToSlice() {
|
||||||
ac.deleteByFile(p.(string))
|
ac.deleteByFile(p.(string))
|
||||||
}
|
}
|
||||||
for _, p := range updates.List() {
|
for _, p := range updates.ToSlice() {
|
||||||
path := p.(string)
|
path := p.(string)
|
||||||
ac.deleteByFile(path)
|
ac.deleteByFile(path)
|
||||||
if a := readAccount(path); a != nil {
|
if a := readAccount(path); a != nil {
|
||||||
|
18
vendor/github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go
generated
vendored
18
vendor/github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go
generated
vendored
@ -24,20 +24,20 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
mapset "github.com/deckarep/golang-set"
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
set "gopkg.in/fatih/set.v0"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// fileCache is a cache of files seen during scan of keystore.
|
// fileCache is a cache of files seen during scan of keystore.
|
||||||
type fileCache struct {
|
type fileCache struct {
|
||||||
all *set.SetNonTS // Set of all files from the keystore folder
|
all mapset.Set // Set of all files from the keystore folder
|
||||||
lastMod time.Time // Last time instance when a file was modified
|
lastMod time.Time // Last time instance when a file was modified
|
||||||
mu sync.RWMutex
|
mu sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
// scan performs a new scan on the given directory, compares against the already
|
// scan performs a new scan on the given directory, compares against the already
|
||||||
// cached filenames, and returns file sets: creates, deletes, updates.
|
// cached filenames, and returns file sets: creates, deletes, updates.
|
||||||
func (fc *fileCache) scan(keyDir string) (set.Interface, set.Interface, set.Interface, error) {
|
func (fc *fileCache) scan(keyDir string) (mapset.Set, mapset.Set, mapset.Set, error) {
|
||||||
t0 := time.Now()
|
t0 := time.Now()
|
||||||
|
|
||||||
// List all the failes from the keystore folder
|
// List all the failes from the keystore folder
|
||||||
@ -51,8 +51,8 @@ func (fc *fileCache) scan(keyDir string) (set.Interface, set.Interface, set.Inte
|
|||||||
defer fc.mu.Unlock()
|
defer fc.mu.Unlock()
|
||||||
|
|
||||||
// Iterate all the files and gather their metadata
|
// Iterate all the files and gather their metadata
|
||||||
all := set.NewNonTS()
|
all := mapset.NewThreadUnsafeSet()
|
||||||
mods := set.NewNonTS()
|
mods := mapset.NewThreadUnsafeSet()
|
||||||
|
|
||||||
var newLastMod time.Time
|
var newLastMod time.Time
|
||||||
for _, fi := range files {
|
for _, fi := range files {
|
||||||
@ -76,9 +76,9 @@ func (fc *fileCache) scan(keyDir string) (set.Interface, set.Interface, set.Inte
|
|||||||
t2 := time.Now()
|
t2 := time.Now()
|
||||||
|
|
||||||
// Update the tracked files and return the three sets
|
// Update the tracked files and return the three sets
|
||||||
deletes := set.Difference(fc.all, all) // Deletes = previous - current
|
deletes := fc.all.Difference(all) // Deletes = previous - current
|
||||||
creates := set.Difference(all, fc.all) // Creates = current - previous
|
creates := all.Difference(fc.all) // Creates = current - previous
|
||||||
updates := set.Difference(mods, creates) // Updates = modified - creates
|
updates := mods.Difference(creates) // Updates = modified - creates
|
||||||
|
|
||||||
fc.all, fc.lastMod = all, newLastMod
|
fc.all, fc.lastMod = all, newLastMod
|
||||||
t3 := time.Now()
|
t3 := time.Now()
|
||||||
|
2
vendor/github.com/ethereum/go-ethereum/accounts/keystore/keystore.go
generated
vendored
2
vendor/github.com/ethereum/go-ethereum/accounts/keystore/keystore.go
generated
vendored
@ -51,7 +51,7 @@ var (
|
|||||||
var KeyStoreType = reflect.TypeOf(&KeyStore{})
|
var KeyStoreType = reflect.TypeOf(&KeyStore{})
|
||||||
|
|
||||||
// KeyStoreScheme is the protocol scheme prefixing account and wallet URLs.
|
// KeyStoreScheme is the protocol scheme prefixing account and wallet URLs.
|
||||||
var KeyStoreScheme = "keystore"
|
const KeyStoreScheme = "keystore"
|
||||||
|
|
||||||
// Maximum time between wallet refreshes (if filesystem notifications don't work).
|
// Maximum time between wallet refreshes (if filesystem notifications don't work).
|
||||||
const walletRefreshCycle = 3 * time.Second
|
const walletRefreshCycle = 3 * time.Second
|
||||||
|
27
vendor/github.com/ethereum/go-ethereum/accounts/keystore/keystore_passphrase.go
generated
vendored
27
vendor/github.com/ethereum/go-ethereum/accounts/keystore/keystore_passphrase.go
generated
vendored
@ -28,18 +28,18 @@ package keystore
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"crypto/aes"
|
"crypto/aes"
|
||||||
crand "crypto/rand"
|
"crypto/rand"
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/common/math"
|
"github.com/ethereum/go-ethereum/common/math"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/ethereum/go-ethereum/crypto/randentropy"
|
|
||||||
"github.com/pborman/uuid"
|
"github.com/pborman/uuid"
|
||||||
"github.com/status-im/status-go/extkeys"
|
"github.com/status-im/status-go/extkeys"
|
||||||
"golang.org/x/crypto/pbkdf2"
|
"golang.org/x/crypto/pbkdf2"
|
||||||
@ -94,7 +94,7 @@ func (ks keyStorePassphrase) GetKey(addr common.Address, filename, auth string)
|
|||||||
|
|
||||||
// StoreKey generates a key, encrypts with 'auth' and stores in the given directory
|
// StoreKey generates a key, encrypts with 'auth' and stores in the given directory
|
||||||
func StoreKey(dir, auth string, scryptN, scryptP int) (common.Address, error) {
|
func StoreKey(dir, auth string, scryptN, scryptP int) (common.Address, error) {
|
||||||
_, a, err := storeNewKey(&keyStorePassphrase{dir, scryptN, scryptP}, crand.Reader, auth)
|
_, a, err := storeNewKey(&keyStorePassphrase{dir, scryptN, scryptP}, rand.Reader, auth)
|
||||||
return a.Address, err
|
return a.Address, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,7 +117,11 @@ func (ks keyStorePassphrase) JoinPath(filename string) string {
|
|||||||
// blob that can be decrypted later on.
|
// blob that can be decrypted later on.
|
||||||
func EncryptKey(key *Key, auth string, scryptN, scryptP int) ([]byte, error) {
|
func EncryptKey(key *Key, auth string, scryptN, scryptP int) ([]byte, error) {
|
||||||
authArray := []byte(auth)
|
authArray := []byte(auth)
|
||||||
salt := randentropy.GetEntropyCSPRNG(32)
|
|
||||||
|
salt := make([]byte, 32)
|
||||||
|
if _, err := io.ReadFull(rand.Reader, salt); err != nil {
|
||||||
|
panic("reading from crypto/rand failed: " + err.Error())
|
||||||
|
}
|
||||||
derivedKey, err := scrypt.Key(authArray, salt, scryptN, scryptR, scryptP, scryptDKLen)
|
derivedKey, err := scrypt.Key(authArray, salt, scryptN, scryptR, scryptP, scryptDKLen)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -125,7 +129,10 @@ func EncryptKey(key *Key, auth string, scryptN, scryptP int) ([]byte, error) {
|
|||||||
encryptKey := derivedKey[:16]
|
encryptKey := derivedKey[:16]
|
||||||
keyBytes := math.PaddedBigBytes(key.PrivateKey.D, 32)
|
keyBytes := math.PaddedBigBytes(key.PrivateKey.D, 32)
|
||||||
|
|
||||||
iv := randentropy.GetEntropyCSPRNG(aes.BlockSize) // 16
|
iv := make([]byte, aes.BlockSize) // 16
|
||||||
|
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
|
||||||
|
panic("reading from crypto/rand failed: " + err.Error())
|
||||||
|
}
|
||||||
cipherText, err := aesCTRXOR(encryptKey, keyBytes, iv)
|
cipherText, err := aesCTRXOR(encryptKey, keyBytes, iv)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -171,7 +178,10 @@ func EncryptExtendedKey(extKey *extkeys.ExtendedKey, auth string, scryptN, scryp
|
|||||||
return cryptoJSON{}, nil
|
return cryptoJSON{}, nil
|
||||||
}
|
}
|
||||||
authArray := []byte(auth)
|
authArray := []byte(auth)
|
||||||
salt := randentropy.GetEntropyCSPRNG(32)
|
salt := make([]byte, 32)
|
||||||
|
if _, err := io.ReadFull(rand.Reader, salt); err != nil {
|
||||||
|
panic("reading from crypto/rand failed: " + err.Error())
|
||||||
|
}
|
||||||
derivedKey, err := scrypt.Key(authArray, salt, scryptN, scryptR, scryptP, scryptDKLen)
|
derivedKey, err := scrypt.Key(authArray, salt, scryptN, scryptR, scryptP, scryptDKLen)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return cryptoJSON{}, err
|
return cryptoJSON{}, err
|
||||||
@ -179,7 +189,10 @@ func EncryptExtendedKey(extKey *extkeys.ExtendedKey, auth string, scryptN, scryp
|
|||||||
encryptKey := derivedKey[:16]
|
encryptKey := derivedKey[:16]
|
||||||
keyBytes := []byte(extKey.String())
|
keyBytes := []byte(extKey.String())
|
||||||
|
|
||||||
iv := randentropy.GetEntropyCSPRNG(aes.BlockSize) // 16
|
iv := make([]byte, aes.BlockSize) // 16
|
||||||
|
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
|
||||||
|
panic("reading from crypto/rand failed: " + err.Error())
|
||||||
|
}
|
||||||
cipherText, err := aesCTRXOR(encryptKey, keyBytes, iv)
|
cipherText, err := aesCTRXOR(encryptKey, keyBytes, iv)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return cryptoJSON{}, err
|
return cryptoJSON{}, err
|
||||||
|
6
vendor/github.com/ethereum/go-ethereum/accounts/url.go
generated
vendored
6
vendor/github.com/ethereum/go-ethereum/accounts/url.go
generated
vendored
@ -76,12 +76,12 @@ func (u URL) MarshalJSON() ([]byte, error) {
|
|||||||
|
|
||||||
// UnmarshalJSON parses url.
|
// UnmarshalJSON parses url.
|
||||||
func (u *URL) UnmarshalJSON(input []byte) error {
|
func (u *URL) UnmarshalJSON(input []byte) error {
|
||||||
var textUrl string
|
var textURL string
|
||||||
err := json.Unmarshal(input, &textUrl)
|
err := json.Unmarshal(input, &textURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
url, err := parseURL(textUrl)
|
url, err := parseURL(textURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
2
vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/internal/trezor/trezor.go
generated
vendored
2
vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/internal/trezor/trezor.go
generated
vendored
@ -36,7 +36,7 @@ func Type(msg proto.Message) uint16 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Name returns the friendly message type name of a specific protocol buffer
|
// Name returns the friendly message type name of a specific protocol buffer
|
||||||
// type numbers.
|
// type number.
|
||||||
func Name(kind uint16) string {
|
func Name(kind uint16) string {
|
||||||
name := MessageType_name[int32(kind)]
|
name := MessageType_name[int32(kind)]
|
||||||
if len(name) < 12 {
|
if len(name) < 12 {
|
||||||
|
2
vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/ledger.go
generated
vendored
2
vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/ledger.go
generated
vendored
@ -302,7 +302,7 @@ func (w *ledgerDriver) ledgerSign(derivationPath []uint32, tx *types.Transaction
|
|||||||
for i, component := range derivationPath {
|
for i, component := range derivationPath {
|
||||||
binary.BigEndian.PutUint32(path[1+4*i:], component)
|
binary.BigEndian.PutUint32(path[1+4*i:], component)
|
||||||
}
|
}
|
||||||
// Create the transaction RLP based on whether legacy or EIP155 signing was requeste
|
// Create the transaction RLP based on whether legacy or EIP155 signing was requested
|
||||||
var (
|
var (
|
||||||
txrlp []byte
|
txrlp []byte
|
||||||
err error
|
err error
|
||||||
|
4
vendor/github.com/ethereum/go-ethereum/appveyor.yml
generated
vendored
4
vendor/github.com/ethereum/go-ethereum/appveyor.yml
generated
vendored
@ -23,8 +23,8 @@ environment:
|
|||||||
install:
|
install:
|
||||||
- git submodule update --init
|
- git submodule update --init
|
||||||
- rmdir C:\go /s /q
|
- rmdir C:\go /s /q
|
||||||
- appveyor DownloadFile https://storage.googleapis.com/golang/go1.10.2.windows-%GETH_ARCH%.zip
|
- appveyor DownloadFile https://storage.googleapis.com/golang/go1.10.3.windows-%GETH_ARCH%.zip
|
||||||
- 7z x go1.10.2.windows-%GETH_ARCH%.zip -y -oC:\ > NUL
|
- 7z x go1.10.3.windows-%GETH_ARCH%.zip -y -oC:\ > NUL
|
||||||
- go version
|
- go version
|
||||||
- gcc --version
|
- gcc --version
|
||||||
|
|
||||||
|
560
vendor/github.com/ethereum/go-ethereum/bmt/bmt.go
generated
vendored
560
vendor/github.com/ethereum/go-ethereum/bmt/bmt.go
generated
vendored
@ -1,560 +0,0 @@
|
|||||||
// Copyright 2017 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 bmt provides a binary merkle tree implementation
|
|
||||||
package bmt
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"hash"
|
|
||||||
"io"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
"sync/atomic"
|
|
||||||
)
|
|
||||||
|
|
||||||
/*
|
|
||||||
Binary Merkle Tree Hash is a hash function over arbitrary datachunks of limited size
|
|
||||||
It is defined as the root hash of the binary merkle tree built over fixed size segments
|
|
||||||
of the underlying chunk using any base hash function (e.g keccak 256 SHA3)
|
|
||||||
|
|
||||||
It is used as the chunk hash function in swarm which in turn is the basis for the
|
|
||||||
128 branching swarm hash http://swarm-guide.readthedocs.io/en/latest/architecture.html#swarm-hash
|
|
||||||
|
|
||||||
The BMT is optimal for providing compact inclusion proofs, i.e. prove that a
|
|
||||||
segment is a substring of a chunk starting at a particular offset
|
|
||||||
The size of the underlying segments is fixed at 32 bytes (called the resolution
|
|
||||||
of the BMT hash), the EVM word size to optimize for on-chain BMT verification
|
|
||||||
as well as the hash size optimal for inclusion proofs in the merkle tree of the swarm hash.
|
|
||||||
|
|
||||||
Two implementations are provided:
|
|
||||||
|
|
||||||
* RefHasher is optimized for code simplicity and meant as a reference implementation
|
|
||||||
* Hasher is optimized for speed taking advantage of concurrency with minimalistic
|
|
||||||
control structure to coordinate the concurrent routines
|
|
||||||
It implements the ChunkHash interface as well as the go standard hash.Hash interface
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
const (
|
|
||||||
// DefaultSegmentCount is the maximum number of segments of the underlying chunk
|
|
||||||
DefaultSegmentCount = 128 // Should be equal to storage.DefaultBranches
|
|
||||||
// DefaultPoolSize is the maximum number of bmt trees used by the hashers, i.e,
|
|
||||||
// the maximum number of concurrent BMT hashing operations performed by the same hasher
|
|
||||||
DefaultPoolSize = 8
|
|
||||||
)
|
|
||||||
|
|
||||||
// BaseHasher is a hash.Hash constructor function used for the base hash of the BMT.
|
|
||||||
type BaseHasher func() hash.Hash
|
|
||||||
|
|
||||||
// Hasher a reusable hasher for fixed maximum size chunks representing a BMT
|
|
||||||
// implements the hash.Hash interface
|
|
||||||
// reuse pool of Tree-s for amortised memory allocation and resource control
|
|
||||||
// supports order-agnostic concurrent segment writes
|
|
||||||
// as well as sequential read and write
|
|
||||||
// can not be called concurrently on more than one chunk
|
|
||||||
// can be further appended after Sum
|
|
||||||
// Reset gives back the Tree to the pool and guaranteed to leave
|
|
||||||
// the tree and itself in a state reusable for hashing a new chunk
|
|
||||||
type Hasher struct {
|
|
||||||
pool *TreePool // BMT resource pool
|
|
||||||
bmt *Tree // prebuilt BMT resource for flowcontrol and proofs
|
|
||||||
blocksize int // segment size (size of hash) also for hash.Hash
|
|
||||||
count int // segment count
|
|
||||||
size int // for hash.Hash same as hashsize
|
|
||||||
cur int // cursor position for rightmost currently open chunk
|
|
||||||
segment []byte // the rightmost open segment (not complete)
|
|
||||||
depth int // index of last level
|
|
||||||
result chan []byte // result channel
|
|
||||||
hash []byte // to record the result
|
|
||||||
max int32 // max segments for SegmentWriter interface
|
|
||||||
blockLength []byte // The block length that needes to be added in Sum
|
|
||||||
}
|
|
||||||
|
|
||||||
// New creates a reusable Hasher
|
|
||||||
// implements the hash.Hash interface
|
|
||||||
// pulls a new Tree from a resource pool for hashing each chunk
|
|
||||||
func New(p *TreePool) *Hasher {
|
|
||||||
return &Hasher{
|
|
||||||
pool: p,
|
|
||||||
depth: depth(p.SegmentCount),
|
|
||||||
size: p.SegmentSize,
|
|
||||||
blocksize: p.SegmentSize,
|
|
||||||
count: p.SegmentCount,
|
|
||||||
result: make(chan []byte),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Node is a reuseable segment hasher representing a node in a BMT
|
|
||||||
// it allows for continued writes after a Sum
|
|
||||||
// and is left in completely reusable state after Reset
|
|
||||||
type Node struct {
|
|
||||||
level, index int // position of node for information/logging only
|
|
||||||
initial bool // first and last node
|
|
||||||
root bool // whether the node is root to a smaller BMT
|
|
||||||
isLeft bool // whether it is left side of the parent double segment
|
|
||||||
unbalanced bool // indicates if a node has only the left segment
|
|
||||||
parent *Node // BMT connections
|
|
||||||
state int32 // atomic increment impl concurrent boolean toggle
|
|
||||||
left, right []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewNode constructor for segment hasher nodes in the BMT
|
|
||||||
func NewNode(level, index int, parent *Node) *Node {
|
|
||||||
return &Node{
|
|
||||||
parent: parent,
|
|
||||||
level: level,
|
|
||||||
index: index,
|
|
||||||
initial: index == 0,
|
|
||||||
isLeft: index%2 == 0,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TreePool provides a pool of Trees used as resources by Hasher
|
|
||||||
// a Tree popped from the pool is guaranteed to have clean state
|
|
||||||
// for hashing a new chunk
|
|
||||||
// Hasher Reset releases the Tree to the pool
|
|
||||||
type TreePool struct {
|
|
||||||
lock sync.Mutex
|
|
||||||
c chan *Tree
|
|
||||||
hasher BaseHasher
|
|
||||||
SegmentSize int
|
|
||||||
SegmentCount int
|
|
||||||
Capacity int
|
|
||||||
count int
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewTreePool creates a Tree pool with hasher, segment size, segment count and capacity
|
|
||||||
// on GetTree it reuses free Trees or creates a new one if size is not reached
|
|
||||||
func NewTreePool(hasher BaseHasher, segmentCount, capacity int) *TreePool {
|
|
||||||
return &TreePool{
|
|
||||||
c: make(chan *Tree, capacity),
|
|
||||||
hasher: hasher,
|
|
||||||
SegmentSize: hasher().Size(),
|
|
||||||
SegmentCount: segmentCount,
|
|
||||||
Capacity: capacity,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Drain drains the pool until it has no more than n resources
|
|
||||||
func (p *TreePool) Drain(n int) {
|
|
||||||
p.lock.Lock()
|
|
||||||
defer p.lock.Unlock()
|
|
||||||
for len(p.c) > n {
|
|
||||||
<-p.c
|
|
||||||
p.count--
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reserve is blocking until it returns an available Tree
|
|
||||||
// it reuses free Trees or creates a new one if size is not reached
|
|
||||||
func (p *TreePool) Reserve() *Tree {
|
|
||||||
p.lock.Lock()
|
|
||||||
defer p.lock.Unlock()
|
|
||||||
var t *Tree
|
|
||||||
if p.count == p.Capacity {
|
|
||||||
return <-p.c
|
|
||||||
}
|
|
||||||
select {
|
|
||||||
case t = <-p.c:
|
|
||||||
default:
|
|
||||||
t = NewTree(p.hasher, p.SegmentSize, p.SegmentCount)
|
|
||||||
p.count++
|
|
||||||
}
|
|
||||||
return t
|
|
||||||
}
|
|
||||||
|
|
||||||
// Release gives back a Tree to the pool.
|
|
||||||
// This Tree is guaranteed to be in reusable state
|
|
||||||
// does not need locking
|
|
||||||
func (p *TreePool) Release(t *Tree) {
|
|
||||||
p.c <- t // can never fail but...
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tree is a reusable control structure representing a BMT
|
|
||||||
// organised in a binary tree
|
|
||||||
// Hasher uses a TreePool to pick one for each chunk hash
|
|
||||||
// the Tree is 'locked' while not in the pool
|
|
||||||
type Tree struct {
|
|
||||||
leaves []*Node
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw draws the BMT (badly)
|
|
||||||
func (t *Tree) Draw(hash []byte, d int) string {
|
|
||||||
var left, right []string
|
|
||||||
var anc []*Node
|
|
||||||
for i, n := range t.leaves {
|
|
||||||
left = append(left, fmt.Sprintf("%v", hashstr(n.left)))
|
|
||||||
if i%2 == 0 {
|
|
||||||
anc = append(anc, n.parent)
|
|
||||||
}
|
|
||||||
right = append(right, fmt.Sprintf("%v", hashstr(n.right)))
|
|
||||||
}
|
|
||||||
anc = t.leaves
|
|
||||||
var hashes [][]string
|
|
||||||
for l := 0; len(anc) > 0; l++ {
|
|
||||||
var nodes []*Node
|
|
||||||
hash := []string{""}
|
|
||||||
for i, n := range anc {
|
|
||||||
hash = append(hash, fmt.Sprintf("%v|%v", hashstr(n.left), hashstr(n.right)))
|
|
||||||
if i%2 == 0 && n.parent != nil {
|
|
||||||
nodes = append(nodes, n.parent)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
hash = append(hash, "")
|
|
||||||
hashes = append(hashes, hash)
|
|
||||||
anc = nodes
|
|
||||||
}
|
|
||||||
hashes = append(hashes, []string{"", fmt.Sprintf("%v", hashstr(hash)), ""})
|
|
||||||
total := 60
|
|
||||||
del := " "
|
|
||||||
var rows []string
|
|
||||||
for i := len(hashes) - 1; i >= 0; i-- {
|
|
||||||
var textlen int
|
|
||||||
hash := hashes[i]
|
|
||||||
for _, s := range hash {
|
|
||||||
textlen += len(s)
|
|
||||||
}
|
|
||||||
if total < textlen {
|
|
||||||
total = textlen + len(hash)
|
|
||||||
}
|
|
||||||
delsize := (total - textlen) / (len(hash) - 1)
|
|
||||||
if delsize > len(del) {
|
|
||||||
delsize = len(del)
|
|
||||||
}
|
|
||||||
row := fmt.Sprintf("%v: %v", len(hashes)-i-1, strings.Join(hash, del[:delsize]))
|
|
||||||
rows = append(rows, row)
|
|
||||||
|
|
||||||
}
|
|
||||||
rows = append(rows, strings.Join(left, " "))
|
|
||||||
rows = append(rows, strings.Join(right, " "))
|
|
||||||
return strings.Join(rows, "\n") + "\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewTree initialises the Tree by building up the nodes of a BMT
|
|
||||||
// segment size is stipulated to be the size of the hash
|
|
||||||
// segmentCount needs to be positive integer and does not need to be
|
|
||||||
// a power of two and can even be an odd number
|
|
||||||
// segmentSize * segmentCount determines the maximum chunk size
|
|
||||||
// hashed using the tree
|
|
||||||
func NewTree(hasher BaseHasher, segmentSize, segmentCount int) *Tree {
|
|
||||||
n := NewNode(0, 0, nil)
|
|
||||||
n.root = true
|
|
||||||
prevlevel := []*Node{n}
|
|
||||||
// iterate over levels and creates 2^level nodes
|
|
||||||
level := 1
|
|
||||||
count := 2
|
|
||||||
for d := 1; d <= depth(segmentCount); d++ {
|
|
||||||
nodes := make([]*Node, count)
|
|
||||||
for i := 0; i < len(nodes); i++ {
|
|
||||||
parent := prevlevel[i/2]
|
|
||||||
t := NewNode(level, i, parent)
|
|
||||||
nodes[i] = t
|
|
||||||
}
|
|
||||||
prevlevel = nodes
|
|
||||||
level++
|
|
||||||
count *= 2
|
|
||||||
}
|
|
||||||
// the datanode level is the nodes on the last level where
|
|
||||||
return &Tree{
|
|
||||||
leaves: prevlevel,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// methods needed by hash.Hash
|
|
||||||
|
|
||||||
// Size returns the size
|
|
||||||
func (h *Hasher) Size() int {
|
|
||||||
return h.size
|
|
||||||
}
|
|
||||||
|
|
||||||
// BlockSize returns the block size
|
|
||||||
func (h *Hasher) BlockSize() int {
|
|
||||||
return h.blocksize
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sum returns the hash of the buffer
|
|
||||||
// hash.Hash interface Sum method appends the byte slice to the underlying
|
|
||||||
// data before it calculates and returns the hash of the chunk
|
|
||||||
func (h *Hasher) Sum(b []byte) (r []byte) {
|
|
||||||
t := h.bmt
|
|
||||||
i := h.cur
|
|
||||||
n := t.leaves[i]
|
|
||||||
j := i
|
|
||||||
// must run strictly before all nodes calculate
|
|
||||||
// datanodes are guaranteed to have a parent
|
|
||||||
if len(h.segment) > h.size && i > 0 && n.parent != nil {
|
|
||||||
n = n.parent
|
|
||||||
} else {
|
|
||||||
i *= 2
|
|
||||||
}
|
|
||||||
d := h.finalise(n, i)
|
|
||||||
h.writeSegment(j, h.segment, d)
|
|
||||||
c := <-h.result
|
|
||||||
h.releaseTree()
|
|
||||||
|
|
||||||
// sha3(length + BMT(pure_chunk))
|
|
||||||
if h.blockLength == nil {
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
res := h.pool.hasher()
|
|
||||||
res.Reset()
|
|
||||||
res.Write(h.blockLength)
|
|
||||||
res.Write(c)
|
|
||||||
return res.Sum(nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hasher implements the SwarmHash interface
|
|
||||||
|
|
||||||
// Hash waits for the hasher result and returns it
|
|
||||||
// caller must call this on a BMT Hasher being written to
|
|
||||||
func (h *Hasher) Hash() []byte {
|
|
||||||
return <-h.result
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hasher implements the io.Writer interface
|
|
||||||
|
|
||||||
// Write fills the buffer to hash
|
|
||||||
// with every full segment complete launches a hasher go routine
|
|
||||||
// that shoots up the BMT
|
|
||||||
func (h *Hasher) Write(b []byte) (int, error) {
|
|
||||||
l := len(b)
|
|
||||||
if l <= 0 {
|
|
||||||
return 0, nil
|
|
||||||
}
|
|
||||||
s := h.segment
|
|
||||||
i := h.cur
|
|
||||||
count := (h.count + 1) / 2
|
|
||||||
need := h.count*h.size - h.cur*2*h.size
|
|
||||||
size := h.size
|
|
||||||
if need > size {
|
|
||||||
size *= 2
|
|
||||||
}
|
|
||||||
if l < need {
|
|
||||||
need = l
|
|
||||||
}
|
|
||||||
// calculate missing bit to complete current open segment
|
|
||||||
rest := size - len(s)
|
|
||||||
if need < rest {
|
|
||||||
rest = need
|
|
||||||
}
|
|
||||||
s = append(s, b[:rest]...)
|
|
||||||
need -= rest
|
|
||||||
// read full segments and the last possibly partial segment
|
|
||||||
for need > 0 && i < count-1 {
|
|
||||||
// push all finished chunks we read
|
|
||||||
h.writeSegment(i, s, h.depth)
|
|
||||||
need -= size
|
|
||||||
if need < 0 {
|
|
||||||
size += need
|
|
||||||
}
|
|
||||||
s = b[rest : rest+size]
|
|
||||||
rest += size
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
h.segment = s
|
|
||||||
h.cur = i
|
|
||||||
// otherwise, we can assume len(s) == 0, so all buffer is read and chunk is not yet full
|
|
||||||
return l, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hasher implements the io.ReaderFrom interface
|
|
||||||
|
|
||||||
// ReadFrom reads from io.Reader and appends to the data to hash using Write
|
|
||||||
// it reads so that chunk to hash is maximum length or reader reaches EOF
|
|
||||||
// caller must Reset the hasher prior to call
|
|
||||||
func (h *Hasher) ReadFrom(r io.Reader) (m int64, err error) {
|
|
||||||
bufsize := h.size*h.count - h.size*h.cur - len(h.segment)
|
|
||||||
buf := make([]byte, bufsize)
|
|
||||||
var read int
|
|
||||||
for {
|
|
||||||
var n int
|
|
||||||
n, err = r.Read(buf)
|
|
||||||
read += n
|
|
||||||
if err == io.EOF || read == len(buf) {
|
|
||||||
hash := h.Sum(buf[:n])
|
|
||||||
if read == len(buf) {
|
|
||||||
err = NewEOC(hash)
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
n, err = h.Write(buf[:n])
|
|
||||||
if err != nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return int64(read), err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset needs to be called before writing to the hasher
|
|
||||||
func (h *Hasher) Reset() {
|
|
||||||
h.getTree()
|
|
||||||
h.blockLength = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hasher implements the SwarmHash interface
|
|
||||||
|
|
||||||
// ResetWithLength needs to be called before writing to the hasher
|
|
||||||
// the argument is supposed to be the byte slice binary representation of
|
|
||||||
// the length of the data subsumed under the hash
|
|
||||||
func (h *Hasher) ResetWithLength(l []byte) {
|
|
||||||
h.Reset()
|
|
||||||
h.blockLength = l
|
|
||||||
}
|
|
||||||
|
|
||||||
// Release gives back the Tree to the pool whereby it unlocks
|
|
||||||
// it resets tree, segment and index
|
|
||||||
func (h *Hasher) releaseTree() {
|
|
||||||
if h.bmt != nil {
|
|
||||||
n := h.bmt.leaves[h.cur]
|
|
||||||
for ; n != nil; n = n.parent {
|
|
||||||
n.unbalanced = false
|
|
||||||
if n.parent != nil {
|
|
||||||
n.root = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
h.pool.Release(h.bmt)
|
|
||||||
h.bmt = nil
|
|
||||||
|
|
||||||
}
|
|
||||||
h.cur = 0
|
|
||||||
h.segment = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *Hasher) writeSegment(i int, s []byte, d int) {
|
|
||||||
hash := h.pool.hasher()
|
|
||||||
n := h.bmt.leaves[i]
|
|
||||||
|
|
||||||
if len(s) > h.size && n.parent != nil {
|
|
||||||
go func() {
|
|
||||||
hash.Reset()
|
|
||||||
hash.Write(s)
|
|
||||||
s = hash.Sum(nil)
|
|
||||||
|
|
||||||
if n.root {
|
|
||||||
h.result <- s
|
|
||||||
return
|
|
||||||
}
|
|
||||||
h.run(n.parent, hash, d, n.index, s)
|
|
||||||
}()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
go h.run(n, hash, d, i*2, s)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *Hasher) run(n *Node, hash hash.Hash, d int, i int, s []byte) {
|
|
||||||
isLeft := i%2 == 0
|
|
||||||
for {
|
|
||||||
if isLeft {
|
|
||||||
n.left = s
|
|
||||||
} else {
|
|
||||||
n.right = s
|
|
||||||
}
|
|
||||||
if !n.unbalanced && n.toggle() {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if !n.unbalanced || !isLeft || i == 0 && d == 0 {
|
|
||||||
hash.Reset()
|
|
||||||
hash.Write(n.left)
|
|
||||||
hash.Write(n.right)
|
|
||||||
s = hash.Sum(nil)
|
|
||||||
|
|
||||||
} else {
|
|
||||||
s = append(n.left, n.right...)
|
|
||||||
}
|
|
||||||
|
|
||||||
h.hash = s
|
|
||||||
if n.root {
|
|
||||||
h.result <- s
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
isLeft = n.isLeft
|
|
||||||
n = n.parent
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// getTree obtains a BMT resource by reserving one from the pool
|
|
||||||
func (h *Hasher) getTree() *Tree {
|
|
||||||
if h.bmt != nil {
|
|
||||||
return h.bmt
|
|
||||||
}
|
|
||||||
t := h.pool.Reserve()
|
|
||||||
h.bmt = t
|
|
||||||
return t
|
|
||||||
}
|
|
||||||
|
|
||||||
// atomic bool toggle implementing a concurrent reusable 2-state object
|
|
||||||
// atomic addint with %2 implements atomic bool toggle
|
|
||||||
// it returns true if the toggler just put it in the active/waiting state
|
|
||||||
func (n *Node) toggle() bool {
|
|
||||||
return atomic.AddInt32(&n.state, 1)%2 == 1
|
|
||||||
}
|
|
||||||
|
|
||||||
func hashstr(b []byte) string {
|
|
||||||
end := len(b)
|
|
||||||
if end > 4 {
|
|
||||||
end = 4
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("%x", b[:end])
|
|
||||||
}
|
|
||||||
|
|
||||||
func depth(n int) (d int) {
|
|
||||||
for l := (n - 1) / 2; l > 0; l /= 2 {
|
|
||||||
d++
|
|
||||||
}
|
|
||||||
return d
|
|
||||||
}
|
|
||||||
|
|
||||||
// finalise is following the zigzags on the tree belonging
|
|
||||||
// to the final datasegment
|
|
||||||
func (h *Hasher) finalise(n *Node, i int) (d int) {
|
|
||||||
isLeft := i%2 == 0
|
|
||||||
for {
|
|
||||||
// when the final segment's path is going via left segments
|
|
||||||
// the incoming data is pushed to the parent upon pulling the left
|
|
||||||
// we do not need toggle the state since this condition is
|
|
||||||
// detectable
|
|
||||||
n.unbalanced = isLeft
|
|
||||||
n.right = nil
|
|
||||||
if n.initial {
|
|
||||||
n.root = true
|
|
||||||
return d
|
|
||||||
}
|
|
||||||
isLeft = n.isLeft
|
|
||||||
n = n.parent
|
|
||||||
d++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// EOC (end of chunk) implements the error interface
|
|
||||||
type EOC struct {
|
|
||||||
Hash []byte // read the hash of the chunk off the error
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error returns the error string
|
|
||||||
func (e *EOC) Error() string {
|
|
||||||
return fmt.Sprintf("hasher limit reached, chunk hash: %x", e.Hash)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewEOC creates new end of chunk error with the hash
|
|
||||||
func NewEOC(hash []byte) *EOC {
|
|
||||||
return &EOC{hash}
|
|
||||||
}
|
|
85
vendor/github.com/ethereum/go-ethereum/bmt/bmt_r.go
generated
vendored
85
vendor/github.com/ethereum/go-ethereum/bmt/bmt_r.go
generated
vendored
@ -1,85 +0,0 @@
|
|||||||
// Copyright 2017 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/>.
|
|
||||||
|
|
||||||
// simple nonconcurrent reference implementation for hashsize segment based
|
|
||||||
// Binary Merkle tree hash on arbitrary but fixed maximum chunksize
|
|
||||||
//
|
|
||||||
// This implementation does not take advantage of any paralellisms and uses
|
|
||||||
// far more memory than necessary, but it is easy to see that it is correct.
|
|
||||||
// It can be used for generating test cases for optimized implementations.
|
|
||||||
// see testBMTHasherCorrectness function in bmt_test.go
|
|
||||||
package bmt
|
|
||||||
|
|
||||||
import (
|
|
||||||
"hash"
|
|
||||||
)
|
|
||||||
|
|
||||||
// RefHasher is the non-optimized easy to read reference implementation of BMT
|
|
||||||
type RefHasher struct {
|
|
||||||
span int
|
|
||||||
section int
|
|
||||||
cap int
|
|
||||||
h hash.Hash
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewRefHasher returns a new RefHasher
|
|
||||||
func NewRefHasher(hasher BaseHasher, count int) *RefHasher {
|
|
||||||
h := hasher()
|
|
||||||
hashsize := h.Size()
|
|
||||||
maxsize := hashsize * count
|
|
||||||
c := 2
|
|
||||||
for ; c < count; c *= 2 {
|
|
||||||
}
|
|
||||||
if c > 2 {
|
|
||||||
c /= 2
|
|
||||||
}
|
|
||||||
return &RefHasher{
|
|
||||||
section: 2 * hashsize,
|
|
||||||
span: c * hashsize,
|
|
||||||
cap: maxsize,
|
|
||||||
h: h,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hash returns the BMT hash of the byte slice
|
|
||||||
// implements the SwarmHash interface
|
|
||||||
func (rh *RefHasher) Hash(d []byte) []byte {
|
|
||||||
if len(d) > rh.cap {
|
|
||||||
d = d[:rh.cap]
|
|
||||||
}
|
|
||||||
|
|
||||||
return rh.hash(d, rh.span)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (rh *RefHasher) hash(d []byte, s int) []byte {
|
|
||||||
l := len(d)
|
|
||||||
left := d
|
|
||||||
var right []byte
|
|
||||||
if l > rh.section {
|
|
||||||
for ; s >= l; s /= 2 {
|
|
||||||
}
|
|
||||||
left = rh.hash(d[:s], s)
|
|
||||||
right = d[s:]
|
|
||||||
if l-s > rh.section/2 {
|
|
||||||
right = rh.hash(right, s)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
defer rh.h.Reset()
|
|
||||||
rh.h.Write(left)
|
|
||||||
rh.h.Write(right)
|
|
||||||
h := rh.h.Sum(nil)
|
|
||||||
return h
|
|
||||||
}
|
|
211
vendor/github.com/ethereum/go-ethereum/build/ci.go
generated
vendored
211
vendor/github.com/ethereum/go-ethereum/build/ci.go
generated
vendored
@ -26,7 +26,7 @@ Available commands are:
|
|||||||
install [ -arch architecture ] [ -cc compiler ] [ packages... ] -- builds packages and executables
|
install [ -arch architecture ] [ -cc compiler ] [ packages... ] -- builds packages and executables
|
||||||
test [ -coverage ] [ packages... ] -- runs the tests
|
test [ -coverage ] [ packages... ] -- runs the tests
|
||||||
lint -- runs certain pre-selected linters
|
lint -- runs certain pre-selected linters
|
||||||
archive [ -arch architecture ] [ -type zip|tar ] [ -signer key-envvar ] [ -upload dest ] -- archives build artefacts
|
archive [ -arch architecture ] [ -type zip|tar ] [ -signer key-envvar ] [ -upload dest ] -- archives build artifacts
|
||||||
importkeys -- imports signing keys from env
|
importkeys -- imports signing keys from env
|
||||||
debsrc [ -signer key-id ] [ -upload dest ] -- creates a debian source package
|
debsrc [ -signer key-id ] [ -upload dest ] -- creates a debian source package
|
||||||
nsis -- creates a Windows NSIS installer
|
nsis -- creates a Windows NSIS installer
|
||||||
@ -59,6 +59,8 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/internal/build"
|
"github.com/ethereum/go-ethereum/internal/build"
|
||||||
|
"github.com/ethereum/go-ethereum/params"
|
||||||
|
sv "github.com/ethereum/go-ethereum/swarm/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -77,52 +79,81 @@ var (
|
|||||||
executablePath("geth"),
|
executablePath("geth"),
|
||||||
executablePath("puppeth"),
|
executablePath("puppeth"),
|
||||||
executablePath("rlpdump"),
|
executablePath("rlpdump"),
|
||||||
executablePath("swarm"),
|
|
||||||
executablePath("wnode"),
|
executablePath("wnode"),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Files that end up in the swarm*.zip archive.
|
||||||
|
swarmArchiveFiles = []string{
|
||||||
|
"COPYING",
|
||||||
|
executablePath("swarm"),
|
||||||
|
}
|
||||||
|
|
||||||
// A debian package is created for all executables listed here.
|
// A debian package is created for all executables listed here.
|
||||||
debExecutables = []debExecutable{
|
debExecutables = []debExecutable{
|
||||||
{
|
{
|
||||||
Name: "abigen",
|
BinaryName: "abigen",
|
||||||
Description: "Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages.",
|
Description: "Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "bootnode",
|
BinaryName: "bootnode",
|
||||||
Description: "Ethereum bootnode.",
|
Description: "Ethereum bootnode.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "evm",
|
BinaryName: "evm",
|
||||||
Description: "Developer utility version of the EVM (Ethereum Virtual Machine) that is capable of running bytecode snippets within a configurable environment and execution mode.",
|
Description: "Developer utility version of the EVM (Ethereum Virtual Machine) that is capable of running bytecode snippets within a configurable environment and execution mode.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "geth",
|
BinaryName: "geth",
|
||||||
Description: "Ethereum CLI client.",
|
Description: "Ethereum CLI client.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "puppeth",
|
BinaryName: "puppeth",
|
||||||
Description: "Ethereum private network manager.",
|
Description: "Ethereum private network manager.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "rlpdump",
|
BinaryName: "rlpdump",
|
||||||
Description: "Developer utility tool that prints RLP structures.",
|
Description: "Developer utility tool that prints RLP structures.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "swarm",
|
BinaryName: "wnode",
|
||||||
Description: "Ethereum Swarm daemon and tools",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Name: "wnode",
|
|
||||||
Description: "Ethereum Whisper diagnostic tool",
|
Description: "Ethereum Whisper diagnostic tool",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A debian package is created for all executables listed here.
|
||||||
|
debSwarmExecutables = []debExecutable{
|
||||||
|
{
|
||||||
|
BinaryName: "swarm",
|
||||||
|
PackageName: "ethereum-swarm",
|
||||||
|
Description: "Ethereum Swarm daemon and tools",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
debEthereum = debPackage{
|
||||||
|
Name: "ethereum",
|
||||||
|
Version: params.Version,
|
||||||
|
Executables: debExecutables,
|
||||||
|
}
|
||||||
|
|
||||||
|
debSwarm = debPackage{
|
||||||
|
Name: "ethereum-swarm",
|
||||||
|
Version: sv.Version,
|
||||||
|
Executables: debSwarmExecutables,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Debian meta packages to build and push to Ubuntu PPA
|
||||||
|
debPackages = []debPackage{
|
||||||
|
debSwarm,
|
||||||
|
debEthereum,
|
||||||
|
}
|
||||||
|
|
||||||
// Distros for which packages are created.
|
// Distros for which packages are created.
|
||||||
// Note: vivid is unsupported because there is no golang-1.6 package for it.
|
// Note: vivid is unsupported because there is no golang-1.6 package for it.
|
||||||
// Note: wily is unsupported because it was officially deprecated on lanchpad.
|
// Note: wily is unsupported because it was officially deprecated on lanchpad.
|
||||||
// Note: yakkety is unsupported because it was officially deprecated on lanchpad.
|
// Note: yakkety is unsupported because it was officially deprecated on lanchpad.
|
||||||
// Note: zesty is unsupported because it was officially deprecated on lanchpad.
|
// Note: zesty is unsupported because it was officially deprecated on lanchpad.
|
||||||
debDistros = []string{"trusty", "xenial", "artful", "bionic"}
|
// Note: artful is unsupported because it was officially deprecated on lanchpad.
|
||||||
|
debDistros = []string{"trusty", "xenial", "bionic", "cosmic"}
|
||||||
)
|
)
|
||||||
|
|
||||||
var GOBIN, _ = filepath.Abs(filepath.Join("build", "bin"))
|
var GOBIN, _ = filepath.Abs(filepath.Join("build", "bin"))
|
||||||
@ -330,6 +361,7 @@ func doLint(cmdline []string) {
|
|||||||
configs := []string{
|
configs := []string{
|
||||||
"--vendor",
|
"--vendor",
|
||||||
"--tests",
|
"--tests",
|
||||||
|
"--deadline=2m",
|
||||||
"--disable-all",
|
"--disable-all",
|
||||||
"--enable=goimports",
|
"--enable=goimports",
|
||||||
"--enable=varcheck",
|
"--enable=varcheck",
|
||||||
@ -349,7 +381,6 @@ func doLint(cmdline []string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Release Packaging
|
// Release Packaging
|
||||||
|
|
||||||
func doArchive(cmdline []string) {
|
func doArchive(cmdline []string) {
|
||||||
var (
|
var (
|
||||||
arch = flag.String("arch", runtime.GOARCH, "Architecture cross packaging")
|
arch = flag.String("arch", runtime.GOARCH, "Architecture cross packaging")
|
||||||
@ -369,10 +400,14 @@ func doArchive(cmdline []string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
env = build.Env()
|
env = build.Env()
|
||||||
base = archiveBasename(*arch, env)
|
|
||||||
geth = "geth-" + base + ext
|
basegeth = archiveBasename(*arch, params.ArchiveVersion(env.Commit))
|
||||||
alltools = "geth-alltools-" + base + ext
|
geth = "geth-" + basegeth + ext
|
||||||
|
alltools = "geth-alltools-" + basegeth + ext
|
||||||
|
|
||||||
|
baseswarm = archiveBasename(*arch, sv.ArchiveVersion(env.Commit))
|
||||||
|
swarm = "swarm-" + baseswarm + ext
|
||||||
)
|
)
|
||||||
maybeSkipArchive(env)
|
maybeSkipArchive(env)
|
||||||
if err := build.WriteArchive(geth, gethArchiveFiles); err != nil {
|
if err := build.WriteArchive(geth, gethArchiveFiles); err != nil {
|
||||||
@ -381,14 +416,17 @@ func doArchive(cmdline []string) {
|
|||||||
if err := build.WriteArchive(alltools, allToolsArchiveFiles); err != nil {
|
if err := build.WriteArchive(alltools, allToolsArchiveFiles); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
for _, archive := range []string{geth, alltools} {
|
if err := build.WriteArchive(swarm, swarmArchiveFiles); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
for _, archive := range []string{geth, alltools, swarm} {
|
||||||
if err := archiveUpload(archive, *upload, *signer); err != nil {
|
if err := archiveUpload(archive, *upload, *signer); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func archiveBasename(arch string, env build.Environment) string {
|
func archiveBasename(arch string, archiveVersion string) string {
|
||||||
platform := runtime.GOOS + "-" + arch
|
platform := runtime.GOOS + "-" + arch
|
||||||
if arch == "arm" {
|
if arch == "arm" {
|
||||||
platform += os.Getenv("GOARM")
|
platform += os.Getenv("GOARM")
|
||||||
@ -399,18 +437,7 @@ func archiveBasename(arch string, env build.Environment) string {
|
|||||||
if arch == "ios" {
|
if arch == "ios" {
|
||||||
platform = "ios-all"
|
platform = "ios-all"
|
||||||
}
|
}
|
||||||
return platform + "-" + archiveVersion(env)
|
return platform + "-" + archiveVersion
|
||||||
}
|
|
||||||
|
|
||||||
func archiveVersion(env build.Environment) string {
|
|
||||||
version := build.VERSION()
|
|
||||||
if isUnstableBuild(env) {
|
|
||||||
version += "-unstable"
|
|
||||||
}
|
|
||||||
if env.Commit != "" {
|
|
||||||
version += "-" + env.Commit[:8]
|
|
||||||
}
|
|
||||||
return version
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func archiveUpload(archive string, blobstore string, signer string) error {
|
func archiveUpload(archive string, blobstore string, signer string) error {
|
||||||
@ -460,7 +487,6 @@ func maybeSkipArchive(env build.Environment) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Debian Packaging
|
// Debian Packaging
|
||||||
|
|
||||||
func doDebianSource(cmdline []string) {
|
func doDebianSource(cmdline []string) {
|
||||||
var (
|
var (
|
||||||
signer = flag.String("signer", "", `Signing key name, also used as package author`)
|
signer = flag.String("signer", "", `Signing key name, also used as package author`)
|
||||||
@ -484,21 +510,23 @@ func doDebianSource(cmdline []string) {
|
|||||||
build.MustRun(gpg)
|
build.MustRun(gpg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the packages.
|
// Create Debian packages and upload them
|
||||||
for _, distro := range debDistros {
|
for _, pkg := range debPackages {
|
||||||
meta := newDebMetadata(distro, *signer, env, now)
|
for _, distro := range debDistros {
|
||||||
pkgdir := stageDebianSource(*workdir, meta)
|
meta := newDebMetadata(distro, *signer, env, now, pkg.Name, pkg.Version, pkg.Executables)
|
||||||
debuild := exec.Command("debuild", "-S", "-sa", "-us", "-uc")
|
pkgdir := stageDebianSource(*workdir, meta)
|
||||||
debuild.Dir = pkgdir
|
debuild := exec.Command("debuild", "-S", "-sa", "-us", "-uc")
|
||||||
build.MustRun(debuild)
|
debuild.Dir = pkgdir
|
||||||
|
build.MustRun(debuild)
|
||||||
|
|
||||||
changes := fmt.Sprintf("%s_%s_source.changes", meta.Name(), meta.VersionString())
|
changes := fmt.Sprintf("%s_%s_source.changes", meta.Name(), meta.VersionString())
|
||||||
changes = filepath.Join(*workdir, changes)
|
changes = filepath.Join(*workdir, changes)
|
||||||
if *signer != "" {
|
if *signer != "" {
|
||||||
build.MustRunCommand("debsign", changes)
|
build.MustRunCommand("debsign", changes)
|
||||||
}
|
}
|
||||||
if *upload != "" {
|
if *upload != "" {
|
||||||
build.MustRunCommand("dput", *upload, changes)
|
build.MustRunCommand("dput", *upload, changes)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -523,9 +551,17 @@ func isUnstableBuild(env build.Environment) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type debPackage struct {
|
||||||
|
Name string // the name of the Debian package to produce, e.g. "ethereum", or "ethereum-swarm"
|
||||||
|
Version string // the clean version of the debPackage, e.g. 1.8.12 or 0.3.0, without any metadata
|
||||||
|
Executables []debExecutable // executables to be included in the package
|
||||||
|
}
|
||||||
|
|
||||||
type debMetadata struct {
|
type debMetadata struct {
|
||||||
Env build.Environment
|
Env build.Environment
|
||||||
|
|
||||||
|
PackageName string
|
||||||
|
|
||||||
// go-ethereum version being built. Note that this
|
// go-ethereum version being built. Note that this
|
||||||
// is not the debian package version. The package version
|
// is not the debian package version. The package version
|
||||||
// is constructed by VersionString.
|
// is constructed by VersionString.
|
||||||
@ -537,21 +573,33 @@ type debMetadata struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type debExecutable struct {
|
type debExecutable struct {
|
||||||
Name, Description string
|
PackageName string
|
||||||
|
BinaryName string
|
||||||
|
Description string
|
||||||
}
|
}
|
||||||
|
|
||||||
func newDebMetadata(distro, author string, env build.Environment, t time.Time) debMetadata {
|
// Package returns the name of the package if present, or
|
||||||
|
// fallbacks to BinaryName
|
||||||
|
func (d debExecutable) Package() string {
|
||||||
|
if d.PackageName != "" {
|
||||||
|
return d.PackageName
|
||||||
|
}
|
||||||
|
return d.BinaryName
|
||||||
|
}
|
||||||
|
|
||||||
|
func newDebMetadata(distro, author string, env build.Environment, t time.Time, name string, version string, exes []debExecutable) debMetadata {
|
||||||
if author == "" {
|
if author == "" {
|
||||||
// No signing key, use default author.
|
// No signing key, use default author.
|
||||||
author = "Ethereum Builds <fjl@ethereum.org>"
|
author = "Ethereum Builds <fjl@ethereum.org>"
|
||||||
}
|
}
|
||||||
return debMetadata{
|
return debMetadata{
|
||||||
|
PackageName: name,
|
||||||
Env: env,
|
Env: env,
|
||||||
Author: author,
|
Author: author,
|
||||||
Distro: distro,
|
Distro: distro,
|
||||||
Version: build.VERSION(),
|
Version: version,
|
||||||
Time: t.Format(time.RFC1123Z),
|
Time: t.Format(time.RFC1123Z),
|
||||||
Executables: debExecutables,
|
Executables: exes,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -559,9 +607,9 @@ func newDebMetadata(distro, author string, env build.Environment, t time.Time) d
|
|||||||
// on all executable packages.
|
// on all executable packages.
|
||||||
func (meta debMetadata) Name() string {
|
func (meta debMetadata) Name() string {
|
||||||
if isUnstableBuild(meta.Env) {
|
if isUnstableBuild(meta.Env) {
|
||||||
return "ethereum-unstable"
|
return meta.PackageName + "-unstable"
|
||||||
}
|
}
|
||||||
return "ethereum"
|
return meta.PackageName
|
||||||
}
|
}
|
||||||
|
|
||||||
// VersionString returns the debian version of the packages.
|
// VersionString returns the debian version of the packages.
|
||||||
@ -588,9 +636,20 @@ func (meta debMetadata) ExeList() string {
|
|||||||
// ExeName returns the package name of an executable package.
|
// ExeName returns the package name of an executable package.
|
||||||
func (meta debMetadata) ExeName(exe debExecutable) string {
|
func (meta debMetadata) ExeName(exe debExecutable) string {
|
||||||
if isUnstableBuild(meta.Env) {
|
if isUnstableBuild(meta.Env) {
|
||||||
return exe.Name + "-unstable"
|
return exe.Package() + "-unstable"
|
||||||
}
|
}
|
||||||
return exe.Name
|
return exe.Package()
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthereumSwarmPackageName returns the name of the swarm package based on
|
||||||
|
// environment, e.g. "ethereum-swarm-unstable", or "ethereum-swarm".
|
||||||
|
// This is needed so that we make sure that "ethereum" package,
|
||||||
|
// depends on and installs "ethereum-swarm"
|
||||||
|
func (meta debMetadata) EthereumSwarmPackageName() string {
|
||||||
|
if isUnstableBuild(meta.Env) {
|
||||||
|
return debSwarm.Name + "-unstable"
|
||||||
|
}
|
||||||
|
return debSwarm.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExeConflicts returns the content of the Conflicts field
|
// ExeConflicts returns the content of the Conflicts field
|
||||||
@ -605,7 +664,7 @@ func (meta debMetadata) ExeConflicts(exe debExecutable) string {
|
|||||||
// be preferred and the conflicting files should be handled via
|
// be preferred and the conflicting files should be handled via
|
||||||
// alternates. We might do this eventually but using a conflict is
|
// alternates. We might do this eventually but using a conflict is
|
||||||
// easier now.
|
// easier now.
|
||||||
return "ethereum, " + exe.Name
|
return "ethereum, " + exe.Package()
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
@ -622,24 +681,23 @@ func stageDebianSource(tmpdir string, meta debMetadata) (pkgdir string) {
|
|||||||
|
|
||||||
// Put the debian build files in place.
|
// Put the debian build files in place.
|
||||||
debian := filepath.Join(pkgdir, "debian")
|
debian := filepath.Join(pkgdir, "debian")
|
||||||
build.Render("build/deb.rules", filepath.Join(debian, "rules"), 0755, meta)
|
build.Render("build/deb/"+meta.PackageName+"/deb.rules", filepath.Join(debian, "rules"), 0755, meta)
|
||||||
build.Render("build/deb.changelog", filepath.Join(debian, "changelog"), 0644, meta)
|
build.Render("build/deb/"+meta.PackageName+"/deb.changelog", filepath.Join(debian, "changelog"), 0644, meta)
|
||||||
build.Render("build/deb.control", filepath.Join(debian, "control"), 0644, meta)
|
build.Render("build/deb/"+meta.PackageName+"/deb.control", filepath.Join(debian, "control"), 0644, meta)
|
||||||
build.Render("build/deb.copyright", filepath.Join(debian, "copyright"), 0644, meta)
|
build.Render("build/deb/"+meta.PackageName+"/deb.copyright", filepath.Join(debian, "copyright"), 0644, meta)
|
||||||
build.RenderString("8\n", filepath.Join(debian, "compat"), 0644, meta)
|
build.RenderString("8\n", filepath.Join(debian, "compat"), 0644, meta)
|
||||||
build.RenderString("3.0 (native)\n", filepath.Join(debian, "source/format"), 0644, meta)
|
build.RenderString("3.0 (native)\n", filepath.Join(debian, "source/format"), 0644, meta)
|
||||||
for _, exe := range meta.Executables {
|
for _, exe := range meta.Executables {
|
||||||
install := filepath.Join(debian, meta.ExeName(exe)+".install")
|
install := filepath.Join(debian, meta.ExeName(exe)+".install")
|
||||||
docs := filepath.Join(debian, meta.ExeName(exe)+".docs")
|
docs := filepath.Join(debian, meta.ExeName(exe)+".docs")
|
||||||
build.Render("build/deb.install", install, 0644, exe)
|
build.Render("build/deb/"+meta.PackageName+"/deb.install", install, 0644, exe)
|
||||||
build.Render("build/deb.docs", docs, 0644, exe)
|
build.Render("build/deb/"+meta.PackageName+"/deb.docs", docs, 0644, exe)
|
||||||
}
|
}
|
||||||
|
|
||||||
return pkgdir
|
return pkgdir
|
||||||
}
|
}
|
||||||
|
|
||||||
// Windows installer
|
// Windows installer
|
||||||
|
|
||||||
func doWindowsInstaller(cmdline []string) {
|
func doWindowsInstaller(cmdline []string) {
|
||||||
// Parse the flags and make skip installer generation on PRs
|
// Parse the flags and make skip installer generation on PRs
|
||||||
var (
|
var (
|
||||||
@ -689,11 +747,11 @@ func doWindowsInstaller(cmdline []string) {
|
|||||||
// Build the installer. This assumes that all the needed files have been previously
|
// Build the installer. This assumes that all the needed files have been previously
|
||||||
// built (don't mix building and packaging to keep cross compilation complexity to a
|
// built (don't mix building and packaging to keep cross compilation complexity to a
|
||||||
// minimum).
|
// minimum).
|
||||||
version := strings.Split(build.VERSION(), ".")
|
version := strings.Split(params.Version, ".")
|
||||||
if env.Commit != "" {
|
if env.Commit != "" {
|
||||||
version[2] += "-" + env.Commit[:8]
|
version[2] += "-" + env.Commit[:8]
|
||||||
}
|
}
|
||||||
installer, _ := filepath.Abs("geth-" + archiveBasename(*arch, env) + ".exe")
|
installer, _ := filepath.Abs("geth-" + archiveBasename(*arch, params.ArchiveVersion(env.Commit)) + ".exe")
|
||||||
build.MustRunCommand("makensis.exe",
|
build.MustRunCommand("makensis.exe",
|
||||||
"/DOUTPUTFILE="+installer,
|
"/DOUTPUTFILE="+installer,
|
||||||
"/DMAJORVERSION="+version[0],
|
"/DMAJORVERSION="+version[0],
|
||||||
@ -745,7 +803,7 @@ func doAndroidArchive(cmdline []string) {
|
|||||||
maybeSkipArchive(env)
|
maybeSkipArchive(env)
|
||||||
|
|
||||||
// Sign and upload the archive to Azure
|
// Sign and upload the archive to Azure
|
||||||
archive := "geth-" + archiveBasename("android", env) + ".aar"
|
archive := "geth-" + archiveBasename("android", params.ArchiveVersion(env.Commit)) + ".aar"
|
||||||
os.Rename("geth.aar", archive)
|
os.Rename("geth.aar", archive)
|
||||||
|
|
||||||
if err := archiveUpload(archive, *upload, *signer); err != nil {
|
if err := archiveUpload(archive, *upload, *signer); err != nil {
|
||||||
@ -830,7 +888,7 @@ func newMavenMetadata(env build.Environment) mavenMetadata {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Render the version and package strings
|
// Render the version and package strings
|
||||||
version := build.VERSION()
|
version := params.Version
|
||||||
if isUnstableBuild(env) {
|
if isUnstableBuild(env) {
|
||||||
version += "-SNAPSHOT"
|
version += "-SNAPSHOT"
|
||||||
}
|
}
|
||||||
@ -865,7 +923,7 @@ func doXCodeFramework(cmdline []string) {
|
|||||||
build.MustRun(bind)
|
build.MustRun(bind)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
archive := "geth-" + archiveBasename("ios", env)
|
archive := "geth-" + archiveBasename("ios", params.ArchiveVersion(env.Commit))
|
||||||
if err := os.Mkdir(archive, os.ModePerm); err != nil {
|
if err := os.Mkdir(archive, os.ModePerm); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -921,7 +979,7 @@ func newPodMetadata(env build.Environment, archive string) podMetadata {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
version := build.VERSION()
|
version := params.Version
|
||||||
if isUnstableBuild(env) {
|
if isUnstableBuild(env) {
|
||||||
version += "-unstable." + env.Buildnum
|
version += "-unstable." + env.Buildnum
|
||||||
}
|
}
|
||||||
@ -1017,23 +1075,14 @@ func doPurge(cmdline []string) {
|
|||||||
}
|
}
|
||||||
for i := 0; i < len(blobs); i++ {
|
for i := 0; i < len(blobs); i++ {
|
||||||
for j := i + 1; j < len(blobs); j++ {
|
for j := i + 1; j < len(blobs); j++ {
|
||||||
iTime, err := time.Parse(time.RFC1123, blobs[i].Properties.LastModified)
|
if blobs[i].Properties.LastModified.After(blobs[j].Properties.LastModified) {
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
jTime, err := time.Parse(time.RFC1123, blobs[j].Properties.LastModified)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
if iTime.After(jTime) {
|
|
||||||
blobs[i], blobs[j] = blobs[j], blobs[i]
|
blobs[i], blobs[j] = blobs[j], blobs[i]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Filter out all archives more recent that the given threshold
|
// Filter out all archives more recent that the given threshold
|
||||||
for i, blob := range blobs {
|
for i, blob := range blobs {
|
||||||
timestamp, _ := time.Parse(time.RFC1123, blob.Properties.LastModified)
|
if time.Since(blob.Properties.LastModified) < time.Duration(*limit)*24*time.Hour {
|
||||||
if time.Since(timestamp) < time.Duration(*limit)*24*time.Hour {
|
|
||||||
blobs = blobs[:i]
|
blobs = blobs[:i]
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
19
vendor/github.com/ethereum/go-ethereum/build/clean_go_build_cache.sh
generated
vendored
Executable file
19
vendor/github.com/ethereum/go-ethereum/build/clean_go_build_cache.sh
generated
vendored
Executable file
@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Cleaning the Go cache only makes sense if we actually have Go installed... or
|
||||||
|
# if Go is actually callable. This does not hold true during deb packaging, so
|
||||||
|
# we need an explicit check to avoid build failures.
|
||||||
|
if ! command -v go > /dev/null; then
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
version_gt() {
|
||||||
|
test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
golang_version=$(go version |cut -d' ' -f3 |sed 's/go//')
|
||||||
|
|
||||||
|
# Clean go build cache when go version is greater than or equal to 1.10
|
||||||
|
if !(version_gt 1.10 $golang_version); then
|
||||||
|
go clean -cache
|
||||||
|
fi
|
1
vendor/github.com/ethereum/go-ethereum/build/deb.install
generated
vendored
1
vendor/github.com/ethereum/go-ethereum/build/deb.install
generated
vendored
@ -1 +0,0 @@
|
|||||||
build/bin/{{.Name}} usr/bin
|
|
19
vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.control
generated
vendored
Normal file
19
vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.control
generated
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
Source: {{.Name}}
|
||||||
|
Section: science
|
||||||
|
Priority: extra
|
||||||
|
Maintainer: {{.Author}}
|
||||||
|
Build-Depends: debhelper (>= 8.0.0), golang-1.10
|
||||||
|
Standards-Version: 3.9.5
|
||||||
|
Homepage: https://ethereum.org
|
||||||
|
Vcs-Git: git://github.com/ethereum/go-ethereum.git
|
||||||
|
Vcs-Browser: https://github.com/ethereum/go-ethereum
|
||||||
|
|
||||||
|
{{range .Executables}}
|
||||||
|
Package: {{$.ExeName .}}
|
||||||
|
Conflicts: {{$.ExeConflicts .}}
|
||||||
|
Architecture: any
|
||||||
|
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||||
|
Built-Using: ${misc:Built-Using}
|
||||||
|
Description: {{.Description}}
|
||||||
|
{{.Description}}
|
||||||
|
{{end}}
|
@ -1,4 +1,4 @@
|
|||||||
Copyright 2016 The go-ethereum Authors
|
Copyright 2018 The go-ethereum Authors
|
||||||
|
|
||||||
go-ethereum is free software: you can redistribute it and/or modify
|
go-ethereum is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
1
vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.install
generated
vendored
Normal file
1
vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.install
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
build/bin/{{.BinaryName}} usr/bin
|
5
vendor/github.com/ethereum/go-ethereum/build/deb/ethereum/deb.changelog
generated
vendored
Normal file
5
vendor/github.com/ethereum/go-ethereum/build/deb/ethereum/deb.changelog
generated
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{{.Name}} ({{.VersionString}}) {{.Distro}}; urgency=low
|
||||||
|
|
||||||
|
* git build of {{.Env.Commit}}
|
||||||
|
|
||||||
|
-- {{.Author}} {{.Time}}
|
@ -10,9 +10,9 @@ Vcs-Browser: https://github.com/ethereum/go-ethereum
|
|||||||
|
|
||||||
Package: {{.Name}}
|
Package: {{.Name}}
|
||||||
Architecture: any
|
Architecture: any
|
||||||
Depends: ${misc:Depends}, {{.ExeList}}
|
Depends: ${misc:Depends}, {{.EthereumSwarmPackageName}}, {{.ExeList}}
|
||||||
Description: Meta-package to install geth and other tools
|
Description: Meta-package to install geth, swarm, and other tools
|
||||||
Meta-package to install geth and other tools
|
Meta-package to install geth, swarm and other tools
|
||||||
|
|
||||||
{{range .Executables}}
|
{{range .Executables}}
|
||||||
Package: {{$.ExeName .}}
|
Package: {{$.ExeName .}}
|
14
vendor/github.com/ethereum/go-ethereum/build/deb/ethereum/deb.copyright
generated
vendored
Normal file
14
vendor/github.com/ethereum/go-ethereum/build/deb/ethereum/deb.copyright
generated
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
Copyright 2018 The go-ethereum Authors
|
||||||
|
|
||||||
|
go-ethereum is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
go-ethereum 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 General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
1
vendor/github.com/ethereum/go-ethereum/build/deb/ethereum/deb.docs
generated
vendored
Normal file
1
vendor/github.com/ethereum/go-ethereum/build/deb/ethereum/deb.docs
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
AUTHORS
|
1
vendor/github.com/ethereum/go-ethereum/build/deb/ethereum/deb.install
generated
vendored
Normal file
1
vendor/github.com/ethereum/go-ethereum/build/deb/ethereum/deb.install
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
build/bin/{{.BinaryName}} usr/bin
|
13
vendor/github.com/ethereum/go-ethereum/build/deb/ethereum/deb.rules
generated
vendored
Normal file
13
vendor/github.com/ethereum/go-ethereum/build/deb/ethereum/deb.rules
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#!/usr/bin/make -f
|
||||||
|
# -*- makefile -*-
|
||||||
|
|
||||||
|
# Uncomment this to turn on verbose mode.
|
||||||
|
#export DH_VERBOSE=1
|
||||||
|
|
||||||
|
override_dh_auto_build:
|
||||||
|
build/env.sh /usr/lib/go-1.10/bin/go run build/ci.go install -git-commit={{.Env.Commit}} -git-branch={{.Env.Branch}} -git-tag={{.Env.Tag}} -buildnum={{.Env.Buildnum}} -pull-request={{.Env.IsPullRequest}}
|
||||||
|
|
||||||
|
override_dh_auto_test:
|
||||||
|
|
||||||
|
%:
|
||||||
|
dh $@
|
22
vendor/github.com/ethereum/go-ethereum/build/goimports.sh
generated
vendored
22
vendor/github.com/ethereum/go-ethereum/build/goimports.sh
generated
vendored
@ -1,18 +1,18 @@
|
|||||||
#!/usr/bin/env bash
|
#!/bin/sh
|
||||||
|
|
||||||
find_files() {
|
find_files() {
|
||||||
find . -not \( \
|
find . ! \( \
|
||||||
\( \
|
\( \
|
||||||
-wholename '.github' \
|
-path '.github' \
|
||||||
-o -wholename './build/_workspace' \
|
-o -path './build/_workspace' \
|
||||||
-o -wholename './build/bin' \
|
-o -path './build/bin' \
|
||||||
-o -wholename './crypto/bn256' \
|
-o -path './crypto/bn256' \
|
||||||
-o -wholename '*/vendor/*' \
|
-o -path '*/vendor/*' \
|
||||||
\) -prune \
|
\) -prune \
|
||||||
\) -name '*.go'
|
\) -name '*.go'
|
||||||
}
|
}
|
||||||
|
|
||||||
GOFMT="gofmt -s -w";
|
GOFMT="gofmt -s -w"
|
||||||
GOIMPORTS="goimports -w";
|
GOIMPORTS="goimports -w"
|
||||||
find_files | xargs $GOFMT;
|
find_files | xargs $GOFMT
|
||||||
find_files | xargs $GOIMPORTS;
|
find_files | xargs $GOIMPORTS
|
||||||
|
2
vendor/github.com/ethereum/go-ethereum/cmd/clef/main.go
generated
vendored
2
vendor/github.com/ethereum/go-ethereum/cmd/clef/main.go
generated
vendored
@ -415,7 +415,7 @@ func signer(c *cli.Context) error {
|
|||||||
|
|
||||||
// start http server
|
// start http server
|
||||||
httpEndpoint := fmt.Sprintf("%s:%d", c.String(utils.RPCListenAddrFlag.Name), c.Int(rpcPortFlag.Name))
|
httpEndpoint := fmt.Sprintf("%s:%d", c.String(utils.RPCListenAddrFlag.Name), c.Int(rpcPortFlag.Name))
|
||||||
listener, _, err := rpc.StartHTTPEndpoint(httpEndpoint, rpcAPI, []string{"account"}, cors, vhosts)
|
listener, _, err := rpc.StartHTTPEndpoint(httpEndpoint, rpcAPI, []string{"account"}, cors, vhosts, rpc.DefaultHTTPTimeouts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Fatalf("Could not start RPC api: %v", err)
|
utils.Fatalf("Could not start RPC api: %v", err)
|
||||||
}
|
}
|
||||||
|
2
vendor/github.com/ethereum/go-ethereum/cmd/evm/compiler.go
generated
vendored
2
vendor/github.com/ethereum/go-ethereum/cmd/evm/compiler.go
generated
vendored
@ -50,6 +50,6 @@ func compileCmd(ctx *cli.Context) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
fmt.Println(bin)
|
fmt.Fprintln(ctx.App.Writer, bin)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
2
vendor/github.com/ethereum/go-ethereum/cmd/evm/disasm.go
generated
vendored
2
vendor/github.com/ethereum/go-ethereum/cmd/evm/disasm.go
generated
vendored
@ -45,6 +45,6 @@ func disasmCmd(ctx *cli.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
code := strings.TrimSpace(string(in[:]))
|
code := strings.TrimSpace(string(in[:]))
|
||||||
fmt.Printf("%v\n", code)
|
fmt.Fprintf(ctx.App.Writer, "%v\n", code)
|
||||||
return asm.PrintDisassembled(code)
|
return asm.PrintDisassembled(code)
|
||||||
}
|
}
|
||||||
|
5
vendor/github.com/ethereum/go-ethereum/cmd/evm/internal/compiler/compiler.go
generated
vendored
5
vendor/github.com/ethereum/go-ethereum/cmd/evm/internal/compiler/compiler.go
generated
vendored
@ -30,10 +30,11 @@ func Compile(fn string, src []byte, debug bool) (string, error) {
|
|||||||
bin, compileErrors := compiler.Compile()
|
bin, compileErrors := compiler.Compile()
|
||||||
if len(compileErrors) > 0 {
|
if len(compileErrors) > 0 {
|
||||||
// report errors
|
// report errors
|
||||||
|
errs := ""
|
||||||
for _, err := range compileErrors {
|
for _, err := range compileErrors {
|
||||||
fmt.Printf("%s:%v\n", fn, err)
|
errs += fmt.Sprintf("%s:%v\n", fn, err)
|
||||||
}
|
}
|
||||||
return "", errors.New("compiling failed")
|
return "", errors.New(errs + "compiling failed\n")
|
||||||
}
|
}
|
||||||
return bin, nil
|
return bin, nil
|
||||||
}
|
}
|
||||||
|
28
vendor/github.com/ethereum/go-ethereum/cmd/evm/runner.go
generated
vendored
28
vendor/github.com/ethereum/go-ethereum/cmd/evm/runner.go
generated
vendored
@ -128,13 +128,13 @@ func runCmd(ctx *cli.Context) error {
|
|||||||
if ctx.GlobalString(CodeFileFlag.Name) == "-" {
|
if ctx.GlobalString(CodeFileFlag.Name) == "-" {
|
||||||
//Try reading from stdin
|
//Try reading from stdin
|
||||||
if hexcode, err = ioutil.ReadAll(os.Stdin); err != nil {
|
if hexcode, err = ioutil.ReadAll(os.Stdin); err != nil {
|
||||||
fmt.Printf("Could not load code from stdin: %v\n", err)
|
fmt.Fprintf(ctx.App.ErrWriter, "Could not load code from stdin: %v\n", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Codefile with hex assembly
|
// Codefile with hex assembly
|
||||||
if hexcode, err = ioutil.ReadFile(ctx.GlobalString(CodeFileFlag.Name)); err != nil {
|
if hexcode, err = ioutil.ReadFile(ctx.GlobalString(CodeFileFlag.Name)); err != nil {
|
||||||
fmt.Printf("Could not load code from file: %v\n", err)
|
fmt.Fprintf(ctx.App.ErrWriter, "Could not load code from file: %v\n", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -172,11 +172,11 @@ func runCmd(ctx *cli.Context) error {
|
|||||||
if cpuProfilePath := ctx.GlobalString(CPUProfileFlag.Name); cpuProfilePath != "" {
|
if cpuProfilePath := ctx.GlobalString(CPUProfileFlag.Name); cpuProfilePath != "" {
|
||||||
f, err := os.Create(cpuProfilePath)
|
f, err := os.Create(cpuProfilePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("could not create CPU profile: ", err)
|
fmt.Fprintf(ctx.App.ErrWriter, "could not create CPU profile: %v\n", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
if err := pprof.StartCPUProfile(f); err != nil {
|
if err := pprof.StartCPUProfile(f); err != nil {
|
||||||
fmt.Println("could not start CPU profile: ", err)
|
fmt.Fprintf(ctx.App.ErrWriter, "could not start CPU profile: %v\n", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
defer pprof.StopCPUProfile()
|
defer pprof.StopCPUProfile()
|
||||||
@ -200,17 +200,17 @@ func runCmd(ctx *cli.Context) error {
|
|||||||
|
|
||||||
if ctx.GlobalBool(DumpFlag.Name) {
|
if ctx.GlobalBool(DumpFlag.Name) {
|
||||||
statedb.IntermediateRoot(true)
|
statedb.IntermediateRoot(true)
|
||||||
fmt.Println(string(statedb.Dump()))
|
fmt.Fprintln(ctx.App.Writer, string(statedb.Dump()))
|
||||||
}
|
}
|
||||||
|
|
||||||
if memProfilePath := ctx.GlobalString(MemProfileFlag.Name); memProfilePath != "" {
|
if memProfilePath := ctx.GlobalString(MemProfileFlag.Name); memProfilePath != "" {
|
||||||
f, err := os.Create(memProfilePath)
|
f, err := os.Create(memProfilePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("could not create memory profile: ", err)
|
fmt.Fprintf(ctx.App.ErrWriter, "could not create memory profile: %v\n", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
if err := pprof.WriteHeapProfile(f); err != nil {
|
if err := pprof.WriteHeapProfile(f); err != nil {
|
||||||
fmt.Println("could not write memory profile: ", err)
|
fmt.Fprintf(ctx.App.ErrWriter, "could not create memory profile: %v\n", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
f.Close()
|
f.Close()
|
||||||
@ -218,17 +218,17 @@ func runCmd(ctx *cli.Context) error {
|
|||||||
|
|
||||||
if ctx.GlobalBool(DebugFlag.Name) {
|
if ctx.GlobalBool(DebugFlag.Name) {
|
||||||
if debugLogger != nil {
|
if debugLogger != nil {
|
||||||
fmt.Fprintln(os.Stderr, "#### TRACE ####")
|
fmt.Fprintln(ctx.App.ErrWriter, "#### TRACE ####")
|
||||||
vm.WriteTrace(os.Stderr, debugLogger.StructLogs())
|
vm.WriteTrace(ctx.App.ErrWriter, debugLogger.StructLogs())
|
||||||
}
|
}
|
||||||
fmt.Fprintln(os.Stderr, "#### LOGS ####")
|
fmt.Fprintln(ctx.App.ErrWriter, "#### LOGS ####")
|
||||||
vm.WriteLogs(os.Stderr, statedb.Logs())
|
vm.WriteLogs(ctx.App.ErrWriter, statedb.Logs())
|
||||||
}
|
}
|
||||||
|
|
||||||
if ctx.GlobalBool(StatDumpFlag.Name) {
|
if ctx.GlobalBool(StatDumpFlag.Name) {
|
||||||
var mem goruntime.MemStats
|
var mem goruntime.MemStats
|
||||||
goruntime.ReadMemStats(&mem)
|
goruntime.ReadMemStats(&mem)
|
||||||
fmt.Fprintf(os.Stderr, `evm execution time: %v
|
fmt.Fprintf(ctx.App.ErrWriter, `evm execution time: %v
|
||||||
heap objects: %d
|
heap objects: %d
|
||||||
allocations: %d
|
allocations: %d
|
||||||
total allocations: %d
|
total allocations: %d
|
||||||
@ -238,9 +238,9 @@ Gas used: %d
|
|||||||
`, execTime, mem.HeapObjects, mem.Alloc, mem.TotalAlloc, mem.NumGC, initialGas-leftOverGas)
|
`, execTime, mem.HeapObjects, mem.Alloc, mem.TotalAlloc, mem.NumGC, initialGas-leftOverGas)
|
||||||
}
|
}
|
||||||
if tracer == nil {
|
if tracer == nil {
|
||||||
fmt.Printf("0x%x\n", ret)
|
fmt.Fprintf(ctx.App.Writer, "0x%x\n", ret)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf(" error: %v\n", err)
|
fmt.Fprintf(ctx.App.ErrWriter, " error: %v\n", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
8
vendor/github.com/ethereum/go-ethereum/cmd/evm/staterunner.go
generated
vendored
8
vendor/github.com/ethereum/go-ethereum/cmd/evm/staterunner.go
generated
vendored
@ -107,7 +107,7 @@ func stateTestCmd(ctx *cli.Context) error {
|
|||||||
}
|
}
|
||||||
// print state root for evmlab tracing (already committed above, so no need to delete objects again
|
// print state root for evmlab tracing (already committed above, so no need to delete objects again
|
||||||
if ctx.GlobalBool(MachineFlag.Name) && state != nil {
|
if ctx.GlobalBool(MachineFlag.Name) && state != nil {
|
||||||
fmt.Fprintf(os.Stderr, "{\"stateRoot\": \"%x\"}\n", state.IntermediateRoot(false))
|
fmt.Fprintf(ctx.App.ErrWriter, "{\"stateRoot\": \"%x\"}\n", state.IntermediateRoot(false))
|
||||||
}
|
}
|
||||||
|
|
||||||
results = append(results, *result)
|
results = append(results, *result)
|
||||||
@ -115,13 +115,13 @@ func stateTestCmd(ctx *cli.Context) error {
|
|||||||
// Print any structured logs collected
|
// Print any structured logs collected
|
||||||
if ctx.GlobalBool(DebugFlag.Name) {
|
if ctx.GlobalBool(DebugFlag.Name) {
|
||||||
if debugger != nil {
|
if debugger != nil {
|
||||||
fmt.Fprintln(os.Stderr, "#### TRACE ####")
|
fmt.Fprintln(ctx.App.ErrWriter, "#### TRACE ####")
|
||||||
vm.WriteTrace(os.Stderr, debugger.StructLogs())
|
vm.WriteTrace(ctx.App.ErrWriter, debugger.StructLogs())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
out, _ := json.MarshalIndent(results, "", " ")
|
out, _ := json.MarshalIndent(results, "", " ")
|
||||||
fmt.Println(string(out))
|
fmt.Fprintln(ctx.App.Writer, string(out))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
58
vendor/github.com/ethereum/go-ethereum/cmd/faucet/faucet.go
generated
vendored
58
vendor/github.com/ethereum/go-ethereum/cmd/faucet/faucet.go
generated
vendored
@ -77,9 +77,6 @@ var (
|
|||||||
accJSONFlag = flag.String("account.json", "", "Key json file to fund user requests with")
|
accJSONFlag = flag.String("account.json", "", "Key json file to fund user requests with")
|
||||||
accPassFlag = flag.String("account.pass", "", "Decryption password to access faucet funds")
|
accPassFlag = flag.String("account.pass", "", "Decryption password to access faucet funds")
|
||||||
|
|
||||||
githubUser = flag.String("github.user", "", "GitHub user to authenticate with for Gist access")
|
|
||||||
githubToken = flag.String("github.token", "", "GitHub personal token to access Gists with")
|
|
||||||
|
|
||||||
captchaToken = flag.String("captcha.token", "", "Recaptcha site key to authenticate client side")
|
captchaToken = flag.String("captcha.token", "", "Recaptcha site key to authenticate client side")
|
||||||
captchaSecret = flag.String("captcha.secret", "", "Recaptcha secret key to authenticate server side")
|
captchaSecret = flag.String("captcha.secret", "", "Recaptcha secret key to authenticate server side")
|
||||||
|
|
||||||
@ -216,7 +213,7 @@ func newFaucet(genesis *core.Genesis, port int, enodes []*discv5.Node, network u
|
|||||||
// Assemble the raw devp2p protocol stack
|
// Assemble the raw devp2p protocol stack
|
||||||
stack, err := node.New(&node.Config{
|
stack, err := node.New(&node.Config{
|
||||||
Name: "geth",
|
Name: "geth",
|
||||||
Version: params.Version,
|
Version: params.VersionWithMeta,
|
||||||
DataDir: filepath.Join(os.Getenv("HOME"), ".faucet"),
|
DataDir: filepath.Join(os.Getenv("HOME"), ".faucet"),
|
||||||
P2P: p2p.Config{
|
P2P: p2p.Config{
|
||||||
NAT: nat.Any(),
|
NAT: nat.Any(),
|
||||||
@ -638,59 +635,6 @@ func sendSuccess(conn *websocket.Conn, msg string) error {
|
|||||||
return send(conn, map[string]string{"success": msg}, time.Second)
|
return send(conn, map[string]string{"success": msg}, time.Second)
|
||||||
}
|
}
|
||||||
|
|
||||||
// authGitHub tries to authenticate a faucet request using GitHub gists, returning
|
|
||||||
// the username, avatar URL and Ethereum address to fund on success.
|
|
||||||
func authGitHub(url string) (string, string, common.Address, error) {
|
|
||||||
// Retrieve the gist from the GitHub Gist APIs
|
|
||||||
parts := strings.Split(url, "/")
|
|
||||||
req, _ := http.NewRequest("GET", "https://api.github.com/gists/"+parts[len(parts)-1], nil)
|
|
||||||
if *githubUser != "" {
|
|
||||||
req.SetBasicAuth(*githubUser, *githubToken)
|
|
||||||
}
|
|
||||||
res, err := http.DefaultClient.Do(req)
|
|
||||||
if err != nil {
|
|
||||||
return "", "", common.Address{}, err
|
|
||||||
}
|
|
||||||
var gist struct {
|
|
||||||
Owner struct {
|
|
||||||
Login string `json:"login"`
|
|
||||||
} `json:"owner"`
|
|
||||||
Files map[string]struct {
|
|
||||||
Content string `json:"content"`
|
|
||||||
} `json:"files"`
|
|
||||||
}
|
|
||||||
err = json.NewDecoder(res.Body).Decode(&gist)
|
|
||||||
res.Body.Close()
|
|
||||||
if err != nil {
|
|
||||||
return "", "", common.Address{}, err
|
|
||||||
}
|
|
||||||
if gist.Owner.Login == "" {
|
|
||||||
return "", "", common.Address{}, errors.New("Anonymous Gists not allowed")
|
|
||||||
}
|
|
||||||
// Iterate over all the files and look for Ethereum addresses
|
|
||||||
var address common.Address
|
|
||||||
for _, file := range gist.Files {
|
|
||||||
content := strings.TrimSpace(file.Content)
|
|
||||||
if len(content) == 2+common.AddressLength*2 {
|
|
||||||
address = common.HexToAddress(content)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if address == (common.Address{}) {
|
|
||||||
return "", "", common.Address{}, errors.New("No Ethereum address found to fund")
|
|
||||||
}
|
|
||||||
// Validate the user's existence since the API is unhelpful here
|
|
||||||
if res, err = http.Head("https://github.com/" + gist.Owner.Login); err != nil {
|
|
||||||
return "", "", common.Address{}, err
|
|
||||||
}
|
|
||||||
res.Body.Close()
|
|
||||||
|
|
||||||
if res.StatusCode != 200 {
|
|
||||||
return "", "", common.Address{}, errors.New("Invalid user... boom!")
|
|
||||||
}
|
|
||||||
// Everything passed validation, return the gathered infos
|
|
||||||
return gist.Owner.Login + "@github", fmt.Sprintf("https://github.com/%s.png?size=64", gist.Owner.Login), address, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// authTwitter tries to authenticate a faucet request using Twitter posts, returning
|
// authTwitter tries to authenticate a faucet request using Twitter posts, returning
|
||||||
// the username, avatar URL and Ethereum address to fund on success.
|
// the username, avatar URL and Ethereum address to fund on success.
|
||||||
func authTwitter(url string) (string, string, common.Address, error) {
|
func authTwitter(url string) (string, string, common.Address, error) {
|
||||||
|
2
vendor/github.com/ethereum/go-ethereum/cmd/geth/bugcmd.go
generated
vendored
2
vendor/github.com/ethereum/go-ethereum/cmd/geth/bugcmd.go
generated
vendored
@ -51,7 +51,7 @@ func reportBug(ctx *cli.Context) error {
|
|||||||
|
|
||||||
fmt.Fprintln(&buff, "#### System information")
|
fmt.Fprintln(&buff, "#### System information")
|
||||||
fmt.Fprintln(&buff)
|
fmt.Fprintln(&buff)
|
||||||
fmt.Fprintln(&buff, "Version:", params.Version)
|
fmt.Fprintln(&buff, "Version:", params.VersionWithMeta)
|
||||||
fmt.Fprintln(&buff, "Go Version:", runtime.Version())
|
fmt.Fprintln(&buff, "Go Version:", runtime.Version())
|
||||||
fmt.Fprintln(&buff, "OS:", runtime.GOOS)
|
fmt.Fprintln(&buff, "OS:", runtime.GOOS)
|
||||||
printOSDetails(&buff)
|
printOSDetails(&buff)
|
||||||
|
3
vendor/github.com/ethereum/go-ethereum/cmd/geth/chaincmd.go
generated
vendored
3
vendor/github.com/ethereum/go-ethereum/cmd/geth/chaincmd.go
generated
vendored
@ -94,7 +94,8 @@ processing will proceed even if an individual RLP-file import failure occurs.`,
|
|||||||
Requires a first argument of the file to write to.
|
Requires a first argument of the file to write to.
|
||||||
Optional second and third arguments control the first and
|
Optional second and third arguments control the first and
|
||||||
last block to write. In this mode, the file will be appended
|
last block to write. In this mode, the file will be appended
|
||||||
if already existing.`,
|
if already existing. If the file ends with .gz, the output will
|
||||||
|
be gzipped.`,
|
||||||
}
|
}
|
||||||
importPreimagesCommand = cli.Command{
|
importPreimagesCommand = cli.Command{
|
||||||
Action: utils.MigrateFlags(importPreimages),
|
Action: utils.MigrateFlags(importPreimages),
|
||||||
|
31
vendor/github.com/ethereum/go-ethereum/cmd/geth/main.go
generated
vendored
31
vendor/github.com/ethereum/go-ethereum/cmd/geth/main.go
generated
vendored
@ -144,6 +144,15 @@ var (
|
|||||||
utils.WhisperMaxMessageSizeFlag,
|
utils.WhisperMaxMessageSizeFlag,
|
||||||
utils.WhisperMinPOWFlag,
|
utils.WhisperMinPOWFlag,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metricsFlags = []cli.Flag{
|
||||||
|
utils.MetricsEnableInfluxDBFlag,
|
||||||
|
utils.MetricsInfluxDBEndpointFlag,
|
||||||
|
utils.MetricsInfluxDBDatabaseFlag,
|
||||||
|
utils.MetricsInfluxDBUsernameFlag,
|
||||||
|
utils.MetricsInfluxDBPasswordFlag,
|
||||||
|
utils.MetricsInfluxDBHostTagFlag,
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@ -186,13 +195,19 @@ func init() {
|
|||||||
app.Flags = append(app.Flags, consoleFlags...)
|
app.Flags = append(app.Flags, consoleFlags...)
|
||||||
app.Flags = append(app.Flags, debug.Flags...)
|
app.Flags = append(app.Flags, debug.Flags...)
|
||||||
app.Flags = append(app.Flags, whisperFlags...)
|
app.Flags = append(app.Flags, whisperFlags...)
|
||||||
|
app.Flags = append(app.Flags, metricsFlags...)
|
||||||
|
|
||||||
app.Before = func(ctx *cli.Context) error {
|
app.Before = func(ctx *cli.Context) error {
|
||||||
runtime.GOMAXPROCS(runtime.NumCPU())
|
runtime.GOMAXPROCS(runtime.NumCPU())
|
||||||
if err := debug.Setup(ctx); err != nil {
|
|
||||||
|
logdir := ""
|
||||||
|
if ctx.GlobalBool(utils.DashboardEnabledFlag.Name) {
|
||||||
|
logdir = (&node.Config{DataDir: utils.MakeDataDir(ctx)}).ResolvePath("logs")
|
||||||
|
}
|
||||||
|
if err := debug.Setup(ctx, logdir); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// Cap the cache allowance and tune the garbage colelctor
|
// Cap the cache allowance and tune the garbage collector
|
||||||
var mem gosigar.Mem
|
var mem gosigar.Mem
|
||||||
if err := mem.Get(); err == nil {
|
if err := mem.Get(); err == nil {
|
||||||
allowance := int(mem.Total / 1024 / 1024 / 3)
|
allowance := int(mem.Total / 1024 / 1024 / 3)
|
||||||
@ -208,6 +223,9 @@ func init() {
|
|||||||
log.Debug("Sanitizing Go's GC trigger", "percent", int(gogc))
|
log.Debug("Sanitizing Go's GC trigger", "percent", int(gogc))
|
||||||
godebug.SetGCPercent(int(gogc))
|
godebug.SetGCPercent(int(gogc))
|
||||||
|
|
||||||
|
// Start metrics export if enabled
|
||||||
|
utils.SetupMetrics(ctx)
|
||||||
|
|
||||||
// Start system runtime metrics collection
|
// Start system runtime metrics collection
|
||||||
go metrics.CollectProcessMetrics(3 * time.Second)
|
go metrics.CollectProcessMetrics(3 * time.Second)
|
||||||
|
|
||||||
@ -233,6 +251,9 @@ func main() {
|
|||||||
// 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) error {
|
func geth(ctx *cli.Context) error {
|
||||||
|
if args := ctx.Args(); len(args) > 0 {
|
||||||
|
return fmt.Errorf("invalid command: %q", args[0])
|
||||||
|
}
|
||||||
node := makeFullNode(ctx)
|
node := makeFullNode(ctx)
|
||||||
startNode(ctx, node)
|
startNode(ctx, node)
|
||||||
node.Wait()
|
node.Wait()
|
||||||
@ -287,11 +308,11 @@ func startNode(ctx *cli.Context, stack *node.Node) {
|
|||||||
status, _ := event.Wallet.Status()
|
status, _ := event.Wallet.Status()
|
||||||
log.Info("New wallet appeared", "url", event.Wallet.URL(), "status", status)
|
log.Info("New wallet appeared", "url", event.Wallet.URL(), "status", status)
|
||||||
|
|
||||||
|
derivationPath := accounts.DefaultBaseDerivationPath
|
||||||
if event.Wallet.URL().Scheme == "ledger" {
|
if event.Wallet.URL().Scheme == "ledger" {
|
||||||
event.Wallet.SelfDerive(accounts.DefaultLedgerBaseDerivationPath, stateReader)
|
derivationPath = accounts.DefaultLedgerBaseDerivationPath
|
||||||
} else {
|
|
||||||
event.Wallet.SelfDerive(accounts.DefaultBaseDerivationPath, stateReader)
|
|
||||||
}
|
}
|
||||||
|
event.Wallet.SelfDerive(derivationPath, stateReader)
|
||||||
|
|
||||||
case accounts.WalletDropped:
|
case accounts.WalletDropped:
|
||||||
log.Info("Old wallet dropped", "url", event.Wallet.URL())
|
log.Info("Old wallet dropped", "url", event.Wallet.URL())
|
||||||
|
2
vendor/github.com/ethereum/go-ethereum/cmd/geth/misccmd.go
generated
vendored
2
vendor/github.com/ethereum/go-ethereum/cmd/geth/misccmd.go
generated
vendored
@ -108,7 +108,7 @@ func makedag(ctx *cli.Context) error {
|
|||||||
|
|
||||||
func version(ctx *cli.Context) error {
|
func version(ctx *cli.Context) error {
|
||||||
fmt.Println(strings.Title(clientIdentifier))
|
fmt.Println(strings.Title(clientIdentifier))
|
||||||
fmt.Println("Version:", params.Version)
|
fmt.Println("Version:", params.VersionWithMeta)
|
||||||
if gitCommit != "" {
|
if gitCommit != "" {
|
||||||
fmt.Println("Git Commit:", gitCommit)
|
fmt.Println("Git Commit:", gitCommit)
|
||||||
}
|
}
|
||||||
|
6
vendor/github.com/ethereum/go-ethereum/cmd/geth/monitorcmd.go
generated
vendored
6
vendor/github.com/ethereum/go-ethereum/cmd/geth/monitorcmd.go
generated
vendored
@ -185,12 +185,12 @@ func resolveMetric(metrics map[string]interface{}, pattern string, path string)
|
|||||||
parts := strings.SplitN(pattern, "/", 2)
|
parts := strings.SplitN(pattern, "/", 2)
|
||||||
if len(parts) > 1 {
|
if len(parts) > 1 {
|
||||||
for _, variation := range strings.Split(parts[0], ",") {
|
for _, variation := range strings.Split(parts[0], ",") {
|
||||||
if submetrics, ok := metrics[variation].(map[string]interface{}); !ok {
|
submetrics, ok := metrics[variation].(map[string]interface{})
|
||||||
|
if !ok {
|
||||||
utils.Fatalf("Failed to retrieve system metrics: %s", path+variation)
|
utils.Fatalf("Failed to retrieve system metrics: %s", path+variation)
|
||||||
return nil
|
return nil
|
||||||
} else {
|
|
||||||
results = append(results, resolveMetric(submetrics, parts[1], path+variation+"/")...)
|
|
||||||
}
|
}
|
||||||
|
results = append(results, resolveMetric(submetrics, parts[1], path+variation+"/")...)
|
||||||
}
|
}
|
||||||
return results
|
return results
|
||||||
}
|
}
|
||||||
|
16
vendor/github.com/ethereum/go-ethereum/cmd/geth/usage.go
generated
vendored
16
vendor/github.com/ethereum/go-ethereum/cmd/geth/usage.go
generated
vendored
@ -83,7 +83,8 @@ var AppHelpFlagGroups = []flagGroup{
|
|||||||
utils.LightKDFFlag,
|
utils.LightKDFFlag,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{Name: "DEVELOPER CHAIN",
|
{
|
||||||
|
Name: "DEVELOPER CHAIN",
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
utils.DeveloperFlag,
|
utils.DeveloperFlag,
|
||||||
utils.DeveloperPeriodFlag,
|
utils.DeveloperPeriodFlag,
|
||||||
@ -206,11 +207,22 @@ var AppHelpFlagGroups = []flagGroup{
|
|||||||
{
|
{
|
||||||
Name: "LOGGING AND DEBUGGING",
|
Name: "LOGGING AND DEBUGGING",
|
||||||
Flags: append([]cli.Flag{
|
Flags: append([]cli.Flag{
|
||||||
utils.MetricsEnabledFlag,
|
|
||||||
utils.FakePoWFlag,
|
utils.FakePoWFlag,
|
||||||
utils.NoCompactionFlag,
|
utils.NoCompactionFlag,
|
||||||
}, debug.Flags...),
|
}, debug.Flags...),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "METRICS AND STATS",
|
||||||
|
Flags: []cli.Flag{
|
||||||
|
utils.MetricsEnabledFlag,
|
||||||
|
utils.MetricsEnableInfluxDBFlag,
|
||||||
|
utils.MetricsInfluxDBEndpointFlag,
|
||||||
|
utils.MetricsInfluxDBDatabaseFlag,
|
||||||
|
utils.MetricsInfluxDBUsernameFlag,
|
||||||
|
utils.MetricsInfluxDBPasswordFlag,
|
||||||
|
utils.MetricsInfluxDBHostTagFlag,
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Name: "WHISPER (EXPERIMENTAL)",
|
Name: "WHISPER (EXPERIMENTAL)",
|
||||||
Flags: whisperFlags,
|
Flags: whisperFlags,
|
||||||
|
10
vendor/github.com/ethereum/go-ethereum/cmd/p2psim/main.go
generated
vendored
10
vendor/github.com/ethereum/go-ethereum/cmd/p2psim/main.go
generated
vendored
@ -180,7 +180,10 @@ func main() {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
app.Run(os.Args)
|
if err := app.Run(os.Args); err != nil {
|
||||||
|
fmt.Fprintln(os.Stderr, err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func showNetwork(ctx *cli.Context) error {
|
func showNetwork(ctx *cli.Context) error {
|
||||||
@ -275,9 +278,8 @@ func createNode(ctx *cli.Context) error {
|
|||||||
if len(ctx.Args()) != 0 {
|
if len(ctx.Args()) != 0 {
|
||||||
return cli.ShowCommandHelp(ctx, ctx.Command.Name)
|
return cli.ShowCommandHelp(ctx, ctx.Command.Name)
|
||||||
}
|
}
|
||||||
config := &adapters.NodeConfig{
|
config := adapters.RandomNodeConfig()
|
||||||
Name: ctx.String("name"),
|
config.Name = ctx.String("name")
|
||||||
}
|
|
||||||
if key := ctx.String("key"); key != "" {
|
if key := ctx.String("key"); key != "" {
|
||||||
privKey, err := crypto.HexToECDSA(key)
|
privKey, err := crypto.HexToECDSA(key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
2
vendor/github.com/ethereum/go-ethereum/cmd/puppeth/module_ethstats.go
generated
vendored
2
vendor/github.com/ethereum/go-ethereum/cmd/puppeth/module_ethstats.go
generated
vendored
@ -122,7 +122,7 @@ func (info *ethstatsInfos) Report() map[string]string {
|
|||||||
"Website address": info.host,
|
"Website address": info.host,
|
||||||
"Website listener port": strconv.Itoa(info.port),
|
"Website listener port": strconv.Itoa(info.port),
|
||||||
"Login secret": info.secret,
|
"Login secret": info.secret,
|
||||||
"Banned addresses": fmt.Sprintf("%v", info.banned),
|
"Banned addresses": strings.Join(info.banned, "\n"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
vendor/github.com/ethereum/go-ethereum/cmd/puppeth/module_node.go
generated
vendored
2
vendor/github.com/ethereum/go-ethereum/cmd/puppeth/module_node.go
generated
vendored
@ -221,7 +221,7 @@ func checkNode(client *sshClient, network string, boot bool) (*nodeInfos, error)
|
|||||||
|
|
||||||
// Container available, retrieve its node ID and its genesis json
|
// Container available, retrieve its node ID and its genesis json
|
||||||
var out []byte
|
var out []byte
|
||||||
if out, err = client.Run(fmt.Sprintf("docker exec %s_%s_1 geth --exec admin.nodeInfo.id attach", network, kind)); err != nil {
|
if out, err = client.Run(fmt.Sprintf("docker exec %s_%s_1 geth --exec admin.nodeInfo.id --cache=16 attach", network, kind)); err != nil {
|
||||||
return nil, ErrServiceUnreachable
|
return nil, ErrServiceUnreachable
|
||||||
}
|
}
|
||||||
id := bytes.Trim(bytes.TrimSpace(out), "\"")
|
id := bytes.Trim(bytes.TrimSpace(out), "\"")
|
||||||
|
36
vendor/github.com/ethereum/go-ethereum/cmd/puppeth/wizard_netstats.go
generated
vendored
36
vendor/github.com/ethereum/go-ethereum/cmd/puppeth/wizard_netstats.go
generated
vendored
@ -203,7 +203,7 @@ func (stats serverStats) render() {
|
|||||||
|
|
||||||
table.SetHeader([]string{"Server", "Address", "Service", "Config", "Value"})
|
table.SetHeader([]string{"Server", "Address", "Service", "Config", "Value"})
|
||||||
table.SetAlignment(tablewriter.ALIGN_LEFT)
|
table.SetAlignment(tablewriter.ALIGN_LEFT)
|
||||||
table.SetColWidth(100)
|
table.SetColWidth(40)
|
||||||
|
|
||||||
// Find the longest lines for all columns for the hacked separator
|
// Find the longest lines for all columns for the hacked separator
|
||||||
separator := make([]string, 5)
|
separator := make([]string, 5)
|
||||||
@ -222,8 +222,10 @@ func (stats serverStats) render() {
|
|||||||
if len(config) > len(separator[3]) {
|
if len(config) > len(separator[3]) {
|
||||||
separator[3] = strings.Repeat("-", len(config))
|
separator[3] = strings.Repeat("-", len(config))
|
||||||
}
|
}
|
||||||
if len(value) > len(separator[4]) {
|
for _, val := range strings.Split(value, "\n") {
|
||||||
separator[4] = strings.Repeat("-", len(value))
|
if len(val) > len(separator[4]) {
|
||||||
|
separator[4] = strings.Repeat("-", len(val))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -263,26 +265,20 @@ func (stats serverStats) render() {
|
|||||||
sort.Strings(configs)
|
sort.Strings(configs)
|
||||||
|
|
||||||
for k, config := range configs {
|
for k, config := range configs {
|
||||||
switch {
|
for l, value := range strings.Split(stats[server].services[service][config], "\n") {
|
||||||
case j == 0 && k == 0:
|
switch {
|
||||||
table.Append([]string{server, stats[server].address, service, config, stats[server].services[service][config]})
|
case j == 0 && k == 0 && l == 0:
|
||||||
case k == 0:
|
table.Append([]string{server, stats[server].address, service, config, value})
|
||||||
table.Append([]string{"", "", service, config, stats[server].services[service][config]})
|
case k == 0 && l == 0:
|
||||||
default:
|
table.Append([]string{"", "", service, config, value})
|
||||||
table.Append([]string{"", "", "", config, stats[server].services[service][config]})
|
case l == 0:
|
||||||
|
table.Append([]string{"", "", "", config, value})
|
||||||
|
default:
|
||||||
|
table.Append([]string{"", "", "", "", value})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
table.Render()
|
table.Render()
|
||||||
}
|
}
|
||||||
|
|
||||||
// protips contains a collection of network infos to report pro-tips
|
|
||||||
// based on.
|
|
||||||
type protips struct {
|
|
||||||
genesis string
|
|
||||||
network int64
|
|
||||||
bootFull []string
|
|
||||||
bootLight []string
|
|
||||||
ethstats string
|
|
||||||
}
|
|
||||||
|
107
vendor/github.com/ethereum/go-ethereum/cmd/swarm/config.go
generated
vendored
107
vendor/github.com/ethereum/go-ethereum/cmd/swarm/config.go
generated
vendored
@ -24,6 +24,7 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
"unicode"
|
"unicode"
|
||||||
|
|
||||||
cli "gopkg.in/urfave/cli.v1"
|
cli "gopkg.in/urfave/cli.v1"
|
||||||
@ -58,19 +59,25 @@ var (
|
|||||||
|
|
||||||
//constants for environment variables
|
//constants for environment variables
|
||||||
const (
|
const (
|
||||||
SWARM_ENV_CHEQUEBOOK_ADDR = "SWARM_CHEQUEBOOK_ADDR"
|
SWARM_ENV_CHEQUEBOOK_ADDR = "SWARM_CHEQUEBOOK_ADDR"
|
||||||
SWARM_ENV_ACCOUNT = "SWARM_ACCOUNT"
|
SWARM_ENV_ACCOUNT = "SWARM_ACCOUNT"
|
||||||
SWARM_ENV_LISTEN_ADDR = "SWARM_LISTEN_ADDR"
|
SWARM_ENV_LISTEN_ADDR = "SWARM_LISTEN_ADDR"
|
||||||
SWARM_ENV_PORT = "SWARM_PORT"
|
SWARM_ENV_PORT = "SWARM_PORT"
|
||||||
SWARM_ENV_NETWORK_ID = "SWARM_NETWORK_ID"
|
SWARM_ENV_NETWORK_ID = "SWARM_NETWORK_ID"
|
||||||
SWARM_ENV_SWAP_ENABLE = "SWARM_SWAP_ENABLE"
|
SWARM_ENV_SWAP_ENABLE = "SWARM_SWAP_ENABLE"
|
||||||
SWARM_ENV_SWAP_API = "SWARM_SWAP_API"
|
SWARM_ENV_SWAP_API = "SWARM_SWAP_API"
|
||||||
SWARM_ENV_SYNC_ENABLE = "SWARM_SYNC_ENABLE"
|
SWARM_ENV_SYNC_DISABLE = "SWARM_SYNC_DISABLE"
|
||||||
SWARM_ENV_ENS_API = "SWARM_ENS_API"
|
SWARM_ENV_SYNC_UPDATE_DELAY = "SWARM_ENV_SYNC_UPDATE_DELAY"
|
||||||
SWARM_ENV_ENS_ADDR = "SWARM_ENS_ADDR"
|
SWARM_ENV_DELIVERY_SKIP_CHECK = "SWARM_DELIVERY_SKIP_CHECK"
|
||||||
SWARM_ENV_CORS = "SWARM_CORS"
|
SWARM_ENV_ENS_API = "SWARM_ENS_API"
|
||||||
SWARM_ENV_BOOTNODES = "SWARM_BOOTNODES"
|
SWARM_ENV_ENS_ADDR = "SWARM_ENS_ADDR"
|
||||||
GETH_ENV_DATADIR = "GETH_DATADIR"
|
SWARM_ENV_CORS = "SWARM_CORS"
|
||||||
|
SWARM_ENV_BOOTNODES = "SWARM_BOOTNODES"
|
||||||
|
SWARM_ENV_PSS_ENABLE = "SWARM_PSS_ENABLE"
|
||||||
|
SWARM_ENV_STORE_PATH = "SWARM_STORE_PATH"
|
||||||
|
SWARM_ENV_STORE_CAPACITY = "SWARM_STORE_CAPACITY"
|
||||||
|
SWARM_ENV_STORE_CACHE_CAPACITY = "SWARM_STORE_CACHE_CAPACITY"
|
||||||
|
GETH_ENV_DATADIR = "GETH_DATADIR"
|
||||||
)
|
)
|
||||||
|
|
||||||
// These settings ensure that TOML keys use the same names as Go struct fields.
|
// These settings ensure that TOML keys use the same names as Go struct fields.
|
||||||
@ -92,10 +99,8 @@ var tomlSettings = toml.Config{
|
|||||||
|
|
||||||
//before booting the swarm node, build the configuration
|
//before booting the swarm node, build the configuration
|
||||||
func buildConfig(ctx *cli.Context) (config *bzzapi.Config, err error) {
|
func buildConfig(ctx *cli.Context) (config *bzzapi.Config, err error) {
|
||||||
//check for deprecated flags
|
|
||||||
checkDeprecated(ctx)
|
|
||||||
//start by creating a default config
|
//start by creating a default config
|
||||||
config = bzzapi.NewDefaultConfig()
|
config = bzzapi.NewConfig()
|
||||||
//first load settings from config file (if provided)
|
//first load settings from config file (if provided)
|
||||||
config, err = configFileOverride(config, ctx)
|
config, err = configFileOverride(config, ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -168,7 +173,7 @@ func cmdLineOverride(currentConfig *bzzapi.Config, ctx *cli.Context) *bzzapi.Con
|
|||||||
|
|
||||||
if networkid := ctx.GlobalString(SwarmNetworkIdFlag.Name); networkid != "" {
|
if networkid := ctx.GlobalString(SwarmNetworkIdFlag.Name); networkid != "" {
|
||||||
if id, _ := strconv.Atoi(networkid); id != 0 {
|
if id, _ := strconv.Atoi(networkid); id != 0 {
|
||||||
currentConfig.NetworkId = uint64(id)
|
currentConfig.NetworkID = uint64(id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -191,12 +196,20 @@ func cmdLineOverride(currentConfig *bzzapi.Config, ctx *cli.Context) *bzzapi.Con
|
|||||||
currentConfig.SwapEnabled = true
|
currentConfig.SwapEnabled = true
|
||||||
}
|
}
|
||||||
|
|
||||||
if ctx.GlobalIsSet(SwarmSyncEnabledFlag.Name) {
|
if ctx.GlobalIsSet(SwarmSyncDisabledFlag.Name) {
|
||||||
currentConfig.SyncEnabled = true
|
currentConfig.SyncEnabled = false
|
||||||
}
|
}
|
||||||
|
|
||||||
currentConfig.SwapApi = ctx.GlobalString(SwarmSwapAPIFlag.Name)
|
if d := ctx.GlobalDuration(SwarmSyncUpdateDelay.Name); d > 0 {
|
||||||
if currentConfig.SwapEnabled && currentConfig.SwapApi == "" {
|
currentConfig.SyncUpdateDelay = d
|
||||||
|
}
|
||||||
|
|
||||||
|
if ctx.GlobalIsSet(SwarmDeliverySkipCheckFlag.Name) {
|
||||||
|
currentConfig.DeliverySkipCheck = true
|
||||||
|
}
|
||||||
|
|
||||||
|
currentConfig.SwapAPI = ctx.GlobalString(SwarmSwapAPIFlag.Name)
|
||||||
|
if currentConfig.SwapEnabled && currentConfig.SwapAPI == "" {
|
||||||
utils.Fatalf(SWARM_ERR_SWAP_SET_NO_API)
|
utils.Fatalf(SWARM_ERR_SWAP_SET_NO_API)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,10 +222,6 @@ func cmdLineOverride(currentConfig *bzzapi.Config, ctx *cli.Context) *bzzapi.Con
|
|||||||
currentConfig.EnsAPIs = ensAPIs
|
currentConfig.EnsAPIs = ensAPIs
|
||||||
}
|
}
|
||||||
|
|
||||||
if ensaddr := ctx.GlobalString(DeprecatedEnsAddrFlag.Name); ensaddr != "" {
|
|
||||||
currentConfig.EnsRoot = common.HexToAddress(ensaddr)
|
|
||||||
}
|
|
||||||
|
|
||||||
if cors := ctx.GlobalString(CorsStringFlag.Name); cors != "" {
|
if cors := ctx.GlobalString(CorsStringFlag.Name); cors != "" {
|
||||||
currentConfig.Cors = cors
|
currentConfig.Cors = cors
|
||||||
}
|
}
|
||||||
@ -221,6 +230,18 @@ func cmdLineOverride(currentConfig *bzzapi.Config, ctx *cli.Context) *bzzapi.Con
|
|||||||
currentConfig.BootNodes = ctx.GlobalString(utils.BootnodesFlag.Name)
|
currentConfig.BootNodes = ctx.GlobalString(utils.BootnodesFlag.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if storePath := ctx.GlobalString(SwarmStorePath.Name); storePath != "" {
|
||||||
|
currentConfig.LocalStoreParams.ChunkDbPath = storePath
|
||||||
|
}
|
||||||
|
|
||||||
|
if storeCapacity := ctx.GlobalUint64(SwarmStoreCapacity.Name); storeCapacity != 0 {
|
||||||
|
currentConfig.LocalStoreParams.DbCapacity = storeCapacity
|
||||||
|
}
|
||||||
|
|
||||||
|
if storeCacheCapacity := ctx.GlobalUint(SwarmStoreCacheCapacity.Name); storeCacheCapacity != 0 {
|
||||||
|
currentConfig.LocalStoreParams.CacheCapacity = storeCacheCapacity
|
||||||
|
}
|
||||||
|
|
||||||
return currentConfig
|
return currentConfig
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -239,7 +260,7 @@ func envVarsOverride(currentConfig *bzzapi.Config) (config *bzzapi.Config) {
|
|||||||
|
|
||||||
if networkid := os.Getenv(SWARM_ENV_NETWORK_ID); networkid != "" {
|
if networkid := os.Getenv(SWARM_ENV_NETWORK_ID); networkid != "" {
|
||||||
if id, _ := strconv.Atoi(networkid); id != 0 {
|
if id, _ := strconv.Atoi(networkid); id != 0 {
|
||||||
currentConfig.NetworkId = uint64(id)
|
currentConfig.NetworkID = uint64(id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -262,17 +283,29 @@ func envVarsOverride(currentConfig *bzzapi.Config) (config *bzzapi.Config) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if syncenable := os.Getenv(SWARM_ENV_SYNC_ENABLE); syncenable != "" {
|
if syncdisable := os.Getenv(SWARM_ENV_SYNC_DISABLE); syncdisable != "" {
|
||||||
if sync, err := strconv.ParseBool(syncenable); err != nil {
|
if sync, err := strconv.ParseBool(syncdisable); err != nil {
|
||||||
currentConfig.SyncEnabled = sync
|
currentConfig.SyncEnabled = !sync
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if v := os.Getenv(SWARM_ENV_DELIVERY_SKIP_CHECK); v != "" {
|
||||||
|
if skipCheck, err := strconv.ParseBool(v); err != nil {
|
||||||
|
currentConfig.DeliverySkipCheck = skipCheck
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if v := os.Getenv(SWARM_ENV_SYNC_UPDATE_DELAY); v != "" {
|
||||||
|
if d, err := time.ParseDuration(v); err != nil {
|
||||||
|
currentConfig.SyncUpdateDelay = d
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if swapapi := os.Getenv(SWARM_ENV_SWAP_API); swapapi != "" {
|
if swapapi := os.Getenv(SWARM_ENV_SWAP_API); swapapi != "" {
|
||||||
currentConfig.SwapApi = swapapi
|
currentConfig.SwapAPI = swapapi
|
||||||
}
|
}
|
||||||
|
|
||||||
if currentConfig.SwapEnabled && currentConfig.SwapApi == "" {
|
if currentConfig.SwapEnabled && currentConfig.SwapAPI == "" {
|
||||||
utils.Fatalf(SWARM_ERR_SWAP_SET_NO_API)
|
utils.Fatalf(SWARM_ERR_SWAP_SET_NO_API)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -312,18 +345,6 @@ func dumpConfig(ctx *cli.Context) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
//deprecated flags checked here
|
|
||||||
func checkDeprecated(ctx *cli.Context) {
|
|
||||||
// exit if the deprecated --ethapi flag is set
|
|
||||||
if ctx.GlobalString(DeprecatedEthAPIFlag.Name) != "" {
|
|
||||||
utils.Fatalf("--ethapi is no longer a valid command line flag, please use --ens-api and/or --swap-api.")
|
|
||||||
}
|
|
||||||
// warn if --ens-api flag is set
|
|
||||||
if ctx.GlobalString(DeprecatedEnsAddrFlag.Name) != "" {
|
|
||||||
log.Warn("--ens-addr is no longer a valid command line flag, please use --ens-api to specify contract address.")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//validate configuration parameters
|
//validate configuration parameters
|
||||||
func validateConfig(cfg *bzzapi.Config) (err error) {
|
func validateConfig(cfg *bzzapi.Config) (err error) {
|
||||||
for _, ensAPI := range cfg.EnsAPIs {
|
for _, ensAPI := range cfg.EnsAPIs {
|
||||||
|
28
vendor/github.com/ethereum/go-ethereum/cmd/swarm/db.go
generated
vendored
28
vendor/github.com/ethereum/go-ethereum/cmd/swarm/db.go
generated
vendored
@ -23,6 +23,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/cmd/utils"
|
"github.com/ethereum/go-ethereum/cmd/utils"
|
||||||
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/ethereum/go-ethereum/swarm/storage"
|
"github.com/ethereum/go-ethereum/swarm/storage"
|
||||||
"gopkg.in/urfave/cli.v1"
|
"gopkg.in/urfave/cli.v1"
|
||||||
@ -30,11 +31,11 @@ import (
|
|||||||
|
|
||||||
func dbExport(ctx *cli.Context) {
|
func dbExport(ctx *cli.Context) {
|
||||||
args := ctx.Args()
|
args := ctx.Args()
|
||||||
if len(args) != 2 {
|
if len(args) != 3 {
|
||||||
utils.Fatalf("invalid arguments, please specify both <chunkdb> (path to a local chunk database) and <file> (path to write the tar archive to, - for stdout)")
|
utils.Fatalf("invalid arguments, please specify both <chunkdb> (path to a local chunk database), <file> (path to write the tar archive to, - for stdout) and the base key")
|
||||||
}
|
}
|
||||||
|
|
||||||
store, err := openDbStore(args[0])
|
store, err := openLDBStore(args[0], common.Hex2Bytes(args[2]))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Fatalf("error opening local chunk database: %s", err)
|
utils.Fatalf("error opening local chunk database: %s", err)
|
||||||
}
|
}
|
||||||
@ -62,11 +63,11 @@ func dbExport(ctx *cli.Context) {
|
|||||||
|
|
||||||
func dbImport(ctx *cli.Context) {
|
func dbImport(ctx *cli.Context) {
|
||||||
args := ctx.Args()
|
args := ctx.Args()
|
||||||
if len(args) != 2 {
|
if len(args) != 3 {
|
||||||
utils.Fatalf("invalid arguments, please specify both <chunkdb> (path to a local chunk database) and <file> (path to read the tar archive from, - for stdin)")
|
utils.Fatalf("invalid arguments, please specify both <chunkdb> (path to a local chunk database), <file> (path to read the tar archive from, - for stdin) and the base key")
|
||||||
}
|
}
|
||||||
|
|
||||||
store, err := openDbStore(args[0])
|
store, err := openLDBStore(args[0], common.Hex2Bytes(args[2]))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Fatalf("error opening local chunk database: %s", err)
|
utils.Fatalf("error opening local chunk database: %s", err)
|
||||||
}
|
}
|
||||||
@ -94,11 +95,11 @@ func dbImport(ctx *cli.Context) {
|
|||||||
|
|
||||||
func dbClean(ctx *cli.Context) {
|
func dbClean(ctx *cli.Context) {
|
||||||
args := ctx.Args()
|
args := ctx.Args()
|
||||||
if len(args) != 1 {
|
if len(args) != 2 {
|
||||||
utils.Fatalf("invalid arguments, please specify <chunkdb> (path to a local chunk database)")
|
utils.Fatalf("invalid arguments, please specify <chunkdb> (path to a local chunk database) and the base key")
|
||||||
}
|
}
|
||||||
|
|
||||||
store, err := openDbStore(args[0])
|
store, err := openLDBStore(args[0], common.Hex2Bytes(args[1]))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Fatalf("error opening local chunk database: %s", err)
|
utils.Fatalf("error opening local chunk database: %s", err)
|
||||||
}
|
}
|
||||||
@ -107,10 +108,13 @@ func dbClean(ctx *cli.Context) {
|
|||||||
store.Cleanup()
|
store.Cleanup()
|
||||||
}
|
}
|
||||||
|
|
||||||
func openDbStore(path string) (*storage.DbStore, error) {
|
func openLDBStore(path string, basekey []byte) (*storage.LDBStore, error) {
|
||||||
if _, err := os.Stat(filepath.Join(path, "CURRENT")); err != nil {
|
if _, err := os.Stat(filepath.Join(path, "CURRENT")); err != nil {
|
||||||
return nil, fmt.Errorf("invalid chunkdb path: %s", err)
|
return nil, fmt.Errorf("invalid chunkdb path: %s", err)
|
||||||
}
|
}
|
||||||
hash := storage.MakeHashFunc("SHA3")
|
|
||||||
return storage.NewDbStore(path, hash, 10000000, 0)
|
storeparams := storage.NewDefaultStoreParams()
|
||||||
|
ldbparams := storage.NewLDBStoreParams(storeparams, path)
|
||||||
|
ldbparams.BaseKey = basekey
|
||||||
|
return storage.NewLDBStore(ldbparams)
|
||||||
}
|
}
|
||||||
|
85
vendor/github.com/ethereum/go-ethereum/cmd/swarm/download.go
generated
vendored
Normal file
85
vendor/github.com/ethereum/go-ethereum/cmd/swarm/download.go
generated
vendored
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
// Copyright 2018 The go-ethereum Authors
|
||||||
|
// This file is part of go-ethereum.
|
||||||
|
//
|
||||||
|
// go-ethereum is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// go-ethereum 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 General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/cmd/utils"
|
||||||
|
"github.com/ethereum/go-ethereum/log"
|
||||||
|
"github.com/ethereum/go-ethereum/swarm/api"
|
||||||
|
swarm "github.com/ethereum/go-ethereum/swarm/api/client"
|
||||||
|
"gopkg.in/urfave/cli.v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func download(ctx *cli.Context) {
|
||||||
|
log.Debug("downloading content using swarm down")
|
||||||
|
args := ctx.Args()
|
||||||
|
dest := "."
|
||||||
|
|
||||||
|
switch len(args) {
|
||||||
|
case 0:
|
||||||
|
utils.Fatalf("Usage: swarm down [options] <bzz locator> [<destination path>]")
|
||||||
|
case 1:
|
||||||
|
log.Trace(fmt.Sprintf("swarm down: no destination path - assuming working dir"))
|
||||||
|
default:
|
||||||
|
log.Trace(fmt.Sprintf("destination path arg: %s", args[1]))
|
||||||
|
if absDest, err := filepath.Abs(args[1]); err == nil {
|
||||||
|
dest = absDest
|
||||||
|
} else {
|
||||||
|
utils.Fatalf("could not get download path: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/")
|
||||||
|
isRecursive = ctx.Bool(SwarmRecursiveFlag.Name)
|
||||||
|
client = swarm.NewClient(bzzapi)
|
||||||
|
)
|
||||||
|
|
||||||
|
if fi, err := os.Stat(dest); err == nil {
|
||||||
|
if isRecursive && !fi.Mode().IsDir() {
|
||||||
|
utils.Fatalf("destination path is not a directory!")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if !os.IsNotExist(err) {
|
||||||
|
utils.Fatalf("could not stat path: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uri, err := api.Parse(args[0])
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("could not parse uri argument: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// assume behaviour according to --recursive switch
|
||||||
|
if isRecursive {
|
||||||
|
if err := client.DownloadDirectory(uri.Addr, uri.Path, dest); err != nil {
|
||||||
|
utils.Fatalf("encoutered an error while downloading directory: %v", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// we are downloading a file
|
||||||
|
log.Debug(fmt.Sprintf("downloading file/path from a manifest. hash: %s, path:%s", uri.Addr, uri.Path))
|
||||||
|
|
||||||
|
err := client.DownloadFile(uri.Addr, uri.Path, dest)
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("could not download %s from given address: %s. error: %v", uri.Path, uri.Addr, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
127
vendor/github.com/ethereum/go-ethereum/cmd/swarm/fs.go
generated
vendored
Normal file
127
vendor/github.com/ethereum/go-ethereum/cmd/swarm/fs.go
generated
vendored
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
// Copyright 2018 The go-ethereum Authors
|
||||||
|
// This file is part of go-ethereum.
|
||||||
|
//
|
||||||
|
// go-ethereum is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// go-ethereum 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 General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/cmd/utils"
|
||||||
|
"github.com/ethereum/go-ethereum/node"
|
||||||
|
"github.com/ethereum/go-ethereum/rpc"
|
||||||
|
"github.com/ethereum/go-ethereum/swarm/fuse"
|
||||||
|
"gopkg.in/urfave/cli.v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func mount(cliContext *cli.Context) {
|
||||||
|
args := cliContext.Args()
|
||||||
|
if len(args) < 2 {
|
||||||
|
utils.Fatalf("Usage: swarm fs mount --ipcpath <path to bzzd.ipc> <manifestHash> <file name>")
|
||||||
|
}
|
||||||
|
|
||||||
|
client, err := dialRPC(cliContext)
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("had an error dailing to RPC endpoint: %v", err)
|
||||||
|
}
|
||||||
|
defer client.Close()
|
||||||
|
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
mf := &fuse.MountInfo{}
|
||||||
|
mountPoint, err := filepath.Abs(filepath.Clean(args[1]))
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("error expanding path for mount point: %v", err)
|
||||||
|
}
|
||||||
|
err = client.CallContext(ctx, mf, "swarmfs_mount", args[0], mountPoint)
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("had an error calling the RPC endpoint while mounting: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func unmount(cliContext *cli.Context) {
|
||||||
|
args := cliContext.Args()
|
||||||
|
|
||||||
|
if len(args) < 1 {
|
||||||
|
utils.Fatalf("Usage: swarm fs unmount --ipcpath <path to bzzd.ipc> <mount path>")
|
||||||
|
}
|
||||||
|
client, err := dialRPC(cliContext)
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("had an error dailing to RPC endpoint: %v", err)
|
||||||
|
}
|
||||||
|
defer client.Close()
|
||||||
|
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
mf := fuse.MountInfo{}
|
||||||
|
err = client.CallContext(ctx, &mf, "swarmfs_unmount", args[0])
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("encountered an error calling the RPC endpoint while unmounting: %v", err)
|
||||||
|
}
|
||||||
|
fmt.Printf("%s\n", mf.LatestManifest) //print the latest manifest hash for user reference
|
||||||
|
}
|
||||||
|
|
||||||
|
func listMounts(cliContext *cli.Context) {
|
||||||
|
client, err := dialRPC(cliContext)
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("had an error dailing to RPC endpoint: %v", err)
|
||||||
|
}
|
||||||
|
defer client.Close()
|
||||||
|
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
mf := []fuse.MountInfo{}
|
||||||
|
err = client.CallContext(ctx, &mf, "swarmfs_listmounts")
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("encountered an error calling the RPC endpoint while unmounting: %v", err)
|
||||||
|
}
|
||||||
|
if len(mf) == 0 {
|
||||||
|
fmt.Print("Could not found any swarmfs mounts. Please make sure you've specified the correct RPC endpoint\n")
|
||||||
|
} else {
|
||||||
|
fmt.Printf("Found %d swarmfs mount(s):\n", len(mf))
|
||||||
|
for i, mountInfo := range mf {
|
||||||
|
fmt.Printf("%d:\n", i)
|
||||||
|
fmt.Printf("\tMount point: %s\n", mountInfo.MountPoint)
|
||||||
|
fmt.Printf("\tLatest Manifest: %s\n", mountInfo.LatestManifest)
|
||||||
|
fmt.Printf("\tStart Manifest: %s\n", mountInfo.StartManifest)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func dialRPC(ctx *cli.Context) (*rpc.Client, error) {
|
||||||
|
var endpoint string
|
||||||
|
|
||||||
|
if ctx.IsSet(utils.IPCPathFlag.Name) {
|
||||||
|
endpoint = ctx.String(utils.IPCPathFlag.Name)
|
||||||
|
} else {
|
||||||
|
utils.Fatalf("swarm ipc endpoint not specified")
|
||||||
|
}
|
||||||
|
|
||||||
|
if endpoint == "" {
|
||||||
|
endpoint = node.DefaultIPCEndpoint(clientIdentifier)
|
||||||
|
} else if strings.HasPrefix(endpoint, "rpc:") || strings.HasPrefix(endpoint, "ipc:") {
|
||||||
|
// Backwards compatibility with geth < 1.5 which required
|
||||||
|
// these prefixes.
|
||||||
|
endpoint = endpoint[4:]
|
||||||
|
}
|
||||||
|
return rpc.Dial(endpoint)
|
||||||
|
}
|
7
vendor/github.com/ethereum/go-ethereum/cmd/swarm/hash.go
generated
vendored
7
vendor/github.com/ethereum/go-ethereum/cmd/swarm/hash.go
generated
vendored
@ -18,6 +18,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
@ -38,11 +39,11 @@ func hash(ctx *cli.Context) {
|
|||||||
defer f.Close()
|
defer f.Close()
|
||||||
|
|
||||||
stat, _ := f.Stat()
|
stat, _ := f.Stat()
|
||||||
chunker := storage.NewTreeChunker(storage.NewChunkerParams())
|
fileStore := storage.NewFileStore(storage.NewMapChunkStore(), storage.NewFileStoreParams())
|
||||||
key, err := chunker.Split(f, stat.Size(), nil, nil, nil)
|
addr, _, err := fileStore.Store(context.TODO(), f, stat.Size(), false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Fatalf("%v\n", err)
|
utils.Fatalf("%v\n", err)
|
||||||
} else {
|
} else {
|
||||||
fmt.Printf("%v\n", key)
|
fmt.Printf("%v\n", addr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
433
vendor/github.com/ethereum/go-ethereum/cmd/swarm/main.go
generated
vendored
433
vendor/github.com/ethereum/go-ethereum/cmd/swarm/main.go
generated
vendored
@ -34,21 +34,37 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/console"
|
"github.com/ethereum/go-ethereum/console"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/ethereum/go-ethereum/ethclient"
|
|
||||||
"github.com/ethereum/go-ethereum/internal/debug"
|
"github.com/ethereum/go-ethereum/internal/debug"
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/ethereum/go-ethereum/node"
|
"github.com/ethereum/go-ethereum/node"
|
||||||
"github.com/ethereum/go-ethereum/p2p"
|
"github.com/ethereum/go-ethereum/p2p"
|
||||||
"github.com/ethereum/go-ethereum/p2p/discover"
|
"github.com/ethereum/go-ethereum/p2p/discover"
|
||||||
"github.com/ethereum/go-ethereum/params"
|
|
||||||
"github.com/ethereum/go-ethereum/swarm"
|
"github.com/ethereum/go-ethereum/swarm"
|
||||||
bzzapi "github.com/ethereum/go-ethereum/swarm/api"
|
bzzapi "github.com/ethereum/go-ethereum/swarm/api"
|
||||||
swarmmetrics "github.com/ethereum/go-ethereum/swarm/metrics"
|
swarmmetrics "github.com/ethereum/go-ethereum/swarm/metrics"
|
||||||
|
"github.com/ethereum/go-ethereum/swarm/tracing"
|
||||||
|
sv "github.com/ethereum/go-ethereum/swarm/version"
|
||||||
|
|
||||||
"gopkg.in/urfave/cli.v1"
|
"gopkg.in/urfave/cli.v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
const clientIdentifier = "swarm"
|
const clientIdentifier = "swarm"
|
||||||
|
const helpTemplate = `NAME:
|
||||||
|
{{.HelpName}} - {{.Usage}}
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
{{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Category}}
|
||||||
|
|
||||||
|
CATEGORY:
|
||||||
|
{{.Category}}{{end}}{{if .Description}}
|
||||||
|
|
||||||
|
DESCRIPTION:
|
||||||
|
{{.Description}}{{end}}{{if .VisibleFlags}}
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
{{range .VisibleFlags}}{{.}}
|
||||||
|
{{end}}{{end}}
|
||||||
|
`
|
||||||
|
|
||||||
var (
|
var (
|
||||||
gitCommit string // Git SHA1 commit hash of the release (set via linker flags)
|
gitCommit string // Git SHA1 commit hash of the release (set via linker flags)
|
||||||
@ -87,10 +103,6 @@ var (
|
|||||||
Usage: "Network identifier (integer, default 3=swarm testnet)",
|
Usage: "Network identifier (integer, default 3=swarm testnet)",
|
||||||
EnvVar: SWARM_ENV_NETWORK_ID,
|
EnvVar: SWARM_ENV_NETWORK_ID,
|
||||||
}
|
}
|
||||||
SwarmConfigPathFlag = cli.StringFlag{
|
|
||||||
Name: "bzzconfig",
|
|
||||||
Usage: "DEPRECATED: please use --config path/to/TOML-file",
|
|
||||||
}
|
|
||||||
SwarmSwapEnabledFlag = cli.BoolFlag{
|
SwarmSwapEnabledFlag = cli.BoolFlag{
|
||||||
Name: "swap",
|
Name: "swap",
|
||||||
Usage: "Swarm SWAP enabled (default false)",
|
Usage: "Swarm SWAP enabled (default false)",
|
||||||
@ -101,10 +113,20 @@ var (
|
|||||||
Usage: "URL of the Ethereum API provider to use to settle SWAP payments",
|
Usage: "URL of the Ethereum API provider to use to settle SWAP payments",
|
||||||
EnvVar: SWARM_ENV_SWAP_API,
|
EnvVar: SWARM_ENV_SWAP_API,
|
||||||
}
|
}
|
||||||
SwarmSyncEnabledFlag = cli.BoolTFlag{
|
SwarmSyncDisabledFlag = cli.BoolTFlag{
|
||||||
Name: "sync",
|
Name: "nosync",
|
||||||
Usage: "Swarm Syncing enabled (default true)",
|
Usage: "Disable swarm syncing",
|
||||||
EnvVar: SWARM_ENV_SYNC_ENABLE,
|
EnvVar: SWARM_ENV_SYNC_DISABLE,
|
||||||
|
}
|
||||||
|
SwarmSyncUpdateDelay = cli.DurationFlag{
|
||||||
|
Name: "sync-update-delay",
|
||||||
|
Usage: "Duration for sync subscriptions update after no new peers are added (default 15s)",
|
||||||
|
EnvVar: SWARM_ENV_SYNC_UPDATE_DELAY,
|
||||||
|
}
|
||||||
|
SwarmDeliverySkipCheckFlag = cli.BoolFlag{
|
||||||
|
Name: "delivery-skip-check",
|
||||||
|
Usage: "Skip chunk delivery check (default false)",
|
||||||
|
EnvVar: SWARM_ENV_DELIVERY_SKIP_CHECK,
|
||||||
}
|
}
|
||||||
EnsAPIFlag = cli.StringSliceFlag{
|
EnsAPIFlag = cli.StringSliceFlag{
|
||||||
Name: "ens-api",
|
Name: "ens-api",
|
||||||
@ -116,13 +138,13 @@ var (
|
|||||||
Usage: "Swarm HTTP endpoint",
|
Usage: "Swarm HTTP endpoint",
|
||||||
Value: "http://127.0.0.1:8500",
|
Value: "http://127.0.0.1:8500",
|
||||||
}
|
}
|
||||||
SwarmRecursiveUploadFlag = cli.BoolFlag{
|
SwarmRecursiveFlag = cli.BoolFlag{
|
||||||
Name: "recursive",
|
Name: "recursive",
|
||||||
Usage: "Upload directories recursively",
|
Usage: "Upload directories recursively",
|
||||||
}
|
}
|
||||||
SwarmWantManifestFlag = cli.BoolTFlag{
|
SwarmWantManifestFlag = cli.BoolTFlag{
|
||||||
Name: "manifest",
|
Name: "manifest",
|
||||||
Usage: "Automatic manifest upload",
|
Usage: "Automatic manifest upload (default true)",
|
||||||
}
|
}
|
||||||
SwarmUploadDefaultPath = cli.StringFlag{
|
SwarmUploadDefaultPath = cli.StringFlag{
|
||||||
Name: "defaultpath",
|
Name: "defaultpath",
|
||||||
@ -134,22 +156,43 @@ var (
|
|||||||
}
|
}
|
||||||
SwarmUploadMimeType = cli.StringFlag{
|
SwarmUploadMimeType = cli.StringFlag{
|
||||||
Name: "mime",
|
Name: "mime",
|
||||||
Usage: "force mime type",
|
Usage: "Manually specify MIME type",
|
||||||
|
}
|
||||||
|
SwarmEncryptedFlag = cli.BoolFlag{
|
||||||
|
Name: "encrypt",
|
||||||
|
Usage: "use encrypted upload",
|
||||||
}
|
}
|
||||||
CorsStringFlag = cli.StringFlag{
|
CorsStringFlag = cli.StringFlag{
|
||||||
Name: "corsdomain",
|
Name: "corsdomain",
|
||||||
Usage: "Domain on which to send Access-Control-Allow-Origin header (multiple domains can be supplied separated by a ',')",
|
Usage: "Domain on which to send Access-Control-Allow-Origin header (multiple domains can be supplied separated by a ',')",
|
||||||
EnvVar: SWARM_ENV_CORS,
|
EnvVar: SWARM_ENV_CORS,
|
||||||
}
|
}
|
||||||
|
SwarmStorePath = cli.StringFlag{
|
||||||
// the following flags are deprecated and should be removed in the future
|
Name: "store.path",
|
||||||
DeprecatedEthAPIFlag = cli.StringFlag{
|
Usage: "Path to leveldb chunk DB (default <$GETH_ENV_DIR>/swarm/bzz-<$BZZ_KEY>/chunks)",
|
||||||
Name: "ethapi",
|
EnvVar: SWARM_ENV_STORE_PATH,
|
||||||
Usage: "DEPRECATED: please use --ens-api and --swap-api",
|
|
||||||
}
|
}
|
||||||
DeprecatedEnsAddrFlag = cli.StringFlag{
|
SwarmStoreCapacity = cli.Uint64Flag{
|
||||||
Name: "ens-addr",
|
Name: "store.size",
|
||||||
Usage: "DEPRECATED: ENS contract address, please use --ens-api with contract address according to its format",
|
Usage: "Number of chunks (5M is roughly 20-25GB) (default 5000000)",
|
||||||
|
EnvVar: SWARM_ENV_STORE_CAPACITY,
|
||||||
|
}
|
||||||
|
SwarmStoreCacheCapacity = cli.UintFlag{
|
||||||
|
Name: "store.cache.size",
|
||||||
|
Usage: "Number of recent chunks cached in memory (default 5000)",
|
||||||
|
EnvVar: SWARM_ENV_STORE_CACHE_CAPACITY,
|
||||||
|
}
|
||||||
|
SwarmResourceMultihashFlag = cli.BoolFlag{
|
||||||
|
Name: "multihash",
|
||||||
|
Usage: "Determines how to interpret data for a resource update. If not present, data will be interpreted as raw, literal data that will be included in the resource",
|
||||||
|
}
|
||||||
|
SwarmResourceNameFlag = cli.StringFlag{
|
||||||
|
Name: "name",
|
||||||
|
Usage: "User-defined name for the new resource",
|
||||||
|
}
|
||||||
|
SwarmResourceDataOnCreateFlag = cli.StringFlag{
|
||||||
|
Name: "data",
|
||||||
|
Usage: "Initializes the resource with the given hex-encoded data. Data must be prefixed by 0x",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -159,12 +202,21 @@ var (
|
|||||||
SWARM_ERR_SWAP_SET_NO_API = "SWAP is enabled but --swap-api is not set"
|
SWARM_ERR_SWAP_SET_NO_API = "SWAP is enabled but --swap-api is not set"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// this help command gets added to any subcommand that does not define it explicitly
|
||||||
|
var defaultSubcommandHelp = cli.Command{
|
||||||
|
Action: func(ctx *cli.Context) { cli.ShowCommandHelpAndExit(ctx, "", 1) },
|
||||||
|
CustomHelpTemplate: helpTemplate,
|
||||||
|
Name: "help",
|
||||||
|
Usage: "shows this help",
|
||||||
|
Hidden: true,
|
||||||
|
}
|
||||||
|
|
||||||
var defaultNodeConfig = node.DefaultConfig
|
var defaultNodeConfig = node.DefaultConfig
|
||||||
|
|
||||||
// This init function sets defaults so cmd/swarm can run alongside geth.
|
// This init function sets defaults so cmd/swarm can run alongside geth.
|
||||||
func init() {
|
func init() {
|
||||||
defaultNodeConfig.Name = clientIdentifier
|
defaultNodeConfig.Name = clientIdentifier
|
||||||
defaultNodeConfig.Version = params.VersionWithCommit(gitCommit)
|
defaultNodeConfig.Version = sv.VersionWithCommit(gitCommit)
|
||||||
defaultNodeConfig.P2P.ListenAddr = ":30399"
|
defaultNodeConfig.P2P.ListenAddr = ":30399"
|
||||||
defaultNodeConfig.IPCPath = "bzzd.ipc"
|
defaultNodeConfig.IPCPath = "bzzd.ipc"
|
||||||
// Set flag defaults for --help display.
|
// Set flag defaults for --help display.
|
||||||
@ -180,91 +232,165 @@ func init() {
|
|||||||
app.Copyright = "Copyright 2013-2016 The go-ethereum Authors"
|
app.Copyright = "Copyright 2013-2016 The go-ethereum Authors"
|
||||||
app.Commands = []cli.Command{
|
app.Commands = []cli.Command{
|
||||||
{
|
{
|
||||||
Action: version,
|
Action: version,
|
||||||
Name: "version",
|
CustomHelpTemplate: helpTemplate,
|
||||||
Usage: "Print version numbers",
|
Name: "version",
|
||||||
ArgsUsage: " ",
|
Usage: "Print version numbers",
|
||||||
Description: `
|
Description: "The output of this command is supposed to be machine-readable",
|
||||||
The output of this command is supposed to be machine-readable.
|
|
||||||
`,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Action: upload,
|
Action: upload,
|
||||||
Name: "up",
|
CustomHelpTemplate: helpTemplate,
|
||||||
Usage: "upload a file or directory to swarm using the HTTP API",
|
Name: "up",
|
||||||
ArgsUsage: " <file>",
|
Usage: "uploads a file or directory to swarm using the HTTP API",
|
||||||
Description: `
|
ArgsUsage: "<file>",
|
||||||
"upload a file or directory to swarm using the HTTP API and prints the root hash",
|
Flags: []cli.Flag{SwarmEncryptedFlag},
|
||||||
`,
|
Description: "uploads a file or directory to swarm using the HTTP API and prints the root hash",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Action: list,
|
CustomHelpTemplate: helpTemplate,
|
||||||
Name: "ls",
|
Name: "resource",
|
||||||
Usage: "list files and directories contained in a manifest",
|
Usage: "(Advanced) Create and update Mutable Resources",
|
||||||
ArgsUsage: " <manifest> [<prefix>]",
|
ArgsUsage: "<create|update|info>",
|
||||||
Description: `
|
Description: "Works with Mutable Resource Updates",
|
||||||
Lists files and directories contained in a manifest.
|
|
||||||
`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Action: hash,
|
|
||||||
Name: "hash",
|
|
||||||
Usage: "print the swarm hash of a file or directory",
|
|
||||||
ArgsUsage: " <file>",
|
|
||||||
Description: `
|
|
||||||
Prints the swarm hash of file or directory.
|
|
||||||
`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Name: "manifest",
|
|
||||||
Usage: "update a MANIFEST",
|
|
||||||
ArgsUsage: "manifest COMMAND",
|
|
||||||
Description: `
|
|
||||||
Updates a MANIFEST by adding/removing/updating the hash of a path.
|
|
||||||
`,
|
|
||||||
Subcommands: []cli.Command{
|
Subcommands: []cli.Command{
|
||||||
{
|
{
|
||||||
Action: add,
|
Action: resourceCreate,
|
||||||
Name: "add",
|
CustomHelpTemplate: helpTemplate,
|
||||||
Usage: "add a new path to the manifest",
|
Name: "create",
|
||||||
ArgsUsage: "<MANIFEST> <path> <hash> [<content-type>]",
|
Usage: "creates a new Mutable Resource",
|
||||||
Description: `
|
ArgsUsage: "<frequency>",
|
||||||
Adds a new path to the manifest
|
Description: "creates a new Mutable Resource",
|
||||||
`,
|
Flags: []cli.Flag{SwarmResourceNameFlag, SwarmResourceDataOnCreateFlag, SwarmResourceMultihashFlag},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Action: update,
|
Action: resourceUpdate,
|
||||||
Name: "update",
|
CustomHelpTemplate: helpTemplate,
|
||||||
Usage: "update the hash for an already existing path in the manifest",
|
Name: "update",
|
||||||
ArgsUsage: "<MANIFEST> <path> <newhash> [<newcontent-type>]",
|
Usage: "updates the content of an existing Mutable Resource",
|
||||||
Description: `
|
ArgsUsage: "<Manifest Address or ENS domain> <0x Hex data>",
|
||||||
Update the hash for an already existing path in the manifest
|
Description: "updates the content of an existing Mutable Resource",
|
||||||
`,
|
Flags: []cli.Flag{SwarmResourceMultihashFlag},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Action: remove,
|
Action: resourceInfo,
|
||||||
Name: "remove",
|
CustomHelpTemplate: helpTemplate,
|
||||||
Usage: "removes a path from the manifest",
|
Name: "info",
|
||||||
ArgsUsage: "<MANIFEST> <path>",
|
Usage: "obtains information about an existing Mutable Resource",
|
||||||
Description: `
|
ArgsUsage: "<Manifest Address or ENS domain>",
|
||||||
Removes a path from the manifest
|
Description: "obtains information about an existing Mutable Resource",
|
||||||
`,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "db",
|
Action: list,
|
||||||
Usage: "manage the local chunk database",
|
CustomHelpTemplate: helpTemplate,
|
||||||
ArgsUsage: "db COMMAND",
|
Name: "ls",
|
||||||
|
Usage: "list files and directories contained in a manifest",
|
||||||
|
ArgsUsage: "<manifest> [<prefix>]",
|
||||||
|
Description: "Lists files and directories contained in a manifest",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Action: hash,
|
||||||
|
CustomHelpTemplate: helpTemplate,
|
||||||
|
Name: "hash",
|
||||||
|
Usage: "print the swarm hash of a file or directory",
|
||||||
|
ArgsUsage: "<file>",
|
||||||
|
Description: "Prints the swarm hash of file or directory",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Action: download,
|
||||||
|
Name: "down",
|
||||||
|
Flags: []cli.Flag{SwarmRecursiveFlag},
|
||||||
|
Usage: "downloads a swarm manifest or a file inside a manifest",
|
||||||
|
ArgsUsage: " <uri> [<dir>]",
|
||||||
Description: `
|
Description: `
|
||||||
Manage the local chunk database.
|
Downloads a swarm bzz uri to the given dir. When no dir is provided, working directory is assumed. --recursive flag is expected when downloading a manifest with multiple entries.
|
||||||
`,
|
`,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
Name: "manifest",
|
||||||
|
CustomHelpTemplate: helpTemplate,
|
||||||
|
Usage: "perform operations on swarm manifests",
|
||||||
|
ArgsUsage: "COMMAND",
|
||||||
|
Description: "Updates a MANIFEST by adding/removing/updating the hash of a path.\nCOMMAND could be: add, update, remove",
|
||||||
Subcommands: []cli.Command{
|
Subcommands: []cli.Command{
|
||||||
{
|
{
|
||||||
Action: dbExport,
|
Action: add,
|
||||||
Name: "export",
|
CustomHelpTemplate: helpTemplate,
|
||||||
Usage: "export a local chunk database as a tar archive (use - to send to stdout)",
|
Name: "add",
|
||||||
ArgsUsage: "<chunkdb> <file>",
|
Usage: "add a new path to the manifest",
|
||||||
|
ArgsUsage: "<MANIFEST> <path> <hash> [<content-type>]",
|
||||||
|
Description: "Adds a new path to the manifest",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Action: update,
|
||||||
|
CustomHelpTemplate: helpTemplate,
|
||||||
|
Name: "update",
|
||||||
|
Usage: "update the hash for an already existing path in the manifest",
|
||||||
|
ArgsUsage: "<MANIFEST> <path> <newhash> [<newcontent-type>]",
|
||||||
|
Description: "Update the hash for an already existing path in the manifest",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Action: remove,
|
||||||
|
CustomHelpTemplate: helpTemplate,
|
||||||
|
Name: "remove",
|
||||||
|
Usage: "removes a path from the manifest",
|
||||||
|
ArgsUsage: "<MANIFEST> <path>",
|
||||||
|
Description: "Removes a path from the manifest",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "fs",
|
||||||
|
CustomHelpTemplate: helpTemplate,
|
||||||
|
Usage: "perform FUSE operations",
|
||||||
|
ArgsUsage: "fs COMMAND",
|
||||||
|
Description: "Performs FUSE operations by mounting/unmounting/listing mount points. This assumes you already have a Swarm node running locally. For all operation you must reference the correct path to bzzd.ipc in order to communicate with the node",
|
||||||
|
Subcommands: []cli.Command{
|
||||||
|
{
|
||||||
|
Action: mount,
|
||||||
|
CustomHelpTemplate: helpTemplate,
|
||||||
|
Name: "mount",
|
||||||
|
Flags: []cli.Flag{utils.IPCPathFlag},
|
||||||
|
Usage: "mount a swarm hash to a mount point",
|
||||||
|
ArgsUsage: "swarm fs mount --ipcpath <path to bzzd.ipc> <manifest hash> <mount point>",
|
||||||
|
Description: "Mounts a Swarm manifest hash to a given mount point. This assumes you already have a Swarm node running locally. You must reference the correct path to your bzzd.ipc file",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Action: unmount,
|
||||||
|
CustomHelpTemplate: helpTemplate,
|
||||||
|
Name: "unmount",
|
||||||
|
Flags: []cli.Flag{utils.IPCPathFlag},
|
||||||
|
Usage: "unmount a swarmfs mount",
|
||||||
|
ArgsUsage: "swarm fs unmount --ipcpath <path to bzzd.ipc> <mount point>",
|
||||||
|
Description: "Unmounts a swarmfs mount residing at <mount point>. This assumes you already have a Swarm node running locally. You must reference the correct path to your bzzd.ipc file",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Action: listMounts,
|
||||||
|
CustomHelpTemplate: helpTemplate,
|
||||||
|
Name: "list",
|
||||||
|
Flags: []cli.Flag{utils.IPCPathFlag},
|
||||||
|
Usage: "list swarmfs mounts",
|
||||||
|
ArgsUsage: "swarm fs list --ipcpath <path to bzzd.ipc>",
|
||||||
|
Description: "Lists all mounted swarmfs volumes. This assumes you already have a Swarm node running locally. You must reference the correct path to your bzzd.ipc file",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "db",
|
||||||
|
CustomHelpTemplate: helpTemplate,
|
||||||
|
Usage: "manage the local chunk database",
|
||||||
|
ArgsUsage: "db COMMAND",
|
||||||
|
Description: "Manage the local chunk database",
|
||||||
|
Subcommands: []cli.Command{
|
||||||
|
{
|
||||||
|
Action: dbExport,
|
||||||
|
CustomHelpTemplate: helpTemplate,
|
||||||
|
Name: "export",
|
||||||
|
Usage: "export a local chunk database as a tar archive (use - to send to stdout)",
|
||||||
|
ArgsUsage: "<chunkdb> <file>",
|
||||||
Description: `
|
Description: `
|
||||||
Export a local chunk database as a tar archive (use - to send to stdout).
|
Export a local chunk database as a tar archive (use - to send to stdout).
|
||||||
|
|
||||||
@ -277,10 +403,11 @@ pv(1) tool to get a progress bar:
|
|||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Action: dbImport,
|
Action: dbImport,
|
||||||
Name: "import",
|
CustomHelpTemplate: helpTemplate,
|
||||||
Usage: "import chunks from a tar archive into a local chunk database (use - to read from stdin)",
|
Name: "import",
|
||||||
ArgsUsage: "<chunkdb> <file>",
|
Usage: "import chunks from a tar archive into a local chunk database (use - to read from stdin)",
|
||||||
|
ArgsUsage: "<chunkdb> <file>",
|
||||||
Description: `
|
Description: `
|
||||||
Import chunks from a tar archive into a local chunk database (use - to read from stdin).
|
Import chunks from a tar archive into a local chunk database (use - to read from stdin).
|
||||||
|
|
||||||
@ -293,30 +420,24 @@ pv(1) tool to get a progress bar:
|
|||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Action: dbClean,
|
Action: dbClean,
|
||||||
Name: "clean",
|
CustomHelpTemplate: helpTemplate,
|
||||||
Usage: "remove corrupt entries from a local chunk database",
|
Name: "clean",
|
||||||
ArgsUsage: "<chunkdb>",
|
Usage: "remove corrupt entries from a local chunk database",
|
||||||
Description: `
|
ArgsUsage: "<chunkdb>",
|
||||||
Remove corrupt entries from a local chunk database.
|
Description: "Remove corrupt entries from a local chunk database",
|
||||||
`,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
Action: func(ctx *cli.Context) {
|
|
||||||
utils.Fatalf("ERROR: 'swarm cleandb' has been removed, please use 'swarm db clean'.")
|
|
||||||
},
|
|
||||||
Name: "cleandb",
|
|
||||||
Usage: "DEPRECATED: use 'swarm db clean'",
|
|
||||||
ArgsUsage: " ",
|
|
||||||
Description: `
|
|
||||||
DEPRECATED: use 'swarm db clean'.
|
|
||||||
`,
|
|
||||||
},
|
|
||||||
// See config.go
|
// See config.go
|
||||||
DumpConfigCommand,
|
DumpConfigCommand,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// append a hidden help subcommand to all commands that have subcommands
|
||||||
|
// if a help command was already defined above, that one will take precedence.
|
||||||
|
addDefaultHelpSubcommands(app.Commands)
|
||||||
|
|
||||||
sort.Sort(cli.CommandsByName(app.Commands))
|
sort.Sort(cli.CommandsByName(app.Commands))
|
||||||
|
|
||||||
app.Flags = []cli.Flag{
|
app.Flags = []cli.Flag{
|
||||||
@ -339,10 +460,11 @@ DEPRECATED: use 'swarm db clean'.
|
|||||||
CorsStringFlag,
|
CorsStringFlag,
|
||||||
EnsAPIFlag,
|
EnsAPIFlag,
|
||||||
SwarmTomlConfigPathFlag,
|
SwarmTomlConfigPathFlag,
|
||||||
SwarmConfigPathFlag,
|
|
||||||
SwarmSwapEnabledFlag,
|
SwarmSwapEnabledFlag,
|
||||||
SwarmSwapAPIFlag,
|
SwarmSwapAPIFlag,
|
||||||
SwarmSyncEnabledFlag,
|
SwarmSyncDisabledFlag,
|
||||||
|
SwarmSyncUpdateDelay,
|
||||||
|
SwarmDeliverySkipCheckFlag,
|
||||||
SwarmListenAddrFlag,
|
SwarmListenAddrFlag,
|
||||||
SwarmPortFlag,
|
SwarmPortFlag,
|
||||||
SwarmAccountFlag,
|
SwarmAccountFlag,
|
||||||
@ -350,23 +472,34 @@ DEPRECATED: use 'swarm db clean'.
|
|||||||
ChequebookAddrFlag,
|
ChequebookAddrFlag,
|
||||||
// upload flags
|
// upload flags
|
||||||
SwarmApiFlag,
|
SwarmApiFlag,
|
||||||
SwarmRecursiveUploadFlag,
|
SwarmRecursiveFlag,
|
||||||
SwarmWantManifestFlag,
|
SwarmWantManifestFlag,
|
||||||
SwarmUploadDefaultPath,
|
SwarmUploadDefaultPath,
|
||||||
SwarmUpFromStdinFlag,
|
SwarmUpFromStdinFlag,
|
||||||
SwarmUploadMimeType,
|
SwarmUploadMimeType,
|
||||||
//deprecated flags
|
// storage flags
|
||||||
DeprecatedEthAPIFlag,
|
SwarmStorePath,
|
||||||
DeprecatedEnsAddrFlag,
|
SwarmStoreCapacity,
|
||||||
|
SwarmStoreCacheCapacity,
|
||||||
}
|
}
|
||||||
|
rpcFlags := []cli.Flag{
|
||||||
|
utils.WSEnabledFlag,
|
||||||
|
utils.WSListenAddrFlag,
|
||||||
|
utils.WSPortFlag,
|
||||||
|
utils.WSApiFlag,
|
||||||
|
utils.WSAllowedOriginsFlag,
|
||||||
|
}
|
||||||
|
app.Flags = append(app.Flags, rpcFlags...)
|
||||||
app.Flags = append(app.Flags, debug.Flags...)
|
app.Flags = append(app.Flags, debug.Flags...)
|
||||||
app.Flags = append(app.Flags, swarmmetrics.Flags...)
|
app.Flags = append(app.Flags, swarmmetrics.Flags...)
|
||||||
|
app.Flags = append(app.Flags, tracing.Flags...)
|
||||||
app.Before = func(ctx *cli.Context) error {
|
app.Before = func(ctx *cli.Context) error {
|
||||||
runtime.GOMAXPROCS(runtime.NumCPU())
|
runtime.GOMAXPROCS(runtime.NumCPU())
|
||||||
if err := debug.Setup(ctx); err != nil {
|
if err := debug.Setup(ctx, ""); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
swarmmetrics.Setup(ctx)
|
swarmmetrics.Setup(ctx)
|
||||||
|
tracing.Setup(ctx)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
app.After = func(ctx *cli.Context) error {
|
app.After = func(ctx *cli.Context) error {
|
||||||
@ -384,15 +517,12 @@ func main() {
|
|||||||
|
|
||||||
func version(ctx *cli.Context) error {
|
func version(ctx *cli.Context) error {
|
||||||
fmt.Println(strings.Title(clientIdentifier))
|
fmt.Println(strings.Title(clientIdentifier))
|
||||||
fmt.Println("Version:", params.Version)
|
fmt.Println("Version:", sv.VersionWithMeta)
|
||||||
if gitCommit != "" {
|
if gitCommit != "" {
|
||||||
fmt.Println("Git Commit:", gitCommit)
|
fmt.Println("Git Commit:", gitCommit)
|
||||||
}
|
}
|
||||||
fmt.Println("Network Id:", ctx.GlobalInt(utils.NetworkIdFlag.Name))
|
|
||||||
fmt.Println("Go Version:", runtime.Version())
|
fmt.Println("Go Version:", runtime.Version())
|
||||||
fmt.Println("OS:", runtime.GOOS)
|
fmt.Println("OS:", runtime.GOOS)
|
||||||
fmt.Printf("GOPATH=%s\n", os.Getenv("GOPATH"))
|
|
||||||
fmt.Printf("GOROOT=%s\n", runtime.GOROOT())
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -405,6 +535,10 @@ func bzzd(ctx *cli.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cfg := defaultNodeConfig
|
cfg := defaultNodeConfig
|
||||||
|
|
||||||
|
//pss operates on ws
|
||||||
|
cfg.WSModules = append(cfg.WSModules, "pss")
|
||||||
|
|
||||||
//geth only supports --datadir via command line
|
//geth only supports --datadir via command line
|
||||||
//in order to be consistent within swarm, if we pass --datadir via environment variable
|
//in order to be consistent within swarm, if we pass --datadir via environment variable
|
||||||
//or via config file, we get the same directory for geth and swarm
|
//or via config file, we get the same directory for geth and swarm
|
||||||
@ -421,7 +555,7 @@ func bzzd(ctx *cli.Context) error {
|
|||||||
//due to overriding behavior
|
//due to overriding behavior
|
||||||
initSwarmNode(bzzconfig, stack, ctx)
|
initSwarmNode(bzzconfig, stack, ctx)
|
||||||
//register BZZ as node.Service in the ethereum node
|
//register BZZ as node.Service in the ethereum node
|
||||||
registerBzzService(bzzconfig, ctx, stack)
|
registerBzzService(bzzconfig, stack)
|
||||||
//start the node
|
//start the node
|
||||||
utils.StartNode(stack)
|
utils.StartNode(stack)
|
||||||
|
|
||||||
@ -439,7 +573,7 @@ func bzzd(ctx *cli.Context) error {
|
|||||||
bootnodes := strings.Split(bzzconfig.BootNodes, ",")
|
bootnodes := strings.Split(bzzconfig.BootNodes, ",")
|
||||||
injectBootnodes(stack.Server(), bootnodes)
|
injectBootnodes(stack.Server(), bootnodes)
|
||||||
} else {
|
} else {
|
||||||
if bzzconfig.NetworkId == 3 {
|
if bzzconfig.NetworkID == 3 {
|
||||||
injectBootnodes(stack.Server(), testbetBootNodes)
|
injectBootnodes(stack.Server(), testbetBootNodes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -448,21 +582,11 @@ func bzzd(ctx *cli.Context) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func registerBzzService(bzzconfig *bzzapi.Config, ctx *cli.Context, stack *node.Node) {
|
func registerBzzService(bzzconfig *bzzapi.Config, stack *node.Node) {
|
||||||
|
|
||||||
//define the swarm service boot function
|
//define the swarm service boot function
|
||||||
boot := func(ctx *node.ServiceContext) (node.Service, error) {
|
boot := func(_ *node.ServiceContext) (node.Service, error) {
|
||||||
var swapClient *ethclient.Client
|
// In production, mockStore must be always nil.
|
||||||
var err error
|
return swarm.NewSwarm(bzzconfig, nil)
|
||||||
if bzzconfig.SwapApi != "" {
|
|
||||||
log.Info("connecting to SWAP API", "url", bzzconfig.SwapApi)
|
|
||||||
swapClient, err = ethclient.Dial(bzzconfig.SwapApi)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("error connecting to SWAP API %s: %s", bzzconfig.SwapApi, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return swarm.NewSwarm(ctx, swapClient, bzzconfig)
|
|
||||||
}
|
}
|
||||||
//register within the ethereum node
|
//register within the ethereum node
|
||||||
if err := stack.Register(boot); err != nil {
|
if err := stack.Register(boot); err != nil {
|
||||||
@ -487,6 +611,26 @@ func getAccount(bzzaccount string, ctx *cli.Context, stack *node.Node) *ecdsa.Pr
|
|||||||
return decryptStoreAccount(ks, bzzaccount, utils.MakePasswordList(ctx))
|
return decryptStoreAccount(ks, bzzaccount, utils.MakePasswordList(ctx))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getPrivKey returns the private key of the specified bzzaccount
|
||||||
|
// Used only by client commands, such as `resource`
|
||||||
|
func getPrivKey(ctx *cli.Context) *ecdsa.PrivateKey {
|
||||||
|
// booting up the swarm node just as we do in bzzd action
|
||||||
|
bzzconfig, err := buildConfig(ctx)
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("unable to configure swarm: %v", err)
|
||||||
|
}
|
||||||
|
cfg := defaultNodeConfig
|
||||||
|
if _, err := os.Stat(bzzconfig.Path); err == nil {
|
||||||
|
cfg.DataDir = bzzconfig.Path
|
||||||
|
}
|
||||||
|
utils.SetNodeConfig(ctx, &cfg)
|
||||||
|
stack, err := node.New(&cfg)
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("can't create node: %v", err)
|
||||||
|
}
|
||||||
|
return getAccount(bzzconfig.BzzAccount, ctx, stack)
|
||||||
|
}
|
||||||
|
|
||||||
func decryptStoreAccount(ks *keystore.KeyStore, account string, passwords []string) *ecdsa.PrivateKey {
|
func decryptStoreAccount(ks *keystore.KeyStore, account string, passwords []string) *ecdsa.PrivateKey {
|
||||||
var a accounts.Account
|
var a accounts.Account
|
||||||
var err error
|
var err error
|
||||||
@ -551,3 +695,16 @@ func injectBootnodes(srv *p2p.Server, nodes []string) {
|
|||||||
srv.AddPeer(n)
|
srv.AddPeer(n)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// addDefaultHelpSubcommand scans through defined CLI commands and adds
|
||||||
|
// a basic help subcommand to each
|
||||||
|
// if a help command is already defined, it will take precedence over the default.
|
||||||
|
func addDefaultHelpSubcommands(commands []cli.Command) {
|
||||||
|
for i := range commands {
|
||||||
|
cmd := &commands[i]
|
||||||
|
if cmd.Subcommands != nil {
|
||||||
|
cmd.Subcommands = append(cmd.Subcommands, defaultSubcommandHelp)
|
||||||
|
addDefaultHelpSubcommands(cmd.Subcommands)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
14
vendor/github.com/ethereum/go-ethereum/cmd/swarm/manifest.go
generated
vendored
14
vendor/github.com/ethereum/go-ethereum/cmd/swarm/manifest.go
generated
vendored
@ -131,13 +131,13 @@ func addEntryToManifest(ctx *cli.Context, mhash, path, hash, ctype string) strin
|
|||||||
longestPathEntry = api.ManifestEntry{}
|
longestPathEntry = api.ManifestEntry{}
|
||||||
)
|
)
|
||||||
|
|
||||||
mroot, err := client.DownloadManifest(mhash)
|
mroot, isEncrypted, err := client.DownloadManifest(mhash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Fatalf("Manifest download failed: %v", err)
|
utils.Fatalf("Manifest download failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: check if the "hash" to add is valid and present in swarm
|
//TODO: check if the "hash" to add is valid and present in swarm
|
||||||
_, err = client.DownloadManifest(hash)
|
_, _, err = client.DownloadManifest(hash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Fatalf("Hash to add is not present: %v", err)
|
utils.Fatalf("Hash to add is not present: %v", err)
|
||||||
}
|
}
|
||||||
@ -180,7 +180,7 @@ func addEntryToManifest(ctx *cli.Context, mhash, path, hash, ctype string) strin
|
|||||||
mroot.Entries = append(mroot.Entries, newEntry)
|
mroot.Entries = append(mroot.Entries, newEntry)
|
||||||
}
|
}
|
||||||
|
|
||||||
newManifestHash, err := client.UploadManifest(mroot)
|
newManifestHash, err := client.UploadManifest(mroot, isEncrypted)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Fatalf("Manifest upload failed: %v", err)
|
utils.Fatalf("Manifest upload failed: %v", err)
|
||||||
}
|
}
|
||||||
@ -197,7 +197,7 @@ func updateEntryInManifest(ctx *cli.Context, mhash, path, hash, ctype string) st
|
|||||||
longestPathEntry = api.ManifestEntry{}
|
longestPathEntry = api.ManifestEntry{}
|
||||||
)
|
)
|
||||||
|
|
||||||
mroot, err := client.DownloadManifest(mhash)
|
mroot, isEncrypted, err := client.DownloadManifest(mhash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Fatalf("Manifest download failed: %v", err)
|
utils.Fatalf("Manifest download failed: %v", err)
|
||||||
}
|
}
|
||||||
@ -257,7 +257,7 @@ func updateEntryInManifest(ctx *cli.Context, mhash, path, hash, ctype string) st
|
|||||||
mroot = newMRoot
|
mroot = newMRoot
|
||||||
}
|
}
|
||||||
|
|
||||||
newManifestHash, err := client.UploadManifest(mroot)
|
newManifestHash, err := client.UploadManifest(mroot, isEncrypted)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Fatalf("Manifest upload failed: %v", err)
|
utils.Fatalf("Manifest upload failed: %v", err)
|
||||||
}
|
}
|
||||||
@ -273,7 +273,7 @@ func removeEntryFromManifest(ctx *cli.Context, mhash, path string) string {
|
|||||||
longestPathEntry = api.ManifestEntry{}
|
longestPathEntry = api.ManifestEntry{}
|
||||||
)
|
)
|
||||||
|
|
||||||
mroot, err := client.DownloadManifest(mhash)
|
mroot, isEncrypted, err := client.DownloadManifest(mhash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Fatalf("Manifest download failed: %v", err)
|
utils.Fatalf("Manifest download failed: %v", err)
|
||||||
}
|
}
|
||||||
@ -323,7 +323,7 @@ func removeEntryFromManifest(ctx *cli.Context, mhash, path string) string {
|
|||||||
mroot = newMRoot
|
mroot = newMRoot
|
||||||
}
|
}
|
||||||
|
|
||||||
newManifestHash, err := client.UploadManifest(mroot)
|
newManifestHash, err := client.UploadManifest(mroot, isEncrypted)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Fatalf("Manifest upload failed: %v", err)
|
utils.Fatalf("Manifest upload failed: %v", err)
|
||||||
}
|
}
|
||||||
|
169
vendor/github.com/ethereum/go-ethereum/cmd/swarm/mru.go
generated
vendored
Normal file
169
vendor/github.com/ethereum/go-ethereum/cmd/swarm/mru.go
generated
vendored
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
// Copyright 2016 The go-ethereum Authors
|
||||||
|
// This file is part of go-ethereum.
|
||||||
|
//
|
||||||
|
// go-ethereum is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// go-ethereum 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 General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
// Command resource allows the user to create and update signed mutable resource updates
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/cmd/utils"
|
||||||
|
swarm "github.com/ethereum/go-ethereum/swarm/api/client"
|
||||||
|
"github.com/ethereum/go-ethereum/swarm/storage/mru"
|
||||||
|
"gopkg.in/urfave/cli.v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewGenericSigner(ctx *cli.Context) mru.Signer {
|
||||||
|
return mru.NewGenericSigner(getPrivKey(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
// swarm resource create <frequency> [--name <name>] [--data <0x Hexdata> [--multihash=false]]
|
||||||
|
// swarm resource update <Manifest Address or ENS domain> <0x Hexdata> [--multihash=false]
|
||||||
|
// swarm resource info <Manifest Address or ENS domain>
|
||||||
|
|
||||||
|
func resourceCreate(ctx *cli.Context) {
|
||||||
|
args := ctx.Args()
|
||||||
|
|
||||||
|
var (
|
||||||
|
bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/")
|
||||||
|
client = swarm.NewClient(bzzapi)
|
||||||
|
multihash = ctx.Bool(SwarmResourceMultihashFlag.Name)
|
||||||
|
initialData = ctx.String(SwarmResourceDataOnCreateFlag.Name)
|
||||||
|
name = ctx.String(SwarmResourceNameFlag.Name)
|
||||||
|
)
|
||||||
|
|
||||||
|
if len(args) < 1 {
|
||||||
|
fmt.Println("Incorrect number of arguments")
|
||||||
|
cli.ShowCommandHelpAndExit(ctx, "create", 1)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
signer := NewGenericSigner(ctx)
|
||||||
|
frequency, err := strconv.ParseUint(args[0], 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Frequency formatting error: %s\n", err.Error())
|
||||||
|
cli.ShowCommandHelpAndExit(ctx, "create", 1)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
metadata := mru.ResourceMetadata{
|
||||||
|
Name: name,
|
||||||
|
Frequency: frequency,
|
||||||
|
Owner: signer.Address(),
|
||||||
|
}
|
||||||
|
|
||||||
|
var newResourceRequest *mru.Request
|
||||||
|
if initialData != "" {
|
||||||
|
initialDataBytes, err := hexutil.Decode(initialData)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Error parsing data: %s\n", err.Error())
|
||||||
|
cli.ShowCommandHelpAndExit(ctx, "create", 1)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
newResourceRequest, err = mru.NewCreateUpdateRequest(&metadata)
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("Error creating new resource request: %s", err)
|
||||||
|
}
|
||||||
|
newResourceRequest.SetData(initialDataBytes, multihash)
|
||||||
|
if err = newResourceRequest.Sign(signer); err != nil {
|
||||||
|
utils.Fatalf("Error signing resource update: %s", err.Error())
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
newResourceRequest, err = mru.NewCreateRequest(&metadata)
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("Error creating new resource request: %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
manifestAddress, err := client.CreateResource(newResourceRequest)
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("Error creating resource: %s", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println(manifestAddress) // output manifest address to the user in a single line (useful for other commands to pick up)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func resourceUpdate(ctx *cli.Context) {
|
||||||
|
args := ctx.Args()
|
||||||
|
|
||||||
|
var (
|
||||||
|
bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/")
|
||||||
|
client = swarm.NewClient(bzzapi)
|
||||||
|
multihash = ctx.Bool(SwarmResourceMultihashFlag.Name)
|
||||||
|
)
|
||||||
|
|
||||||
|
if len(args) < 2 {
|
||||||
|
fmt.Println("Incorrect number of arguments")
|
||||||
|
cli.ShowCommandHelpAndExit(ctx, "update", 1)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
signer := NewGenericSigner(ctx)
|
||||||
|
manifestAddressOrDomain := args[0]
|
||||||
|
data, err := hexutil.Decode(args[1])
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("Error parsing data: %s", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve resource status and metadata out of the manifest
|
||||||
|
updateRequest, err := client.GetResourceMetadata(manifestAddressOrDomain)
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("Error retrieving resource status: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
// set the new data
|
||||||
|
updateRequest.SetData(data, multihash)
|
||||||
|
|
||||||
|
// sign update
|
||||||
|
if err = updateRequest.Sign(signer); err != nil {
|
||||||
|
utils.Fatalf("Error signing resource update: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
// post update
|
||||||
|
err = client.UpdateResource(updateRequest)
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("Error updating resource: %s", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func resourceInfo(ctx *cli.Context) {
|
||||||
|
var (
|
||||||
|
bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/")
|
||||||
|
client = swarm.NewClient(bzzapi)
|
||||||
|
)
|
||||||
|
args := ctx.Args()
|
||||||
|
if len(args) < 1 {
|
||||||
|
fmt.Println("Incorrect number of arguments.")
|
||||||
|
cli.ShowCommandHelpAndExit(ctx, "info", 1)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
manifestAddressOrDomain := args[0]
|
||||||
|
metadata, err := client.GetResourceMetadata(manifestAddressOrDomain)
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("Error retrieving resource metadata: %s", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
encodedMetadata, err := metadata.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
utils.Fatalf("Error encoding metadata to JSON for display:%s", err)
|
||||||
|
}
|
||||||
|
fmt.Println(string(encodedMetadata))
|
||||||
|
}
|
101
vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/main.go
generated
vendored
Normal file
101
vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/main.go
generated
vendored
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
// Copyright 2018 The go-ethereum Authors
|
||||||
|
// This file is part of go-ethereum.
|
||||||
|
//
|
||||||
|
// go-ethereum is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// go-ethereum 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 General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"sort"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/log"
|
||||||
|
colorable "github.com/mattn/go-colorable"
|
||||||
|
|
||||||
|
cli "gopkg.in/urfave/cli.v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
endpoints []string
|
||||||
|
includeLocalhost bool
|
||||||
|
cluster string
|
||||||
|
scheme string
|
||||||
|
filesize int
|
||||||
|
from int
|
||||||
|
to int
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
log.PrintOrigins(true)
|
||||||
|
log.Root().SetHandler(log.LvlFilterHandler(log.LvlTrace, log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true))))
|
||||||
|
|
||||||
|
app := cli.NewApp()
|
||||||
|
app.Name = "smoke-test"
|
||||||
|
app.Usage = ""
|
||||||
|
|
||||||
|
app.Flags = []cli.Flag{
|
||||||
|
cli.StringFlag{
|
||||||
|
Name: "cluster-endpoint",
|
||||||
|
Value: "testing",
|
||||||
|
Usage: "cluster to point to (open, or testing)",
|
||||||
|
Destination: &cluster,
|
||||||
|
},
|
||||||
|
cli.IntFlag{
|
||||||
|
Name: "cluster-from",
|
||||||
|
Value: 8501,
|
||||||
|
Usage: "swarm node (from)",
|
||||||
|
Destination: &from,
|
||||||
|
},
|
||||||
|
cli.IntFlag{
|
||||||
|
Name: "cluster-to",
|
||||||
|
Value: 8512,
|
||||||
|
Usage: "swarm node (to)",
|
||||||
|
Destination: &to,
|
||||||
|
},
|
||||||
|
cli.StringFlag{
|
||||||
|
Name: "cluster-scheme",
|
||||||
|
Value: "http",
|
||||||
|
Usage: "http or https",
|
||||||
|
Destination: &scheme,
|
||||||
|
},
|
||||||
|
cli.BoolFlag{
|
||||||
|
Name: "include-localhost",
|
||||||
|
Usage: "whether to include localhost:8500 as an endpoint",
|
||||||
|
Destination: &includeLocalhost,
|
||||||
|
},
|
||||||
|
cli.IntFlag{
|
||||||
|
Name: "filesize",
|
||||||
|
Value: 1,
|
||||||
|
Usage: "file size for generated random file in MB",
|
||||||
|
Destination: &filesize,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
app.Commands = []cli.Command{
|
||||||
|
{
|
||||||
|
Name: "upload_and_sync",
|
||||||
|
Aliases: []string{"c"},
|
||||||
|
Usage: "upload and sync",
|
||||||
|
Action: cliUploadAndSync,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.Sort(cli.FlagsByName(app.Flags))
|
||||||
|
sort.Sort(cli.CommandsByName(app.Commands))
|
||||||
|
|
||||||
|
err := app.Run(os.Args)
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err.Error())
|
||||||
|
}
|
||||||
|
}
|
191
vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/upload_and_sync.go
generated
vendored
Normal file
191
vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/upload_and_sync.go
generated
vendored
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
// Copyright 2018 The go-ethereum Authors
|
||||||
|
// This file is part of go-ethereum.
|
||||||
|
//
|
||||||
|
// go-ethereum is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// go-ethereum 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 General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"crypto/md5"
|
||||||
|
"crypto/rand"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/log"
|
||||||
|
"github.com/pborman/uuid"
|
||||||
|
|
||||||
|
cli "gopkg.in/urfave/cli.v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func generateEndpoints(scheme string, cluster string, from int, to int) {
|
||||||
|
if cluster == "prod" {
|
||||||
|
cluster = ""
|
||||||
|
} else {
|
||||||
|
cluster = cluster + "."
|
||||||
|
}
|
||||||
|
|
||||||
|
for port := from; port <= to; port++ {
|
||||||
|
endpoints = append(endpoints, fmt.Sprintf("%s://%v.%sswarm-gateways.net", scheme, port, cluster))
|
||||||
|
}
|
||||||
|
|
||||||
|
if includeLocalhost {
|
||||||
|
endpoints = append(endpoints, "http://localhost:8500")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func cliUploadAndSync(c *cli.Context) error {
|
||||||
|
defer func(now time.Time) { log.Info("total time", "time", time.Since(now), "size", filesize) }(time.Now())
|
||||||
|
|
||||||
|
generateEndpoints(scheme, cluster, from, to)
|
||||||
|
|
||||||
|
log.Info("uploading to " + endpoints[0] + " and syncing")
|
||||||
|
|
||||||
|
f, cleanup := generateRandomFile(filesize * 1000000)
|
||||||
|
defer cleanup()
|
||||||
|
|
||||||
|
hash, err := upload(f, endpoints[0])
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err.Error())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fhash, err := digest(f)
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err.Error())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info("uploaded successfully", "hash", hash, "digest", fmt.Sprintf("%x", fhash))
|
||||||
|
|
||||||
|
if filesize < 10 {
|
||||||
|
time.Sleep(35 * time.Second)
|
||||||
|
} else {
|
||||||
|
time.Sleep(15 * time.Second)
|
||||||
|
time.Sleep(2 * time.Duration(filesize) * time.Second)
|
||||||
|
}
|
||||||
|
|
||||||
|
wg := sync.WaitGroup{}
|
||||||
|
for _, endpoint := range endpoints {
|
||||||
|
endpoint := endpoint
|
||||||
|
ruid := uuid.New()[:8]
|
||||||
|
wg.Add(1)
|
||||||
|
go func(endpoint string, ruid string) {
|
||||||
|
for {
|
||||||
|
err := fetch(hash, endpoint, fhash, ruid)
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
wg.Done()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}(endpoint, ruid)
|
||||||
|
}
|
||||||
|
wg.Wait()
|
||||||
|
log.Info("all endpoints synced random file successfully")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// fetch is getting the requested `hash` from the `endpoint` and compares it with the `original` file
|
||||||
|
func fetch(hash string, endpoint string, original []byte, ruid string) error {
|
||||||
|
log.Trace("sleeping", "ruid", ruid)
|
||||||
|
time.Sleep(5 * time.Second)
|
||||||
|
|
||||||
|
log.Trace("http get request", "ruid", ruid, "api", endpoint, "hash", hash)
|
||||||
|
res, err := http.Get(endpoint + "/bzz:/" + hash + "/")
|
||||||
|
if err != nil {
|
||||||
|
log.Warn(err.Error(), "ruid", ruid)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
log.Trace("http get response", "ruid", ruid, "api", endpoint, "hash", hash, "code", res.StatusCode, "len", res.ContentLength)
|
||||||
|
|
||||||
|
if res.StatusCode != 200 {
|
||||||
|
err := fmt.Errorf("expected status code %d, got %v", 200, res.StatusCode)
|
||||||
|
log.Warn(err.Error(), "ruid", ruid)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer res.Body.Close()
|
||||||
|
|
||||||
|
rdigest, err := digest(res.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Warn(err.Error(), "ruid", ruid)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !bytes.Equal(rdigest, original) {
|
||||||
|
err := fmt.Errorf("downloaded imported file md5=%x is not the same as the generated one=%x", rdigest, original)
|
||||||
|
log.Warn(err.Error(), "ruid", ruid)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Trace("downloaded file matches random file", "ruid", ruid, "len", res.ContentLength)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// upload is uploading a file `f` to `endpoint` via the `swarm up` cmd
|
||||||
|
func upload(f *os.File, endpoint string) (string, error) {
|
||||||
|
var out bytes.Buffer
|
||||||
|
cmd := exec.Command("swarm", "--bzzapi", endpoint, "up", f.Name())
|
||||||
|
cmd.Stdout = &out
|
||||||
|
err := cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
hash := strings.TrimRight(out.String(), "\r\n")
|
||||||
|
return hash, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func digest(r io.Reader) ([]byte, error) {
|
||||||
|
h := md5.New()
|
||||||
|
_, err := io.Copy(h, r)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return h.Sum(nil), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// generateRandomFile is creating a temporary file with the requested byte size
|
||||||
|
func generateRandomFile(size int) (f *os.File, teardown func()) {
|
||||||
|
// create a tmp file
|
||||||
|
tmp, err := ioutil.TempFile("", "swarm-test")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// callback for tmp file cleanup
|
||||||
|
teardown = func() {
|
||||||
|
tmp.Close()
|
||||||
|
os.Remove(tmp.Name())
|
||||||
|
}
|
||||||
|
|
||||||
|
buf := make([]byte, size)
|
||||||
|
_, err = rand.Read(buf)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
ioutil.WriteFile(tmp.Name(), buf, 0755)
|
||||||
|
|
||||||
|
return tmp, teardown
|
||||||
|
}
|
9
vendor/github.com/ethereum/go-ethereum/cmd/swarm/upload.go
generated
vendored
9
vendor/github.com/ethereum/go-ethereum/cmd/swarm/upload.go
generated
vendored
@ -40,12 +40,13 @@ func upload(ctx *cli.Context) {
|
|||||||
args := ctx.Args()
|
args := ctx.Args()
|
||||||
var (
|
var (
|
||||||
bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/")
|
bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/")
|
||||||
recursive = ctx.GlobalBool(SwarmRecursiveUploadFlag.Name)
|
recursive = ctx.GlobalBool(SwarmRecursiveFlag.Name)
|
||||||
wantManifest = ctx.GlobalBoolT(SwarmWantManifestFlag.Name)
|
wantManifest = ctx.GlobalBoolT(SwarmWantManifestFlag.Name)
|
||||||
defaultPath = ctx.GlobalString(SwarmUploadDefaultPath.Name)
|
defaultPath = ctx.GlobalString(SwarmUploadDefaultPath.Name)
|
||||||
fromStdin = ctx.GlobalBool(SwarmUpFromStdinFlag.Name)
|
fromStdin = ctx.GlobalBool(SwarmUpFromStdinFlag.Name)
|
||||||
mimeType = ctx.GlobalString(SwarmUploadMimeType.Name)
|
mimeType = ctx.GlobalString(SwarmUploadMimeType.Name)
|
||||||
client = swarm.NewClient(bzzapi)
|
client = swarm.NewClient(bzzapi)
|
||||||
|
toEncrypt = ctx.Bool(SwarmEncryptedFlag.Name)
|
||||||
file string
|
file string
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -76,7 +77,7 @@ func upload(ctx *cli.Context) {
|
|||||||
utils.Fatalf("Error opening file: %s", err)
|
utils.Fatalf("Error opening file: %s", err)
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
hash, err := client.UploadRaw(f, f.Size)
|
hash, err := client.UploadRaw(f, f.Size, toEncrypt)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Fatalf("Upload failed: %s", err)
|
utils.Fatalf("Upload failed: %s", err)
|
||||||
}
|
}
|
||||||
@ -97,7 +98,7 @@ func upload(ctx *cli.Context) {
|
|||||||
if !recursive {
|
if !recursive {
|
||||||
return "", errors.New("Argument is a directory and recursive upload is disabled")
|
return "", errors.New("Argument is a directory and recursive upload is disabled")
|
||||||
}
|
}
|
||||||
return client.UploadDirectory(file, defaultPath, "")
|
return client.UploadDirectory(file, defaultPath, "", toEncrypt)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
doUpload = func() (string, error) {
|
doUpload = func() (string, error) {
|
||||||
@ -110,7 +111,7 @@ func upload(ctx *cli.Context) {
|
|||||||
mimeType = detectMimeType(file)
|
mimeType = detectMimeType(file)
|
||||||
}
|
}
|
||||||
f.ContentType = mimeType
|
f.ContentType = mimeType
|
||||||
return client.Upload(f, "")
|
return client.Upload(f, "", toEncrypt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
hash, err := doUpload()
|
hash, err := doUpload()
|
||||||
|
82
vendor/github.com/ethereum/go-ethereum/cmd/utils/flags.go
generated
vendored
82
vendor/github.com/ethereum/go-ethereum/cmd/utils/flags.go
generated
vendored
@ -27,6 +27,7 @@ import (
|
|||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/accounts"
|
"github.com/ethereum/go-ethereum/accounts"
|
||||||
"github.com/ethereum/go-ethereum/accounts/keystore"
|
"github.com/ethereum/go-ethereum/accounts/keystore"
|
||||||
@ -48,6 +49,7 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/les"
|
"github.com/ethereum/go-ethereum/les"
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/ethereum/go-ethereum/metrics"
|
"github.com/ethereum/go-ethereum/metrics"
|
||||||
|
"github.com/ethereum/go-ethereum/metrics/influxdb"
|
||||||
"github.com/ethereum/go-ethereum/node"
|
"github.com/ethereum/go-ethereum/node"
|
||||||
"github.com/ethereum/go-ethereum/p2p"
|
"github.com/ethereum/go-ethereum/p2p"
|
||||||
"github.com/ethereum/go-ethereum/p2p/discover"
|
"github.com/ethereum/go-ethereum/p2p/discover"
|
||||||
@ -96,7 +98,7 @@ func NewApp(gitCommit, usage string) *cli.App {
|
|||||||
app.Author = ""
|
app.Author = ""
|
||||||
//app.Authors = nil
|
//app.Authors = nil
|
||||||
app.Email = ""
|
app.Email = ""
|
||||||
app.Version = params.Version
|
app.Version = params.VersionWithMeta
|
||||||
if len(gitCommit) >= 8 {
|
if len(gitCommit) >= 8 {
|
||||||
app.Version += "-" + gitCommit[:8]
|
app.Version += "-" + gitCommit[:8]
|
||||||
}
|
}
|
||||||
@ -191,7 +193,7 @@ var (
|
|||||||
}
|
}
|
||||||
// Dashboard settings
|
// Dashboard settings
|
||||||
DashboardEnabledFlag = cli.BoolFlag{
|
DashboardEnabledFlag = cli.BoolFlag{
|
||||||
Name: "dashboard",
|
Name: metrics.DashboardEnabledFlag,
|
||||||
Usage: "Enable the dashboard",
|
Usage: "Enable the dashboard",
|
||||||
}
|
}
|
||||||
DashboardAddrFlag = cli.StringFlag{
|
DashboardAddrFlag = cli.StringFlag{
|
||||||
@ -360,10 +362,6 @@ var (
|
|||||||
Name: "ethstats",
|
Name: "ethstats",
|
||||||
Usage: "Reporting URL of a ethstats service (nodename:secret@host:port)",
|
Usage: "Reporting URL of a ethstats service (nodename:secret@host:port)",
|
||||||
}
|
}
|
||||||
MetricsEnabledFlag = cli.BoolFlag{
|
|
||||||
Name: metrics.MetricsEnabledFlag,
|
|
||||||
Usage: "Enable metrics collection and reporting",
|
|
||||||
}
|
|
||||||
FakePoWFlag = cli.BoolFlag{
|
FakePoWFlag = cli.BoolFlag{
|
||||||
Name: "fakepow",
|
Name: "fakepow",
|
||||||
Usage: "Disables proof-of-work verification",
|
Usage: "Disables proof-of-work verification",
|
||||||
@ -532,6 +530,45 @@ var (
|
|||||||
Usage: "Minimum POW accepted",
|
Usage: "Minimum POW accepted",
|
||||||
Value: whisper.DefaultMinimumPoW,
|
Value: whisper.DefaultMinimumPoW,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Metrics flags
|
||||||
|
MetricsEnabledFlag = cli.BoolFlag{
|
||||||
|
Name: metrics.MetricsEnabledFlag,
|
||||||
|
Usage: "Enable metrics collection and reporting",
|
||||||
|
}
|
||||||
|
MetricsEnableInfluxDBFlag = cli.BoolFlag{
|
||||||
|
Name: "metrics.influxdb",
|
||||||
|
Usage: "Enable metrics export/push to an external InfluxDB database",
|
||||||
|
}
|
||||||
|
MetricsInfluxDBEndpointFlag = cli.StringFlag{
|
||||||
|
Name: "metrics.influxdb.endpoint",
|
||||||
|
Usage: "InfluxDB API endpoint to report metrics to",
|
||||||
|
Value: "http://localhost:8086",
|
||||||
|
}
|
||||||
|
MetricsInfluxDBDatabaseFlag = cli.StringFlag{
|
||||||
|
Name: "metrics.influxdb.database",
|
||||||
|
Usage: "InfluxDB database name to push reported metrics to",
|
||||||
|
Value: "geth",
|
||||||
|
}
|
||||||
|
MetricsInfluxDBUsernameFlag = cli.StringFlag{
|
||||||
|
Name: "metrics.influxdb.username",
|
||||||
|
Usage: "Username to authorize access to the database",
|
||||||
|
Value: "test",
|
||||||
|
}
|
||||||
|
MetricsInfluxDBPasswordFlag = cli.StringFlag{
|
||||||
|
Name: "metrics.influxdb.password",
|
||||||
|
Usage: "Password to authorize access to the database",
|
||||||
|
Value: "test",
|
||||||
|
}
|
||||||
|
// The `host` tag is part of every measurement sent to InfluxDB. Queries on tags are faster in InfluxDB.
|
||||||
|
// It is used so that we can group all nodes and average a measurement across all of them, but also so
|
||||||
|
// that we can select a specific node and inspect its measurements.
|
||||||
|
// https://docs.influxdata.com/influxdb/v1.4/concepts/key_concepts/#tag-key
|
||||||
|
MetricsInfluxDBHostTagFlag = cli.StringFlag{
|
||||||
|
Name: "metrics.influxdb.host.tag",
|
||||||
|
Usage: "InfluxDB `host` tag attached to all measurements",
|
||||||
|
Value: "localhost",
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// MakeDataDir retrieves the currently requested data directory, terminating
|
// MakeDataDir retrieves the currently requested data directory, terminating
|
||||||
@ -607,8 +644,7 @@ func setBootstrapNodes(ctx *cli.Context, cfg *p2p.Config) {
|
|||||||
for _, url := range urls {
|
for _, url := range urls {
|
||||||
node, err := discover.ParseNode(url)
|
node, err := discover.ParseNode(url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Bootstrap URL invalid", "enode", url, "err", err)
|
log.Crit("Bootstrap URL invalid", "enode", url, "err", err)
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
cfg.BootstrapNodes = append(cfg.BootstrapNodes, node)
|
cfg.BootstrapNodes = append(cfg.BootstrapNodes, node)
|
||||||
}
|
}
|
||||||
@ -961,7 +997,7 @@ func setEthash(ctx *cli.Context, cfg *eth.Config) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// checkExclusive verifies that only a single isntance of the provided flags was
|
// checkExclusive verifies that only a single instance of the provided flags was
|
||||||
// set by the user. Each flag might optionally be followed by a string type to
|
// set by the user. Each flag might optionally be followed by a string type to
|
||||||
// specialize it further.
|
// specialize it further.
|
||||||
func checkExclusive(ctx *cli.Context, args ...interface{}) {
|
func checkExclusive(ctx *cli.Context, args ...interface{}) {
|
||||||
@ -1084,6 +1120,9 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) {
|
|||||||
}
|
}
|
||||||
cfg.Genesis = core.DefaultRinkebyGenesisBlock()
|
cfg.Genesis = core.DefaultRinkebyGenesisBlock()
|
||||||
case ctx.GlobalBool(DeveloperFlag.Name):
|
case ctx.GlobalBool(DeveloperFlag.Name):
|
||||||
|
if !ctx.GlobalIsSet(NetworkIdFlag.Name) {
|
||||||
|
cfg.NetworkId = 1337
|
||||||
|
}
|
||||||
// Create new developer account or reuse existing one
|
// Create new developer account or reuse existing one
|
||||||
var (
|
var (
|
||||||
developer accounts.Account
|
developer accounts.Account
|
||||||
@ -1145,7 +1184,7 @@ func RegisterEthService(stack *node.Node, cfg *eth.Config) {
|
|||||||
// RegisterDashboardService adds a dashboard to the stack.
|
// RegisterDashboardService adds a dashboard to the stack.
|
||||||
func RegisterDashboardService(stack *node.Node, cfg *dashboard.Config, commit string) {
|
func RegisterDashboardService(stack *node.Node, cfg *dashboard.Config, commit string) {
|
||||||
stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
|
stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
|
||||||
return dashboard.New(cfg, commit)
|
return dashboard.New(cfg, commit, ctx.ResolvePath("logs")), nil
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1159,7 +1198,7 @@ func RegisterShhService(stack *node.Node, cfg *whisper.Config) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// RegisterEthStatsService configures the Ethereum Stats daemon and adds it to
|
// RegisterEthStatsService configures the Ethereum Stats daemon and adds it to
|
||||||
// th egiven node.
|
// the given node.
|
||||||
func RegisterEthStatsService(stack *node.Node, url string) {
|
func RegisterEthStatsService(stack *node.Node, url string) {
|
||||||
if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
|
if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
|
||||||
// Retrieve both eth and les services
|
// Retrieve both eth and les services
|
||||||
@ -1181,6 +1220,27 @@ func SetupNetwork(ctx *cli.Context) {
|
|||||||
params.TargetGasLimit = ctx.GlobalUint64(TargetGasLimitFlag.Name)
|
params.TargetGasLimit = ctx.GlobalUint64(TargetGasLimitFlag.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SetupMetrics(ctx *cli.Context) {
|
||||||
|
if metrics.Enabled {
|
||||||
|
log.Info("Enabling metrics collection")
|
||||||
|
var (
|
||||||
|
enableExport = ctx.GlobalBool(MetricsEnableInfluxDBFlag.Name)
|
||||||
|
endpoint = ctx.GlobalString(MetricsInfluxDBEndpointFlag.Name)
|
||||||
|
database = ctx.GlobalString(MetricsInfluxDBDatabaseFlag.Name)
|
||||||
|
username = ctx.GlobalString(MetricsInfluxDBUsernameFlag.Name)
|
||||||
|
password = ctx.GlobalString(MetricsInfluxDBPasswordFlag.Name)
|
||||||
|
hosttag = ctx.GlobalString(MetricsInfluxDBHostTagFlag.Name)
|
||||||
|
)
|
||||||
|
|
||||||
|
if enableExport {
|
||||||
|
log.Info("Enabling metrics export to InfluxDB")
|
||||||
|
go influxdb.InfluxDBWithTags(metrics.DefaultRegistry, 10*time.Second, endpoint, database, username, password, "geth.", map[string]string{
|
||||||
|
"host": hosttag,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// MakeChainDatabase open an LevelDB using the flags passed to the client and will hard crash if it fails.
|
// MakeChainDatabase open an LevelDB using the flags passed to the client and will hard crash if it fails.
|
||||||
func MakeChainDatabase(ctx *cli.Context, stack *node.Node) ethdb.Database {
|
func MakeChainDatabase(ctx *cli.Context, stack *node.Node) ethdb.Database {
|
||||||
var (
|
var (
|
||||||
|
1
vendor/github.com/ethereum/go-ethereum/common/hexutil/hexutil.go
generated
vendored
1
vendor/github.com/ethereum/go-ethereum/common/hexutil/hexutil.go
generated
vendored
@ -39,6 +39,7 @@ import (
|
|||||||
|
|
||||||
const uintBits = 32 << (uint64(^uint(0)) >> 63)
|
const uintBits = 32 << (uint64(^uint(0)) >> 63)
|
||||||
|
|
||||||
|
// Errors
|
||||||
var (
|
var (
|
||||||
ErrEmptyString = &decError{"empty hex string"}
|
ErrEmptyString = &decError{"empty hex string"}
|
||||||
ErrSyntax = &decError{"invalid hex string"}
|
ErrSyntax = &decError{"invalid hex string"}
|
||||||
|
3
vendor/github.com/ethereum/go-ethereum/common/math/big.go
generated
vendored
3
vendor/github.com/ethereum/go-ethereum/common/math/big.go
generated
vendored
@ -22,12 +22,13 @@ import (
|
|||||||
"math/big"
|
"math/big"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Various big integer limit values.
|
||||||
var (
|
var (
|
||||||
tt255 = BigPow(2, 255)
|
tt255 = BigPow(2, 255)
|
||||||
tt256 = BigPow(2, 256)
|
tt256 = BigPow(2, 256)
|
||||||
tt256m1 = new(big.Int).Sub(tt256, big.NewInt(1))
|
tt256m1 = new(big.Int).Sub(tt256, big.NewInt(1))
|
||||||
MaxBig256 = new(big.Int).Set(tt256m1)
|
|
||||||
tt63 = BigPow(2, 63)
|
tt63 = BigPow(2, 63)
|
||||||
|
MaxBig256 = new(big.Int).Set(tt256m1)
|
||||||
MaxBig63 = new(big.Int).Sub(tt63, big.NewInt(1))
|
MaxBig63 = new(big.Int).Sub(tt63, big.NewInt(1))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
2
vendor/github.com/ethereum/go-ethereum/common/math/integer.go
generated
vendored
2
vendor/github.com/ethereum/go-ethereum/common/math/integer.go
generated
vendored
@ -21,8 +21,8 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Integer limit values.
|
||||||
const (
|
const (
|
||||||
// Integer limit values.
|
|
||||||
MaxInt8 = 1<<7 - 1
|
MaxInt8 = 1<<7 - 1
|
||||||
MinInt8 = -1 << 7
|
MinInt8 = -1 << 7
|
||||||
MaxInt16 = 1<<15 - 1
|
MaxInt16 = 1<<15 - 1
|
||||||
|
6
vendor/github.com/ethereum/go-ethereum/common/mclock/mclock.go
generated
vendored
6
vendor/github.com/ethereum/go-ethereum/common/mclock/mclock.go
generated
vendored
@ -14,7 +14,7 @@
|
|||||||
// You should have received a copy of the GNU Lesser General Public License
|
// 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/>.
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
// package mclock is a wrapper for a monotonic clock source
|
// Package mclock is a wrapper for a monotonic clock source
|
||||||
package mclock
|
package mclock
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -23,8 +23,10 @@ import (
|
|||||||
"github.com/aristanetworks/goarista/monotime"
|
"github.com/aristanetworks/goarista/monotime"
|
||||||
)
|
)
|
||||||
|
|
||||||
type AbsTime time.Duration // absolute monotonic time
|
// AbsTime represents absolute monotonic time.
|
||||||
|
type AbsTime time.Duration
|
||||||
|
|
||||||
|
// Now returns the current absolute monotonic time.
|
||||||
func Now() AbsTime {
|
func Now() AbsTime {
|
||||||
return AbsTime(monotime.Now())
|
return AbsTime(monotime.Now())
|
||||||
}
|
}
|
||||||
|
196
vendor/github.com/ethereum/go-ethereum/common/number/int.go
generated
vendored
196
vendor/github.com/ethereum/go-ethereum/common/number/int.go
generated
vendored
@ -1,196 +0,0 @@
|
|||||||
// Copyright 2015 The go-ethereum Authors
|
|
||||||
// This file is part of the go-ethereum library.
|
|
||||||
//
|
|
||||||
// The go-ethereum library is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// The go-ethereum library is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU Lesser General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Lesser General Public License
|
|
||||||
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package number
|
|
||||||
|
|
||||||
import (
|
|
||||||
"math/big"
|
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
|
||||||
)
|
|
||||||
|
|
||||||
var tt256 = new(big.Int).Lsh(big.NewInt(1), 256)
|
|
||||||
var tt256m1 = new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 256), big.NewInt(1))
|
|
||||||
var tt255 = new(big.Int).Lsh(big.NewInt(1), 255)
|
|
||||||
|
|
||||||
func limitUnsigned256(x *Number) *Number {
|
|
||||||
x.num.And(x.num, tt256m1)
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
|
|
||||||
func limitSigned256(x *Number) *Number {
|
|
||||||
if x.num.Cmp(tt255) < 0 {
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
x.num.Sub(x.num, tt256)
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialiser is a Number function
|
|
||||||
type Initialiser func(n int64) *Number
|
|
||||||
|
|
||||||
// A Number represents a generic integer with a bounding function limiter. Limit is called after each operations
|
|
||||||
// to give "fake" bounded integers. New types of Number can be created through NewInitialiser returning a lambda
|
|
||||||
// with the new Initialiser.
|
|
||||||
type Number struct {
|
|
||||||
num *big.Int
|
|
||||||
limit func(n *Number) *Number
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInitialiser returns a new initialiser for a new *Number without having to expose certain fields
|
|
||||||
func NewInitialiser(limiter func(*Number) *Number) Initialiser {
|
|
||||||
return func(n int64) *Number {
|
|
||||||
return &Number{big.NewInt(n), limiter}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint256 returns a Number with a UNSIGNED limiter up to 256 bits
|
|
||||||
func Uint256(n int64) *Number {
|
|
||||||
return &Number{big.NewInt(n), limitUnsigned256}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int256 returns Number with a SIGNED limiter up to 256 bits
|
|
||||||
func Int256(n int64) *Number {
|
|
||||||
return &Number{big.NewInt(n), limitSigned256}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Big returns a Number with a SIGNED unlimited size
|
|
||||||
func Big(n int64) *Number {
|
|
||||||
return &Number{big.NewInt(n), func(x *Number) *Number { return x }}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add sets i to sum of x+y
|
|
||||||
func (i *Number) Add(x, y *Number) *Number {
|
|
||||||
i.num.Add(x.num, y.num)
|
|
||||||
return i.limit(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sub sets i to difference of x-y
|
|
||||||
func (i *Number) Sub(x, y *Number) *Number {
|
|
||||||
i.num.Sub(x.num, y.num)
|
|
||||||
return i.limit(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mul sets i to product of x*y
|
|
||||||
func (i *Number) Mul(x, y *Number) *Number {
|
|
||||||
i.num.Mul(x.num, y.num)
|
|
||||||
return i.limit(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Div sets i to the quotient prodject of x/y
|
|
||||||
func (i *Number) Div(x, y *Number) *Number {
|
|
||||||
i.num.Div(x.num, y.num)
|
|
||||||
return i.limit(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mod sets i to x % y
|
|
||||||
func (i *Number) Mod(x, y *Number) *Number {
|
|
||||||
i.num.Mod(x.num, y.num)
|
|
||||||
return i.limit(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lsh sets i to x << s
|
|
||||||
func (i *Number) Lsh(x *Number, s uint) *Number {
|
|
||||||
i.num.Lsh(x.num, s)
|
|
||||||
return i.limit(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pow sets i to x^y
|
|
||||||
func (i *Number) Pow(x, y *Number) *Number {
|
|
||||||
i.num.Exp(x.num, y.num, big.NewInt(0))
|
|
||||||
return i.limit(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setters
|
|
||||||
|
|
||||||
// Set sets x to i
|
|
||||||
func (i *Number) Set(x *Number) *Number {
|
|
||||||
i.num.Set(x.num)
|
|
||||||
return i.limit(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBytes sets x bytes to i
|
|
||||||
func (i *Number) SetBytes(x []byte) *Number {
|
|
||||||
i.num.SetBytes(x)
|
|
||||||
return i.limit(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cmp compares x and y and returns:
|
|
||||||
//
|
|
||||||
// -1 if x < y
|
|
||||||
// 0 if x == y
|
|
||||||
// +1 if x > y
|
|
||||||
func (i *Number) Cmp(x *Number) int {
|
|
||||||
return i.num.Cmp(x.num)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Getters
|
|
||||||
|
|
||||||
// String returns the string representation of i
|
|
||||||
func (i *Number) String() string {
|
|
||||||
return i.num.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bytes returns the byte representation of i
|
|
||||||
func (i *Number) Bytes() []byte {
|
|
||||||
return i.num.Bytes()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint64 returns the Uint64 representation of x. If x cannot be represented in an int64, the result is undefined.
|
|
||||||
func (i *Number) Uint64() uint64 {
|
|
||||||
return i.num.Uint64()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64 returns the int64 representation of x. If x cannot be represented in an int64, the result is undefined.
|
|
||||||
func (i *Number) Int64() int64 {
|
|
||||||
return i.num.Int64()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int256 returns the signed version of i
|
|
||||||
func (i *Number) Int256() *Number {
|
|
||||||
return Int(0).Set(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint256 returns the unsigned version of i
|
|
||||||
func (i *Number) Uint256() *Number {
|
|
||||||
return Uint(0).Set(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// FirstBitSet returns the index of the first bit that's set to 1
|
|
||||||
func (i *Number) FirstBitSet() int {
|
|
||||||
for j := 0; j < i.num.BitLen(); j++ {
|
|
||||||
if i.num.Bit(j) > 0 {
|
|
||||||
return j
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return i.num.BitLen()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Variables
|
|
||||||
|
|
||||||
var (
|
|
||||||
Zero = Uint(0)
|
|
||||||
One = Uint(1)
|
|
||||||
Two = Uint(2)
|
|
||||||
MaxUint256 = Uint(0).SetBytes(common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"))
|
|
||||||
|
|
||||||
MinOne = Int(-1)
|
|
||||||
|
|
||||||
// "typedefs"
|
|
||||||
Uint = Uint256
|
|
||||||
Int = Int256
|
|
||||||
)
|
|
42
vendor/github.com/ethereum/go-ethereum/common/types.go
generated
vendored
42
vendor/github.com/ethereum/go-ethereum/common/types.go
generated
vendored
@ -17,6 +17,7 @@
|
|||||||
package common
|
package common
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"database/sql/driver"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
@ -29,8 +30,11 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/crypto/sha3"
|
"github.com/ethereum/go-ethereum/crypto/sha3"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Lengths of hashes and addresses in bytes.
|
||||||
const (
|
const (
|
||||||
HashLength = 32
|
// HashLength is the expected length of the hash
|
||||||
|
HashLength = 32
|
||||||
|
// AddressLength is the expected length of the adddress
|
||||||
AddressLength = 20
|
AddressLength = 20
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -119,6 +123,24 @@ func (h Hash) Generate(rand *rand.Rand, size int) reflect.Value {
|
|||||||
return reflect.ValueOf(h)
|
return reflect.ValueOf(h)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Scan implements Scanner for database/sql.
|
||||||
|
func (h *Hash) Scan(src interface{}) error {
|
||||||
|
srcB, ok := src.([]byte)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("can't scan %T into Hash", src)
|
||||||
|
}
|
||||||
|
if len(srcB) != HashLength {
|
||||||
|
return fmt.Errorf("can't scan []byte of len %d into Hash, want %d", len(srcB), HashLength)
|
||||||
|
}
|
||||||
|
copy(h[:], srcB)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value implements valuer for database/sql.
|
||||||
|
func (h Hash) Value() (driver.Value, error) {
|
||||||
|
return h[:], nil
|
||||||
|
}
|
||||||
|
|
||||||
// UnprefixedHash allows marshaling a Hash without 0x prefix.
|
// UnprefixedHash allows marshaling a Hash without 0x prefix.
|
||||||
type UnprefixedHash Hash
|
type UnprefixedHash Hash
|
||||||
|
|
||||||
@ -228,6 +250,24 @@ func (a *Address) UnmarshalJSON(input []byte) error {
|
|||||||
return hexutil.UnmarshalFixedJSON(addressT, input, a[:])
|
return hexutil.UnmarshalFixedJSON(addressT, input, a[:])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Scan implements Scanner for database/sql.
|
||||||
|
func (a *Address) Scan(src interface{}) error {
|
||||||
|
srcB, ok := src.([]byte)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("can't scan %T into Address", src)
|
||||||
|
}
|
||||||
|
if len(srcB) != AddressLength {
|
||||||
|
return fmt.Errorf("can't scan []byte of len %d into Address, want %d", len(srcB), AddressLength)
|
||||||
|
}
|
||||||
|
copy(a[:], srcB)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value implements valuer for database/sql.
|
||||||
|
func (a Address) Value() (driver.Value, error) {
|
||||||
|
return a[:], nil
|
||||||
|
}
|
||||||
|
|
||||||
// UnprefixedAddress allows marshaling an Address without 0x prefix.
|
// UnprefixedAddress allows marshaling an Address without 0x prefix.
|
||||||
type UnprefixedAddress Address
|
type UnprefixedAddress Address
|
||||||
|
|
||||||
|
2
vendor/github.com/ethereum/go-ethereum/consensus/clique/api.go
generated
vendored
2
vendor/github.com/ethereum/go-ethereum/consensus/clique/api.go
generated
vendored
@ -75,7 +75,7 @@ func (api *API) GetSigners(number *rpc.BlockNumber) ([]common.Address, error) {
|
|||||||
return snap.signers(), nil
|
return snap.signers(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSignersAtHash retrieves the state snapshot at a given block.
|
// GetSignersAtHash retrieves the list of authorized signers at the specified block.
|
||||||
func (api *API) GetSignersAtHash(hash common.Hash) ([]common.Address, error) {
|
func (api *API) GetSignersAtHash(hash common.Hash) ([]common.Address, error) {
|
||||||
header := api.chain.GetHeaderByHash(hash)
|
header := api.chain.GetHeaderByHash(hash)
|
||||||
if header == nil {
|
if header == nil {
|
||||||
|
1
vendor/github.com/ethereum/go-ethereum/consensus/clique/clique.go
generated
vendored
1
vendor/github.com/ethereum/go-ethereum/consensus/clique/clique.go
generated
vendored
@ -53,7 +53,6 @@ const (
|
|||||||
// Clique proof-of-authority protocol constants.
|
// Clique proof-of-authority protocol constants.
|
||||||
var (
|
var (
|
||||||
epochLength = uint64(30000) // Default number of blocks after which to checkpoint and reset the pending votes
|
epochLength = uint64(30000) // Default number of blocks after which to checkpoint and reset the pending votes
|
||||||
blockPeriod = uint64(15) // Default minimum difference between two consecutive block's timestamps
|
|
||||||
|
|
||||||
extraVanity = 32 // Fixed number of extra-data prefix bytes reserved for signer vanity
|
extraVanity = 32 // Fixed number of extra-data prefix bytes reserved for signer vanity
|
||||||
extraSeal = 65 // Fixed number of extra-data suffix bytes reserved for signer seal
|
extraSeal = 65 // Fixed number of extra-data suffix bytes reserved for signer seal
|
||||||
|
24
vendor/github.com/ethereum/go-ethereum/consensus/clique/snapshot.go
generated
vendored
24
vendor/github.com/ethereum/go-ethereum/consensus/clique/snapshot.go
generated
vendored
@ -19,6 +19,7 @@ package clique
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"sort"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
@ -56,6 +57,13 @@ type Snapshot struct {
|
|||||||
Tally map[common.Address]Tally `json:"tally"` // Current vote tally to avoid recalculating
|
Tally map[common.Address]Tally `json:"tally"` // Current vote tally to avoid recalculating
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// signers implements the sort interface to allow sorting a list of addresses
|
||||||
|
type signers []common.Address
|
||||||
|
|
||||||
|
func (s signers) Len() int { return len(s) }
|
||||||
|
func (s signers) Less(i, j int) bool { return bytes.Compare(s[i][:], s[j][:]) < 0 }
|
||||||
|
func (s signers) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||||
|
|
||||||
// newSnapshot creates a new snapshot with the specified startup parameters. This
|
// newSnapshot creates a new snapshot with the specified startup parameters. This
|
||||||
// method does not initialize the set of recent signers, so only ever use if for
|
// method does not initialize the set of recent signers, so only ever use if for
|
||||||
// the genesis block.
|
// the genesis block.
|
||||||
@ -286,18 +294,12 @@ func (s *Snapshot) apply(headers []*types.Header) (*Snapshot, error) {
|
|||||||
|
|
||||||
// signers retrieves the list of authorized signers in ascending order.
|
// signers retrieves the list of authorized signers in ascending order.
|
||||||
func (s *Snapshot) signers() []common.Address {
|
func (s *Snapshot) signers() []common.Address {
|
||||||
signers := make([]common.Address, 0, len(s.Signers))
|
sigs := make([]common.Address, 0, len(s.Signers))
|
||||||
for signer := range s.Signers {
|
for sig := range s.Signers {
|
||||||
signers = append(signers, signer)
|
sigs = append(sigs, sig)
|
||||||
}
|
}
|
||||||
for i := 0; i < len(signers); i++ {
|
sort.Sort(signers(sigs))
|
||||||
for j := i + 1; j < len(signers); j++ {
|
return sigs
|
||||||
if bytes.Compare(signers[i][:], signers[j][:]) > 0 {
|
|
||||||
signers[i], signers[j] = signers[j], signers[i]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return signers
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// inturn returns if a signer at a given block height is in-turn or not.
|
// inturn returns if a signer at a given block height is in-turn or not.
|
||||||
|
9
vendor/github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go
generated
vendored
9
vendor/github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go
generated
vendored
@ -214,15 +214,6 @@ func swap(buffer []byte) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// prepare converts an ethash cache or dataset from a byte stream into the internal
|
|
||||||
// int representation. All ethash methods work with ints to avoid constant byte to
|
|
||||||
// int conversions as well as to handle both little and big endian systems.
|
|
||||||
func prepare(dest []uint32, src []byte) {
|
|
||||||
for i := 0; i < len(dest); i++ {
|
|
||||||
dest[i] = binary.LittleEndian.Uint32(src[i*4:])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// fnv is an algorithm inspired by the FNV hash, which in some cases is used as
|
// fnv is an algorithm inspired by the FNV hash, which in some cases is used as
|
||||||
// a non-associative substitute for XOR. Note that we multiply the prime with
|
// a non-associative substitute for XOR. Note that we multiply the prime with
|
||||||
// the full 32-bit input, in contrast with the FNV-1 spec which multiplies the
|
// the full 32-bit input, in contrast with the FNV-1 spec which multiplies the
|
||||||
|
10
vendor/github.com/ethereum/go-ethereum/consensus/ethash/consensus.go
generated
vendored
10
vendor/github.com/ethereum/go-ethereum/consensus/ethash/consensus.go
generated
vendored
@ -24,6 +24,7 @@ import (
|
|||||||
"runtime"
|
"runtime"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
mapset "github.com/deckarep/golang-set"
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/common/math"
|
"github.com/ethereum/go-ethereum/common/math"
|
||||||
"github.com/ethereum/go-ethereum/consensus"
|
"github.com/ethereum/go-ethereum/consensus"
|
||||||
@ -31,7 +32,6 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/core/state"
|
"github.com/ethereum/go-ethereum/core/state"
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
set "gopkg.in/fatih/set.v0"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Ethash proof-of-work protocol constants.
|
// Ethash proof-of-work protocol constants.
|
||||||
@ -177,7 +177,7 @@ func (ethash *Ethash) VerifyUncles(chain consensus.ChainReader, block *types.Blo
|
|||||||
return errTooManyUncles
|
return errTooManyUncles
|
||||||
}
|
}
|
||||||
// Gather the set of past uncles and ancestors
|
// Gather the set of past uncles and ancestors
|
||||||
uncles, ancestors := set.New(), make(map[common.Hash]*types.Header)
|
uncles, ancestors := mapset.NewSet(), make(map[common.Hash]*types.Header)
|
||||||
|
|
||||||
number, parent := block.NumberU64()-1, block.ParentHash()
|
number, parent := block.NumberU64()-1, block.ParentHash()
|
||||||
for i := 0; i < 7; i++ {
|
for i := 0; i < 7; i++ {
|
||||||
@ -198,7 +198,7 @@ func (ethash *Ethash) VerifyUncles(chain consensus.ChainReader, block *types.Blo
|
|||||||
for _, uncle := range block.Uncles() {
|
for _, uncle := range block.Uncles() {
|
||||||
// Make sure every uncle is rewarded only once
|
// Make sure every uncle is rewarded only once
|
||||||
hash := uncle.Hash()
|
hash := uncle.Hash()
|
||||||
if uncles.Has(hash) {
|
if uncles.Contains(hash) {
|
||||||
return errDuplicateUncle
|
return errDuplicateUncle
|
||||||
}
|
}
|
||||||
uncles.Add(hash)
|
uncles.Add(hash)
|
||||||
@ -356,8 +356,8 @@ func calcDifficultyByzantium(time uint64, parent *types.Header) *big.Int {
|
|||||||
x.Set(params.MinimumDifficulty)
|
x.Set(params.MinimumDifficulty)
|
||||||
}
|
}
|
||||||
// calculate a fake block number for the ice-age delay:
|
// calculate a fake block number for the ice-age delay:
|
||||||
// https://github.com/ethereum/EIPs/pull/669
|
// https://github.com/ethereum/EIPs/pull/669
|
||||||
// fake_block_number = min(0, block.number - 3_000_000
|
// fake_block_number = max(0, block.number - 3_000_000)
|
||||||
fakeBlockNumber := new(big.Int)
|
fakeBlockNumber := new(big.Int)
|
||||||
if parent.Number.Cmp(big2999999) >= 0 {
|
if parent.Number.Cmp(big2999999) >= 0 {
|
||||||
fakeBlockNumber = fakeBlockNumber.Sub(parent.Number, big2999999) // Note, parent is 1 less than the actual block number
|
fakeBlockNumber = fakeBlockNumber.Sub(parent.Number, big2999999) // Note, parent is 1 less than the actual block number
|
||||||
|
2
vendor/github.com/ethereum/go-ethereum/consensus/ethash/ethash.go
generated
vendored
2
vendor/github.com/ethereum/go-ethereum/consensus/ethash/ethash.go
generated
vendored
@ -389,7 +389,7 @@ type Config struct {
|
|||||||
PowMode Mode
|
PowMode Mode
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ethash is a consensus engine based on proot-of-work implementing the ethash
|
// Ethash is a consensus engine based on proof-of-work implementing the ethash
|
||||||
// algorithm.
|
// algorithm.
|
||||||
type Ethash struct {
|
type Ethash struct {
|
||||||
config Config
|
config Config
|
||||||
|
2
vendor/github.com/ethereum/go-ethereum/console/console.go
generated
vendored
2
vendor/github.com/ethereum/go-ethereum/console/console.go
generated
vendored
@ -60,7 +60,7 @@ type Config struct {
|
|||||||
Preload []string // Absolute paths to JavaScript files to preload
|
Preload []string // Absolute paths to JavaScript files to preload
|
||||||
}
|
}
|
||||||
|
|
||||||
// Console is a JavaScript interpreted runtime environment. It is a fully fleged
|
// Console is a JavaScript interpreted runtime environment. It is a fully fledged
|
||||||
// JavaScript console attached to a running node via an external or in-process RPC
|
// JavaScript console attached to a running node via an external or in-process RPC
|
||||||
// client.
|
// client.
|
||||||
type Console struct {
|
type Console struct {
|
||||||
|
6
vendor/github.com/ethereum/go-ethereum/contracts/ens/ens.go
generated
vendored
6
vendor/github.com/ethereum/go-ethereum/contracts/ens/ens.go
generated
vendored
@ -95,7 +95,7 @@ func ensParentNode(name string) (common.Hash, common.Hash) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ensNode(name string) common.Hash {
|
func EnsNode(name string) common.Hash {
|
||||||
parentNode, parentLabel := ensParentNode(name)
|
parentNode, parentLabel := ensParentNode(name)
|
||||||
return crypto.Keccak256Hash(parentNode[:], parentLabel[:])
|
return crypto.Keccak256Hash(parentNode[:], parentLabel[:])
|
||||||
}
|
}
|
||||||
@ -136,7 +136,7 @@ func (self *ENS) getRegistrar(node [32]byte) (*contract.FIFSRegistrarSession, er
|
|||||||
|
|
||||||
// Resolve is a non-transactional call that returns the content hash associated with a name.
|
// Resolve is a non-transactional call that returns the content hash associated with a name.
|
||||||
func (self *ENS) Resolve(name string) (common.Hash, error) {
|
func (self *ENS) Resolve(name string) (common.Hash, error) {
|
||||||
node := ensNode(name)
|
node := EnsNode(name)
|
||||||
|
|
||||||
resolver, err := self.getResolver(node)
|
resolver, err := self.getResolver(node)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -165,7 +165,7 @@ func (self *ENS) Register(name string) (*types.Transaction, error) {
|
|||||||
// SetContentHash sets the content hash associated with a name. Only works if the caller
|
// SetContentHash sets the content hash associated with a name. Only works if the caller
|
||||||
// owns the name, and the associated resolver implements a `setContent` function.
|
// owns the name, and the associated resolver implements a `setContent` function.
|
||||||
func (self *ENS) SetContentHash(name string, hash common.Hash) (*types.Transaction, error) {
|
func (self *ENS) SetContentHash(name string, hash common.Hash) (*types.Transaction, error) {
|
||||||
node := ensNode(name)
|
node := EnsNode(name)
|
||||||
|
|
||||||
resolver, err := self.getResolver(node)
|
resolver, err := self.getResolver(node)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
4
vendor/github.com/ethereum/go-ethereum/core/asm/compiler.go
generated
vendored
4
vendor/github.com/ethereum/go-ethereum/core/asm/compiler.go
generated
vendored
@ -51,7 +51,7 @@ func NewCompiler(debug bool) *Compiler {
|
|||||||
// the compiler.
|
// the compiler.
|
||||||
//
|
//
|
||||||
// feed is the first pass in the compile stage as it
|
// feed is the first pass in the compile stage as it
|
||||||
// collect the used labels in the program and keeps a
|
// collects the used labels in the program and keeps a
|
||||||
// program counter which is used to determine the locations
|
// program counter which is used to determine the locations
|
||||||
// of the jump dests. The labels can than be used in the
|
// of the jump dests. The labels can than be used in the
|
||||||
// second stage to push labels and determine the right
|
// second stage to push labels and determine the right
|
||||||
@ -120,7 +120,7 @@ func (c *Compiler) next() token {
|
|||||||
return token
|
return token
|
||||||
}
|
}
|
||||||
|
|
||||||
// compile line compiles a single line instruction e.g.
|
// compileLine compiles a single line instruction e.g.
|
||||||
// "push 1", "jump @label".
|
// "push 1", "jump @label".
|
||||||
func (c *Compiler) compileLine() error {
|
func (c *Compiler) compileLine() error {
|
||||||
n := c.next()
|
n := c.next()
|
||||||
|
2
vendor/github.com/ethereum/go-ethereum/core/asm/lexer.go
generated
vendored
2
vendor/github.com/ethereum/go-ethereum/core/asm/lexer.go
generated
vendored
@ -242,7 +242,7 @@ func lexLabel(l *lexer) stateFn {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// lexInsideString lexes the inside of a string until
|
// lexInsideString lexes the inside of a string until
|
||||||
// until the state function finds the closing quote.
|
// the state function finds the closing quote.
|
||||||
// It returns the lex text state function.
|
// It returns the lex text state function.
|
||||||
func lexInsideString(l *lexer) stateFn {
|
func lexInsideString(l *lexer) stateFn {
|
||||||
if l.acceptRunUntil('"') {
|
if l.acceptRunUntil('"') {
|
||||||
|
25
vendor/github.com/ethereum/go-ethereum/core/blockchain.go
generated
vendored
25
vendor/github.com/ethereum/go-ethereum/core/blockchain.go
generated
vendored
@ -269,8 +269,8 @@ func (bc *BlockChain) SetHead(head uint64) error {
|
|||||||
defer bc.mu.Unlock()
|
defer bc.mu.Unlock()
|
||||||
|
|
||||||
// Rewind the header chain, deleting all block bodies until then
|
// Rewind the header chain, deleting all block bodies until then
|
||||||
delFn := func(hash common.Hash, num uint64) {
|
delFn := func(db rawdb.DatabaseDeleter, hash common.Hash, num uint64) {
|
||||||
rawdb.DeleteBody(bc.db, hash, num)
|
rawdb.DeleteBody(db, hash, num)
|
||||||
}
|
}
|
||||||
bc.hc.SetHead(head, delFn)
|
bc.hc.SetHead(head, delFn)
|
||||||
currentHeader := bc.hc.CurrentHeader()
|
currentHeader := bc.hc.CurrentHeader()
|
||||||
@ -450,15 +450,19 @@ func (bc *BlockChain) ExportN(w io.Writer, first uint64, last uint64) error {
|
|||||||
}
|
}
|
||||||
log.Info("Exporting batch of blocks", "count", last-first+1)
|
log.Info("Exporting batch of blocks", "count", last-first+1)
|
||||||
|
|
||||||
|
start, reported := time.Now(), time.Now()
|
||||||
for nr := first; nr <= last; nr++ {
|
for nr := first; nr <= last; nr++ {
|
||||||
block := bc.GetBlockByNumber(nr)
|
block := bc.GetBlockByNumber(nr)
|
||||||
if block == nil {
|
if block == nil {
|
||||||
return fmt.Errorf("export failed on #%d: not found", nr)
|
return fmt.Errorf("export failed on #%d: not found", nr)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := block.EncodeRLP(w); err != nil {
|
if err := block.EncodeRLP(w); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if time.Since(reported) >= statsReportLimit {
|
||||||
|
log.Info("Exporting blocks", "exported", block.NumberU64()-first, "elapsed", common.PrettyDuration(time.Since(start)))
|
||||||
|
reported = time.Now()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@ -672,7 +676,7 @@ func (bc *BlockChain) Stop() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for !bc.triegc.Empty() {
|
for !bc.triegc.Empty() {
|
||||||
triedb.Dereference(bc.triegc.PopItem().(common.Hash), common.Hash{})
|
triedb.Dereference(bc.triegc.PopItem().(common.Hash))
|
||||||
}
|
}
|
||||||
if size, _ := triedb.Size(); size != 0 {
|
if size, _ := triedb.Size(); size != 0 {
|
||||||
log.Error("Dangling trie nodes after full cleanup")
|
log.Error("Dangling trie nodes after full cleanup")
|
||||||
@ -947,7 +951,7 @@ func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types.
|
|||||||
bc.triegc.Push(root, number)
|
bc.triegc.Push(root, number)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
triedb.Dereference(root.(common.Hash), common.Hash{})
|
triedb.Dereference(root.(common.Hash))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1012,7 +1016,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*ty
|
|||||||
// Do a sanity check that the provided chain is actually ordered and linked
|
// Do a sanity check that the provided chain is actually ordered and linked
|
||||||
for i := 1; i < len(chain); i++ {
|
for i := 1; i < len(chain); i++ {
|
||||||
if chain[i].NumberU64() != chain[i-1].NumberU64()+1 || chain[i].ParentHash() != chain[i-1].Hash() {
|
if chain[i].NumberU64() != chain[i-1].NumberU64()+1 || chain[i].ParentHash() != chain[i-1].Hash() {
|
||||||
// Chain broke ancestry, log a messge (programming error) and skip insertion
|
// Chain broke ancestry, log a message (programming error) and skip insertion
|
||||||
log.Error("Non contiguous block insert", "number", chain[i].Number(), "hash", chain[i].Hash(),
|
log.Error("Non contiguous block insert", "number", chain[i].Number(), "hash", chain[i].Hash(),
|
||||||
"parent", chain[i].ParentHash(), "prevnumber", chain[i-1].Number(), "prevhash", chain[i-1].Hash())
|
"parent", chain[i].ParentHash(), "prevnumber", chain[i-1].Number(), "prevhash", chain[i-1].Hash())
|
||||||
|
|
||||||
@ -1203,8 +1207,8 @@ type insertStats struct {
|
|||||||
startTime mclock.AbsTime
|
startTime mclock.AbsTime
|
||||||
}
|
}
|
||||||
|
|
||||||
// statsReportLimit is the time limit during import after which we always print
|
// statsReportLimit is the time limit during import and export after which we
|
||||||
// out progress. This avoids the user wondering what's going on.
|
// always print out progress. This avoids the user wondering what's going on.
|
||||||
const statsReportLimit = 8 * time.Second
|
const statsReportLimit = 8 * time.Second
|
||||||
|
|
||||||
// report prints statistics if some number of blocks have been processed
|
// report prints statistics if some number of blocks have been processed
|
||||||
@ -1340,9 +1344,12 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error {
|
|||||||
diff := types.TxDifference(deletedTxs, addedTxs)
|
diff := types.TxDifference(deletedTxs, addedTxs)
|
||||||
// When transactions get deleted from the database that means the
|
// When transactions get deleted from the database that means the
|
||||||
// receipts that were created in the fork must also be deleted
|
// receipts that were created in the fork must also be deleted
|
||||||
|
batch := bc.db.NewBatch()
|
||||||
for _, tx := range diff {
|
for _, tx := range diff {
|
||||||
rawdb.DeleteTxLookupEntry(bc.db, tx.Hash())
|
rawdb.DeleteTxLookupEntry(batch, tx.Hash())
|
||||||
}
|
}
|
||||||
|
batch.Write()
|
||||||
|
|
||||||
if len(deletedLogs) > 0 {
|
if len(deletedLogs) > 0 {
|
||||||
go bc.rmLogsFeed.Send(RemovedLogsEvent{deletedLogs})
|
go bc.rmLogsFeed.Send(RemovedLogsEvent{deletedLogs})
|
||||||
}
|
}
|
||||||
|
30
vendor/github.com/ethereum/go-ethereum/core/bloombits/generator.go
generated
vendored
30
vendor/github.com/ethereum/go-ethereum/core/bloombits/generator.go
generated
vendored
@ -22,16 +22,22 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
// errSectionOutOfBounds is returned if the user tried to add more bloom filters
|
var (
|
||||||
// to the batch than available space, or if tries to retrieve above the capacity,
|
// errSectionOutOfBounds is returned if the user tried to add more bloom filters
|
||||||
var errSectionOutOfBounds = errors.New("section out of bounds")
|
// to the batch than available space, or if tries to retrieve above the capacity.
|
||||||
|
errSectionOutOfBounds = errors.New("section out of bounds")
|
||||||
|
|
||||||
|
// errBloomBitOutOfBounds is returned if the user tried to retrieve specified
|
||||||
|
// bit bloom above the capacity.
|
||||||
|
errBloomBitOutOfBounds = errors.New("bloom bit out of bounds")
|
||||||
|
)
|
||||||
|
|
||||||
// Generator takes a number of bloom filters and generates the rotated bloom bits
|
// Generator takes a number of bloom filters and generates the rotated bloom bits
|
||||||
// to be used for batched filtering.
|
// to be used for batched filtering.
|
||||||
type Generator struct {
|
type Generator struct {
|
||||||
blooms [types.BloomBitLength][]byte // Rotated blooms for per-bit matching
|
blooms [types.BloomBitLength][]byte // Rotated blooms for per-bit matching
|
||||||
sections uint // Number of sections to batch together
|
sections uint // Number of sections to batch together
|
||||||
nextBit uint // Next bit to set when adding a bloom
|
nextSec uint // Next section to set when adding a bloom
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGenerator creates a rotated bloom generator that can iteratively fill a
|
// NewGenerator creates a rotated bloom generator that can iteratively fill a
|
||||||
@ -51,15 +57,15 @@ func NewGenerator(sections uint) (*Generator, error) {
|
|||||||
// in memory accordingly.
|
// in memory accordingly.
|
||||||
func (b *Generator) AddBloom(index uint, bloom types.Bloom) error {
|
func (b *Generator) AddBloom(index uint, bloom types.Bloom) error {
|
||||||
// Make sure we're not adding more bloom filters than our capacity
|
// Make sure we're not adding more bloom filters than our capacity
|
||||||
if b.nextBit >= b.sections {
|
if b.nextSec >= b.sections {
|
||||||
return errSectionOutOfBounds
|
return errSectionOutOfBounds
|
||||||
}
|
}
|
||||||
if b.nextBit != index {
|
if b.nextSec != index {
|
||||||
return errors.New("bloom filter with unexpected index")
|
return errors.New("bloom filter with unexpected index")
|
||||||
}
|
}
|
||||||
// Rotate the bloom and insert into our collection
|
// Rotate the bloom and insert into our collection
|
||||||
byteIndex := b.nextBit / 8
|
byteIndex := b.nextSec / 8
|
||||||
bitMask := byte(1) << byte(7-b.nextBit%8)
|
bitMask := byte(1) << byte(7-b.nextSec%8)
|
||||||
|
|
||||||
for i := 0; i < types.BloomBitLength; i++ {
|
for i := 0; i < types.BloomBitLength; i++ {
|
||||||
bloomByteIndex := types.BloomByteLength - 1 - i/8
|
bloomByteIndex := types.BloomByteLength - 1 - i/8
|
||||||
@ -69,7 +75,7 @@ func (b *Generator) AddBloom(index uint, bloom types.Bloom) error {
|
|||||||
b.blooms[i][byteIndex] |= bitMask
|
b.blooms[i][byteIndex] |= bitMask
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
b.nextBit++
|
b.nextSec++
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -77,11 +83,11 @@ func (b *Generator) AddBloom(index uint, bloom types.Bloom) error {
|
|||||||
// Bitset returns the bit vector belonging to the given bit index after all
|
// Bitset returns the bit vector belonging to the given bit index after all
|
||||||
// blooms have been added.
|
// blooms have been added.
|
||||||
func (b *Generator) Bitset(idx uint) ([]byte, error) {
|
func (b *Generator) Bitset(idx uint) ([]byte, error) {
|
||||||
if b.nextBit != b.sections {
|
if b.nextSec != b.sections {
|
||||||
return nil, errors.New("bloom not fully generated yet")
|
return nil, errors.New("bloom not fully generated yet")
|
||||||
}
|
}
|
||||||
if idx >= b.sections {
|
if idx >= types.BloomBitLength {
|
||||||
return nil, errSectionOutOfBounds
|
return nil, errBloomBitOutOfBounds
|
||||||
}
|
}
|
||||||
return b.blooms[idx], nil
|
return b.blooms[idx], nil
|
||||||
}
|
}
|
||||||
|
10
vendor/github.com/ethereum/go-ethereum/core/bloombits/matcher.go
generated
vendored
10
vendor/github.com/ethereum/go-ethereum/core/bloombits/matcher.go
generated
vendored
@ -59,7 +59,7 @@ type partialMatches struct {
|
|||||||
// It can also have the actual results set to be used as a delivery data struct.
|
// It can also have the actual results set to be used as a delivery data struct.
|
||||||
//
|
//
|
||||||
// The contest and error fields are used by the light client to terminate matching
|
// The contest and error fields are used by the light client to terminate matching
|
||||||
// early if an error is enountered on some path of the pipeline.
|
// early if an error is encountered on some path of the pipeline.
|
||||||
type Retrieval struct {
|
type Retrieval struct {
|
||||||
Bit uint
|
Bit uint
|
||||||
Sections []uint64
|
Sections []uint64
|
||||||
@ -218,7 +218,7 @@ func (m *Matcher) Start(ctx context.Context, begin, end uint64, results chan uin
|
|||||||
// run creates a daisy-chain of sub-matchers, one for the address set and one
|
// run creates a daisy-chain of sub-matchers, one for the address set and one
|
||||||
// for each topic set, each sub-matcher receiving a section only if the previous
|
// for each topic set, each sub-matcher receiving a section only if the previous
|
||||||
// ones have all found a potential match in one of the blocks of the section,
|
// ones have all found a potential match in one of the blocks of the section,
|
||||||
// then binary AND-ing its own matches and forwaring the result to the next one.
|
// then binary AND-ing its own matches and forwarding the result to the next one.
|
||||||
//
|
//
|
||||||
// The method starts feeding the section indexes into the first sub-matcher on a
|
// The method starts feeding the section indexes into the first sub-matcher on a
|
||||||
// new goroutine and returns a sink channel receiving the results.
|
// new goroutine and returns a sink channel receiving the results.
|
||||||
@ -543,7 +543,7 @@ func (s *MatcherSession) Error() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// AllocateRetrieval assigns a bloom bit index to a client process that can either
|
// AllocateRetrieval assigns a bloom bit index to a client process that can either
|
||||||
// immediately reuest and fetch the section contents assigned to this bit or wait
|
// immediately request and fetch the section contents assigned to this bit or wait
|
||||||
// a little while for more sections to be requested.
|
// a little while for more sections to be requested.
|
||||||
func (s *MatcherSession) AllocateRetrieval() (uint, bool) {
|
func (s *MatcherSession) AllocateRetrieval() (uint, bool) {
|
||||||
fetcher := make(chan uint)
|
fetcher := make(chan uint)
|
||||||
@ -599,8 +599,8 @@ func (s *MatcherSession) DeliverSections(bit uint, sections []uint64, bitsets []
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Multiplex polls the matcher session for rerieval tasks and multiplexes it into
|
// Multiplex polls the matcher session for retrieval tasks and multiplexes it into
|
||||||
// the reuested retrieval queue to be serviced together with other sessions.
|
// the requested retrieval queue to be serviced together with other sessions.
|
||||||
//
|
//
|
||||||
// This method will block for the lifetime of the session. Even after termination
|
// This method will block for the lifetime of the session. Even after termination
|
||||||
// of the session, any request in-flight need to be responded to! Empty responses
|
// of the session, any request in-flight need to be responded to! Empty responses
|
||||||
|
33
vendor/github.com/ethereum/go-ethereum/core/chain_makers.go
generated
vendored
33
vendor/github.com/ethereum/go-ethereum/core/chain_makers.go
generated
vendored
@ -30,12 +30,6 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
)
|
)
|
||||||
|
|
||||||
// So we can deterministically seed different blockchains
|
|
||||||
var (
|
|
||||||
canonicalSeed = 1
|
|
||||||
forkSeed = 2
|
|
||||||
)
|
|
||||||
|
|
||||||
// BlockGen creates blocks for testing.
|
// BlockGen creates blocks for testing.
|
||||||
// See GenerateChain for a detailed explanation.
|
// See GenerateChain for a detailed explanation.
|
||||||
type BlockGen struct {
|
type BlockGen struct {
|
||||||
@ -252,33 +246,6 @@ func makeHeader(chain consensus.ChainReader, parent *types.Block, state *state.S
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// newCanonical creates a chain database, and injects a deterministic canonical
|
|
||||||
// chain. Depending on the full flag, if creates either a full block chain or a
|
|
||||||
// header only chain.
|
|
||||||
func newCanonical(engine consensus.Engine, n int, full bool) (ethdb.Database, *BlockChain, error) {
|
|
||||||
var (
|
|
||||||
db = ethdb.NewMemDatabase()
|
|
||||||
genesis = new(Genesis).MustCommit(db)
|
|
||||||
)
|
|
||||||
|
|
||||||
// Initialize a fresh chain with only a genesis block
|
|
||||||
blockchain, _ := NewBlockChain(db, nil, params.AllEthashProtocolChanges, engine, vm.Config{})
|
|
||||||
// Create and inject the requested chain
|
|
||||||
if n == 0 {
|
|
||||||
return db, blockchain, nil
|
|
||||||
}
|
|
||||||
if full {
|
|
||||||
// Full block-chain requested
|
|
||||||
blocks := makeBlockChain(genesis, n, engine, db, canonicalSeed)
|
|
||||||
_, err := blockchain.InsertChain(blocks)
|
|
||||||
return db, blockchain, err
|
|
||||||
}
|
|
||||||
// Header-only chain requested
|
|
||||||
headers := makeHeaderChain(genesis.Header(), n, engine, db, canonicalSeed)
|
|
||||||
_, err := blockchain.InsertHeaderChain(headers, 1)
|
|
||||||
return db, blockchain, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// makeHeaderChain creates a deterministic chain of headers rooted at parent.
|
// makeHeaderChain creates a deterministic chain of headers rooted at parent.
|
||||||
func makeHeaderChain(parent *types.Header, n int, engine consensus.Engine, db ethdb.Database, seed int) []*types.Header {
|
func makeHeaderChain(parent *types.Header, n int, engine consensus.Engine, db ethdb.Database, seed int) []*types.Header {
|
||||||
blocks := makeBlockChain(types.NewBlockWithHeader(parent), n, engine, db, seed)
|
blocks := makeBlockChain(types.NewBlockWithHeader(parent), n, engine, db, seed)
|
||||||
|
2
vendor/github.com/ethereum/go-ethereum/core/evm.go
generated
vendored
2
vendor/github.com/ethereum/go-ethereum/core/evm.go
generated
vendored
@ -84,7 +84,7 @@ func GetHashFn(ref *types.Header, chain ChainContext) func(n uint64) common.Hash
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// CanTransfer checks wether there are enough funds in the address' account to make a transfer.
|
// CanTransfer checks whether there are enough funds in the address' account to make a transfer.
|
||||||
// This does not take the necessary gas in to account to make the transfer valid.
|
// This does not take the necessary gas in to account to make the transfer valid.
|
||||||
func CanTransfer(db vm.StateDB, addr common.Address, amount *big.Int) bool {
|
func CanTransfer(db vm.StateDB, addr common.Address, amount *big.Int) bool {
|
||||||
return db.GetBalance(addr).Cmp(amount) >= 0
|
return db.GetBalance(addr).Cmp(amount) >= 0
|
||||||
|
21
vendor/github.com/ethereum/go-ethereum/core/headerchain.go
generated
vendored
21
vendor/github.com/ethereum/go-ethereum/core/headerchain.go
generated
vendored
@ -156,13 +156,16 @@ func (hc *HeaderChain) WriteHeader(header *types.Header) (status WriteStatus, er
|
|||||||
// Please refer to http://www.cs.cornell.edu/~ie53/publications/btcProcFC.pdf
|
// Please refer to http://www.cs.cornell.edu/~ie53/publications/btcProcFC.pdf
|
||||||
if externTd.Cmp(localTd) > 0 || (externTd.Cmp(localTd) == 0 && mrand.Float64() < 0.5) {
|
if externTd.Cmp(localTd) > 0 || (externTd.Cmp(localTd) == 0 && mrand.Float64() < 0.5) {
|
||||||
// Delete any canonical number assignments above the new head
|
// Delete any canonical number assignments above the new head
|
||||||
|
batch := hc.chainDb.NewBatch()
|
||||||
for i := number + 1; ; i++ {
|
for i := number + 1; ; i++ {
|
||||||
hash := rawdb.ReadCanonicalHash(hc.chainDb, i)
|
hash := rawdb.ReadCanonicalHash(hc.chainDb, i)
|
||||||
if hash == (common.Hash{}) {
|
if hash == (common.Hash{}) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
rawdb.DeleteCanonicalHash(hc.chainDb, i)
|
rawdb.DeleteCanonicalHash(batch, i)
|
||||||
}
|
}
|
||||||
|
batch.Write()
|
||||||
|
|
||||||
// Overwrite any stale canonical number assignments
|
// Overwrite any stale canonical number assignments
|
||||||
var (
|
var (
|
||||||
headHash = header.ParentHash
|
headHash = header.ParentHash
|
||||||
@ -205,7 +208,7 @@ func (hc *HeaderChain) ValidateHeaderChain(chain []*types.Header, checkFreq int)
|
|||||||
// Do a sanity check that the provided chain is actually ordered and linked
|
// Do a sanity check that the provided chain is actually ordered and linked
|
||||||
for i := 1; i < len(chain); i++ {
|
for i := 1; i < len(chain); i++ {
|
||||||
if chain[i].Number.Uint64() != chain[i-1].Number.Uint64()+1 || chain[i].ParentHash != chain[i-1].Hash() {
|
if chain[i].Number.Uint64() != chain[i-1].Number.Uint64()+1 || chain[i].ParentHash != chain[i-1].Hash() {
|
||||||
// Chain broke ancestry, log a messge (programming error) and skip insertion
|
// Chain broke ancestry, log a message (programming error) and skip insertion
|
||||||
log.Error("Non contiguous header insert", "number", chain[i].Number, "hash", chain[i].Hash(),
|
log.Error("Non contiguous header insert", "number", chain[i].Number, "hash", chain[i].Hash(),
|
||||||
"parent", chain[i].ParentHash, "prevnumber", chain[i-1].Number, "prevhash", chain[i-1].Hash())
|
"parent", chain[i].ParentHash, "prevnumber", chain[i-1].Number, "prevhash", chain[i-1].Hash())
|
||||||
|
|
||||||
@ -438,7 +441,7 @@ func (hc *HeaderChain) SetCurrentHeader(head *types.Header) {
|
|||||||
|
|
||||||
// DeleteCallback is a callback function that is called by SetHead before
|
// DeleteCallback is a callback function that is called by SetHead before
|
||||||
// each header is deleted.
|
// each header is deleted.
|
||||||
type DeleteCallback func(common.Hash, uint64)
|
type DeleteCallback func(rawdb.DatabaseDeleter, common.Hash, uint64)
|
||||||
|
|
||||||
// SetHead rewinds the local chain to a new head. Everything above the new head
|
// SetHead rewinds the local chain to a new head. Everything above the new head
|
||||||
// will be deleted and the new one set.
|
// will be deleted and the new one set.
|
||||||
@ -448,22 +451,24 @@ func (hc *HeaderChain) SetHead(head uint64, delFn DeleteCallback) {
|
|||||||
if hdr := hc.CurrentHeader(); hdr != nil {
|
if hdr := hc.CurrentHeader(); hdr != nil {
|
||||||
height = hdr.Number.Uint64()
|
height = hdr.Number.Uint64()
|
||||||
}
|
}
|
||||||
|
batch := hc.chainDb.NewBatch()
|
||||||
for hdr := hc.CurrentHeader(); hdr != nil && hdr.Number.Uint64() > head; hdr = hc.CurrentHeader() {
|
for hdr := hc.CurrentHeader(); hdr != nil && hdr.Number.Uint64() > head; hdr = hc.CurrentHeader() {
|
||||||
hash := hdr.Hash()
|
hash := hdr.Hash()
|
||||||
num := hdr.Number.Uint64()
|
num := hdr.Number.Uint64()
|
||||||
if delFn != nil {
|
if delFn != nil {
|
||||||
delFn(hash, num)
|
delFn(batch, hash, num)
|
||||||
}
|
}
|
||||||
rawdb.DeleteHeader(hc.chainDb, hash, num)
|
rawdb.DeleteHeader(batch, hash, num)
|
||||||
rawdb.DeleteTd(hc.chainDb, hash, num)
|
rawdb.DeleteTd(batch, hash, num)
|
||||||
|
|
||||||
hc.currentHeader.Store(hc.GetHeader(hdr.ParentHash, hdr.Number.Uint64()-1))
|
hc.currentHeader.Store(hc.GetHeader(hdr.ParentHash, hdr.Number.Uint64()-1))
|
||||||
}
|
}
|
||||||
// Roll back the canonical chain numbering
|
// Roll back the canonical chain numbering
|
||||||
for i := height; i > head; i-- {
|
for i := height; i > head; i-- {
|
||||||
rawdb.DeleteCanonicalHash(hc.chainDb, i)
|
rawdb.DeleteCanonicalHash(batch, i)
|
||||||
}
|
}
|
||||||
|
batch.Write()
|
||||||
|
|
||||||
// Clear out any stale content from the caches
|
// Clear out any stale content from the caches
|
||||||
hc.headerCache.Purge()
|
hc.headerCache.Purge()
|
||||||
hc.tdCache.Purge()
|
hc.tdCache.Purge()
|
||||||
|
2
vendor/github.com/ethereum/go-ethereum/core/state/statedb.go
generated
vendored
2
vendor/github.com/ethereum/go-ethereum/core/state/statedb.go
generated
vendored
@ -596,7 +596,7 @@ func (s *StateDB) Commit(deleteEmptyObjects bool) (root common.Hash, err error)
|
|||||||
case isDirty:
|
case isDirty:
|
||||||
// Write any contract code associated with the state object
|
// Write any contract code associated with the state object
|
||||||
if stateObject.code != nil && stateObject.dirtyCode {
|
if stateObject.code != nil && stateObject.dirtyCode {
|
||||||
s.db.TrieDB().Insert(common.BytesToHash(stateObject.CodeHash()), stateObject.code)
|
s.db.TrieDB().InsertBlob(common.BytesToHash(stateObject.CodeHash()), stateObject.code)
|
||||||
stateObject.dirtyCode = false
|
stateObject.dirtyCode = false
|
||||||
}
|
}
|
||||||
// Write any storage changes in the state object to its storage trie.
|
// Write any storage changes in the state object to its storage trie.
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user