aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmd/mist/assets/ext/ethereum.js/lib/web3.js2
-rw-r--r--cmd/mist/assets/qml/browser.qml9
-rw-r--r--ethutil/common.go1
-rw-r--r--event/filter/filter.go8
-rw-r--r--tests/helper/vm.go11
-rw-r--r--tests/vm/gh_test.go6
-rw-r--r--ui/qt/qwhisper/whisper.go4
-rw-r--r--vm/vm_debug.go16
-rw-r--r--whisper/whisper.go37
9 files changed, 71 insertions, 23 deletions
diff --git a/cmd/mist/assets/ext/ethereum.js/lib/web3.js b/cmd/mist/assets/ext/ethereum.js/lib/web3.js
index 9a85c4d1b..2fe414259 100644
--- a/cmd/mist/assets/ext/ethereum.js/lib/web3.js
+++ b/cmd/mist/assets/ext/ethereum.js/lib/web3.js
@@ -150,7 +150,7 @@ var shhWatchMethods = function () {
return [
{ name: 'newFilter', call: 'shh_newFilter' },
{ name: 'uninstallFilter', call: 'shh_uninstallFilter' },
- { name: 'getMessage', call: 'shh_getMessages' }
+ { name: 'getMessages', call: 'shh_getMessages' }
];
};
diff --git a/cmd/mist/assets/qml/browser.qml b/cmd/mist/assets/qml/browser.qml
index fcec774a5..7e8ed75bf 100644
--- a/cmd/mist/assets/qml/browser.qml
+++ b/cmd/mist/assets/qml/browser.qml
@@ -310,7 +310,7 @@ Rectangle {
postData(data._id, id);
break;
- case "eth_messages":
+ case "eth_filterLogs":
require(1);
var messages = eth.messages(data.args[0]);
@@ -353,6 +353,13 @@ Rectangle {
shh.post(params.payload, params.to, params.from, params.topics, params.priority, params.ttl);
break;
+
+ case "shh_getMessages":
+ require(1);
+
+ shh.trigger(data.args[0]);
+
+ break;
}
} catch(e) {
console.log(data.call + ": " + e)
diff --git a/ethutil/common.go b/ethutil/common.go
index 0a29cac6c..271c56fd5 100644
--- a/ethutil/common.go
+++ b/ethutil/common.go
@@ -84,4 +84,5 @@ var (
BigFalse = Big0
Big32 = big.NewInt(32)
Big256 = big.NewInt(0xff)
+ Big257 = big.NewInt(257)
)
diff --git a/event/filter/filter.go b/event/filter/filter.go
index 9817d5782..ca767f413 100644
--- a/event/filter/filter.go
+++ b/event/filter/filter.go
@@ -68,3 +68,11 @@ out:
}
}
}
+
+func (self *Filters) Match(a, b Filter) bool {
+ return reflect.TypeOf(a) == reflect.TypeOf(b) && a.Compare(b)
+}
+
+func (self *Filters) Get(i int) Filter {
+ return self.watchers[i]
+}
diff --git a/tests/helper/vm.go b/tests/helper/vm.go
index 797a2acf5..2f3ec30f7 100644
--- a/tests/helper/vm.go
+++ b/tests/helper/vm.go
@@ -15,6 +15,7 @@ type Env struct {
depth int
state *state.StateDB
skipTransfer bool
+ initial bool
Gas *big.Int
origin []byte
@@ -68,9 +69,17 @@ func (self *Env) Depth() int { return self.depth }
func (self *Env) SetDepth(i int) { self.depth = i }
func (self *Env) Transfer(from, to vm.Account, amount *big.Int) error {
if self.skipTransfer {
+ // ugly hack
+ if self.initial {
+ self.initial = false
+ return nil
+ }
+
if from.Balance().Cmp(amount) < 0 {
return errors.New("Insufficient balance in account")
}
+
+ return nil
}
return vm.Transfer(from, to, amount)
}
@@ -109,10 +118,10 @@ func RunVm(state *state.StateDB, env, exec map[string]string) ([]byte, state.Log
)
caller := state.GetOrNewStateObject(from)
- caller.SetBalance(ethutil.Big("1000000000000000000"))
vmenv := NewEnvFromMap(state, env, exec)
vmenv.skipTransfer = true
+ vmenv.initial = true
ret, err := vmenv.Call(caller, to, data, gas, price, value)
return ret, vmenv.logs, vmenv.Gas, err
diff --git a/tests/vm/gh_test.go b/tests/vm/gh_test.go
index 47b588268..699225e90 100644
--- a/tests/vm/gh_test.go
+++ b/tests/vm/gh_test.go
@@ -79,12 +79,6 @@ func RunVmTest(p string, t *testing.T) {
helper.CreateFileTests(t, p, &tests)
for name, test := range tests {
- /*
- helper.Logger.SetLogLevel(5)
- if name != "createNameRegistratorZeroMem" {
- continue
- }
- */
db, _ := ethdb.NewMemDatabase()
statedb := state.New(nil, db)
for addr, account := range test.Pre {
diff --git a/ui/qt/qwhisper/whisper.go b/ui/qt/qwhisper/whisper.go
index 8b4628a1b..becb2a29b 100644
--- a/ui/qt/qwhisper/whisper.go
+++ b/ui/qt/qwhisper/whisper.go
@@ -84,6 +84,10 @@ func (self *Whisper) Watch(opts map[string]interface{}, view *qml.Common) int {
return i
}
+func (self *Whisper) Trigger(id int) {
+ go self.Whisper.Trigger(id)
+}
+
func filterFromMap(opts map[string]interface{}) (f whisper.Filter) {
if to, ok := opts["to"].(string); ok {
f.To = crypto.ToECDSA(fromHex(to))
diff --git a/vm/vm_debug.go b/vm/vm_debug.go
index 81db45f19..255faefb0 100644
--- a/vm/vm_debug.go
+++ b/vm/vm_debug.go
@@ -50,10 +50,6 @@ func (self *DebugVm) Run(me, caller ContextRef, code []byte, value, gas, price *
vmlogger.Debugf("(%d) (%x) %x (code=%d) gas: %v (d) %x\n", self.env.Depth(), caller.Address()[:4], context.Address(), len(code), context.Gas, callData)
- if p := Precompiled[string(me.Address())]; p != nil {
- return self.RunPrecompiled(p, callData, context)
- }
-
if self.Recoverable {
// Recover from any require exception
defer func() {
@@ -70,6 +66,10 @@ func (self *DebugVm) Run(me, caller ContextRef, code []byte, value, gas, price *
}()
}
+ if p := Precompiled[string(me.Address())]; p != nil {
+ return self.RunPrecompiled(p, callData, context)
+ }
+
var (
op OpCode
@@ -513,10 +513,12 @@ func (self *DebugVm) Run(me, caller ContextRef, code []byte, value, gas, price *
// 0x40 range
case BLOCKHASH:
num := stack.Pop()
- if num.Cmp(new(big.Int).Sub(self.env.BlockNumber(), ethutil.Big256)) < 0 {
- stack.Push(ethutil.Big0)
- } else {
+
+ n := U256(new(big.Int).Sub(self.env.BlockNumber(), ethutil.Big257))
+ if num.Cmp(n) > 0 && num.Cmp(self.env.BlockNumber()) < 0 {
stack.Push(ethutil.BigD(self.env.GetHash(num.Uint64())))
+ } else {
+ stack.Push(ethutil.Big0)
}
self.Printf(" => 0x%x", stack.Peek().Bytes())
diff --git a/whisper/whisper.go b/whisper/whisper.go
index 3ff4bac5a..bdc69f199 100644
--- a/whisper/whisper.go
+++ b/whisper/whisper.go
@@ -126,6 +126,20 @@ func (self *Whisper) Watch(opts Filter) int {
})
}
+func (self *Whisper) Trigger(id int) {
+ filter := self.filters.Get(id)
+ if filter != nil {
+ for _, e := range self.messages {
+ if msg, key := self.open(e); msg != nil {
+ f := createFilter(msg, e.Topics, key)
+ if self.filters.Match(filter, f) {
+ self.filters.Notify(f, msg)
+ }
+ }
+ }
+ }
+}
+
// Main handler for passing whisper messages to whisper peer objects
func (self *Whisper) msgHandler(peer *p2p.Peer, ws p2p.MsgReadWriter) error {
wpeer := NewPeer(self, peer, ws)
@@ -227,19 +241,28 @@ func (self *Whisper) envelopes() (envelopes []*Envelope) {
}
func (self *Whisper) postEvent(envelope *Envelope) {
+ if message, key := self.open(envelope); message != nil {
+ self.filters.Notify(createFilter(message, envelope.Topics, key), message)
+ }
+}
+
+func (self *Whisper) open(envelope *Envelope) (*Message, *ecdsa.PrivateKey) {
for _, key := range self.keys {
if message, err := envelope.Open(key); err == nil || (err != nil && err == ecies.ErrInvalidPublicKey) {
- self.filters.Notify(filter.Generic{
- Str1: string(crypto.FromECDSA(key)), Str2: string(crypto.FromECDSAPub(message.Recover())),
- Data: bytesToMap(envelope.Topics),
- }, message)
- break
- } else {
- wlogger.Infoln(err)
+ return message, key
}
}
+
+ return nil, nil
}
func (self *Whisper) Protocol() p2p.Protocol {
return self.protocol
}
+
+func createFilter(message *Message, topics [][]byte, key *ecdsa.PrivateKey) filter.Filter {
+ return filter.Generic{
+ Str1: string(crypto.FromECDSA(key)), Str2: string(crypto.FromECDSAPub(message.Recover())),
+ Data: bytesToMap(topics),
+ }
+}