Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
b4bd70c4
Commit
b4bd70c4
authored
Sep 22, 2014
by
obscuren
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Re-wrote ethereum.js
parent
8585e597
Changes
8
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
698 additions
and
334 deletions
+698
-334
debugger.qml
mist/assets/debugger/debugger.qml
+4
-4
filter.js
mist/assets/ext/filter.js
+4
-4
html_messaging.js
mist/assets/ext/html_messaging.js
+341
-9
pre.js
mist/assets/ext/pre.js
+0
-38
wallet.qml
mist/assets/qml/wallet.qml
+7
-5
webapp.qml
mist/assets/qml/webapp.qml
+305
-265
debugger.go
mist/debugger.go
+1
-1
ui_lib.go
mist/ui_lib.go
+36
-8
No files found.
mist/assets/debugger/debugger.qml
View file @
b4bd70c4
...
...
@@ -221,7 +221,7 @@ ApplicationWindow {
}
height
:
parent
.
height
width
:
300
TableViewColumn
{
role
:
"value"
;
title
:
"
Temp"
;
width
:
200
}
TableViewColumn
{
role
:
"value"
;
title
:
"
Local VM stack"
;
width
:
stackTableView
.
width
-
2
}
model
:
stackModel
}
...
...
@@ -233,7 +233,7 @@ ApplicationWindow {
height
:
parent
.
height
width
:
parent
.
width
-
stackTableView
.
width
TableViewColumn
{
id
:
mnumColmn
;
role
:
"num"
;
title
:
"#"
;
width
:
50
}
TableViewColumn
{
role
:
"value"
;
title
:
"Memory"
;
width
:
7
50
}
TableViewColumn
{
role
:
"value"
;
title
:
"Memory"
;
width
:
6
50
}
model
:
memModel
}
}
...
...
@@ -248,8 +248,8 @@ ApplicationWindow {
}
height
:
parent
.
height
width
:
parent
.
width
TableViewColumn
{
id
:
key
;
role
:
"key"
;
title
:
"#"
;
width
:
storageTableView
.
width
/
2
}
TableViewColumn
{
role
:
"value"
;
title
:
"Storage"
;
width
:
storageTableView
.
width
/
2
}
TableViewColumn
{
id
:
key
;
role
:
"key"
;
title
:
"#"
;
width
:
storageTableView
.
width
/
2
-
1
}
TableViewColumn
{
role
:
"value"
;
title
:
"Storage"
;
width
:
storageTableView
.
width
/
2
-
1
}
model
:
storageModel
}
}
...
...
mist/assets/ext/filter.js
View file @
b4bd70c4
...
...
@@ -31,11 +31,11 @@ Filter.prototype.changed = function(callback) {
this
.
callbacks
.
push
(
callback
);
var
self
=
this
;
message
.
connect
(
function
(
messages
,
id
)
{
message
s
.
connect
(
function
(
messages
,
id
)
{
if
(
id
==
self
.
id
)
{
for
(
var
i
=
0
;
i
<
self
.
callbacks
.
length
;
i
++
)
{
self
.
callbacks
[
i
].
call
(
self
,
messages
);
}
for
(
var
i
=
0
;
i
<
self
.
callbacks
.
length
;
i
++
)
{
self
.
callbacks
[
i
].
call
(
self
,
messages
);
}
}
});
};
...
...
mist/assets/ext/html_messaging.js
View file @
b4bd70c4
...
...
@@ -12,15 +12,46 @@
window
.
eth
=
{
_callbacks
:
{},
_
onCallback
s
:
{},
_
event
s
:
{},
prototype
:
Object
(),
coinbase
:
function
()
{
return
new
Promise
(
function
(
resolve
,
reject
)
{
postData
({
call
:
"getCoinBase"
},
function
(
coinbase
)
{
resolve
(
coinbase
);
});
});
toHex
:
function
(
str
)
{
var
hex
=
""
;
for
(
var
i
=
0
;
i
<
str
.
length
;
i
++
)
{
var
n
=
str
.
charCodeAt
(
i
).
toString
(
16
);
hex
+=
n
.
length
<
2
?
'0'
+
n
:
n
;
}
return
hex
;
},
toAscii
:
function
(
hex
)
{
// Find termination
var
str
=
""
;
var
i
=
0
,
l
=
hex
.
length
;
for
(;
i
<
l
;
i
+=
2
)
{
var
code
=
hex
.
charCodeAt
(
i
)
if
(
code
==
0
)
{
break
;
}
str
+=
String
.
fromCharCode
(
parseInt
(
hex
.
substr
(
i
,
2
),
16
));
}
return
str
;
},
fromAscii
:
function
(
str
,
pad
)
{
if
(
pad
===
undefined
)
{
pad
=
32
}
var
hex
=
this
.
toHex
(
str
);
while
(
hex
.
length
<
pad
*
2
)
hex
+=
"00"
;
return
hex
},
block
:
function
(
numberOrHash
)
{
...
...
@@ -107,17 +138,316 @@
});
},
key
:
function
()
{
balanceAt
:
function
(
address
)
{
var
promises
=
[];
if
(
isPromise
(
address
))
{
promises
.
push
(
address
.
then
(
function
(
_address
)
{
address
=
_address
;
}));
}
return
Q
.
all
(
promises
).
then
(
function
()
{
return
new
Promise
(
function
(
resolve
,
reject
)
{
postData
({
call
:
"getBalanceAt"
,
args
:
[
address
]},
function
(
balance
)
{
resolve
(
balance
);
});
});
});
},
countAt
:
function
(
address
)
{
var
promises
=
[];
if
(
isPromise
(
address
))
{
promises
.
push
(
address
.
then
(
function
(
_address
)
{
address
=
_address
;
}));
}
return
Q
.
all
(
promises
).
then
(
function
()
{
return
new
Promise
(
function
(
resolve
,
reject
)
{
postData
({
call
:
"getCountAt"
,
args
:
[
address
]},
function
(
count
)
{
resolve
(
count
);
});
});
});
},
codeAt
:
function
(
address
)
{
var
promises
=
[];
if
(
isPromise
(
address
))
{
promises
.
push
(
address
.
then
(
function
(
_address
)
{
address
=
_address
;
}));
}
return
Q
.
all
(
promises
).
then
(
function
()
{
return
new
Promise
(
function
(
resolve
,
reject
)
{
postData
({
call
:
"getCodeAt"
,
args
:
[
address
]},
function
(
code
)
{
resolve
(
code
);
});
});
});
},
storageAt
:
function
(
address
,
storageAddress
)
{
var
promises
=
[];
if
(
isPromise
(
address
))
{
promises
.
push
(
address
.
then
(
function
(
_address
)
{
address
=
_address
;
}));
}
if
(
isPromise
(
storageAddress
))
{
promises
.
push
(
storageAddress
.
then
(
function
(
_sa
)
{
storageAddress
=
_sa
;
}));
}
return
Q
.
all
(
promises
).
then
(
function
()
{
return
new
Promise
(
function
(
resolve
,
reject
)
{
postData
({
call
:
"getStorageAt"
,
args
:
[
address
,
storageAddress
]},
function
(
entry
)
{
resolve
(
entry
);
});
});
});
},
stateAt
:
function
(
address
,
storageAddress
)
{
return
this
.
storageAt
(
address
,
storageAddress
);
},
call
:
function
(
params
)
{
if
(
params
===
undefined
)
{
params
=
{};
}
if
(
params
.
endowment
!==
undefined
)
params
.
value
=
params
.
endowment
;
if
(
params
.
code
!==
undefined
)
params
.
data
=
params
.
code
;
var
promises
=
[]
if
(
isPromise
(
params
.
to
))
{
promises
.
push
(
params
.
to
.
then
(
function
(
_to
)
{
params
.
to
=
_to
;
}));
}
if
(
isPromise
(
params
.
from
))
{
promises
.
push
(
params
.
from
.
then
(
function
(
_from
)
{
params
.
from
=
_from
;
}));
}
if
(
isPromise
(
params
.
data
))
{
promises
.
push
(
params
.
data
.
then
(
function
(
_code
)
{
params
.
data
=
_code
;
}));
}
else
{
if
(
typeof
params
.
data
===
"object"
)
{
data
=
""
;
for
(
var
i
=
0
;
i
<
params
.
data
.
length
;
i
++
)
{
data
+=
params
.
data
[
i
]
}
}
else
{
data
=
params
.
data
;
}
}
// Make sure everything is string
var
fields
=
[
"value"
,
"gas"
,
"gasPrice"
];
for
(
var
i
=
0
;
i
<
fields
.
length
;
i
++
)
{
if
(
params
[
fields
[
i
]]
===
undefined
)
{
params
[
fields
[
i
]]
=
""
;
}
params
[
fields
[
i
]]
=
params
[
fields
[
i
]].
toString
();
}
// Load promises then call the last "transact".
return
Q
.
all
(
promises
).
then
(
function
()
{
return
new
Promise
(
function
(
resolve
,
reject
)
{
postData
({
call
:
"call"
,
args
:
params
},
function
(
data
)
{
if
(
data
[
1
])
reject
(
data
[
0
]);
else
resolve
(
data
[
0
]);
});
});
})
},
watch
:
function
(
params
)
{
return
new
Filter
(
params
);
},
secretToAddress
:
function
(
key
)
{
var
promises
=
[];
if
(
isPromise
(
key
))
{
promises
.
push
(
key
.
then
(
function
(
_key
)
{
key
=
_key
;
}));
}
return
Q
.
all
(
promises
).
then
(
function
()
{
return
new
Promise
(
function
(
resolve
,
reject
)
{
postData
({
call
:
"getSecretToAddress"
,
args
:
[
key
]},
function
(
address
)
{
resolve
(
address
);
});
});
});
},
on
:
function
(
event
,
cb
)
{
if
(
eth
.
_events
[
event
]
===
undefined
)
{
eth
.
_events
[
event
]
=
[];
}
eth
.
_events
[
event
].
push
(
cb
);
return
this
},
off
:
function
(
event
,
cb
)
{
if
(
eth
.
_events
[
event
]
!==
undefined
)
{
var
callbacks
=
eth
.
_events
[
event
];
for
(
var
i
=
0
;
i
<
callbacks
.
length
;
i
++
)
{
if
(
callbacks
[
i
]
===
cb
)
{
delete
callbacks
[
i
];
}
}
}
return
this
},
trigger
:
function
(
event
,
data
)
{
var
callbacks
=
eth
.
_events
[
event
];
if
(
callbacks
!==
undefined
)
{
for
(
var
i
=
0
;
i
<
callbacks
.
length
;
i
++
)
{
// Figure out whether the returned data was an array
// array means multiple return arguments (multiple params)
if
(
data
instanceof
Array
)
{
callbacks
[
i
].
apply
(
this
,
data
);
}
else
{
callbacks
[
i
].
call
(
this
,
data
);
}
}
}
},
};
// Eth object properties
Object
.
defineProperty
(
eth
,
"key"
,
{
get
:
function
()
{
return
new
Promise
(
function
(
resolve
,
reject
)
{
postData
({
call
:
"getKey"
},
function
(
k
)
{
resolve
(
k
);
});
});
},
});
Object
.
defineProperty
(
eth
,
"gasPrice"
,
{
get
:
function
()
{
return
"1000000000000"
}
});
Object
.
defineProperty
(
eth
,
"coinbase"
,
{
get
:
function
()
{
return
new
Promise
(
function
(
resolve
,
reject
)
{
postData
({
call
:
"getCoinBase"
},
function
(
coinbase
)
{
resolve
(
coinbase
);
});
});
},
});
Object
.
defineProperty
(
eth
,
"listening"
,
{
get
:
function
()
{
return
new
Promise
(
function
(
resolve
,
reject
)
{
postData
({
call
:
"getIsListening"
},
function
(
listening
)
{
resolve
(
listening
);
});
});
},
});
Object
.
defineProperty
(
eth
,
"mining"
,
{
get
:
function
()
{
return
new
Promise
(
function
(
resolve
,
reject
)
{
postData
({
call
:
"getIsMining"
},
function
(
mining
)
{
resolve
(
mining
);
});
});
},
});
Object
.
defineProperty
(
eth
,
"peerCount"
,
{
get
:
function
()
{
return
new
Promise
(
function
(
resolve
,
reject
)
{
postData
({
call
:
"getPeerCount"
},
function
(
peerCount
)
{
resolve
(
peerCount
);
});
});
},
});
var
filters
=
[];
var
Filter
=
function
(
options
)
{
filters
.
push
(
this
);
this
.
callbacks
=
[];
this
.
options
=
options
;
var
call
;
if
(
options
===
"chain"
)
{
call
=
"newFilterString"
}
else
if
(
typeof
options
===
"object"
)
{
call
=
"newFilter"
}
var
self
=
this
;
// Cheaper than binding
this
.
promise
=
new
Promise
(
function
(
resolve
,
reject
)
{
postData
({
call
:
call
,
args
:
[
options
]},
function
(
id
)
{
self
.
id
=
id
;
resolve
(
id
);
});
});
};
Filter
.
prototype
.
changed
=
function
(
callback
)
{
var
self
=
this
;
this
.
promise
.
then
(
function
(
id
)
{
self
.
callbacks
.
push
(
callback
);
});
};
Filter
.
prototype
.
trigger
=
function
(
messages
,
id
)
{
if
(
id
==
this
.
id
)
{
for
(
var
i
=
0
;
i
<
this
.
callbacks
.
length
;
i
++
)
{
this
.
callbacks
[
i
].
call
(
this
,
messages
);
}
}
};
Filter
.
prototype
.
uninstall
=
function
()
{
this
.
promise
.
then
(
function
(
id
)
{
postData
({
call
:
"uninstallFilter"
,
args
:[
id
]});
});
};
Filter
.
prototype
.
messages
=
function
()
{
var
self
=
this
;
return
Q
.
all
([
this
.
promise
]).
then
(
function
()
{
var
id
=
self
.
id
return
new
Promise
(
function
(
resolve
,
reject
)
{
postData
({
call
:
"getMessages"
,
args
:
[
id
]},
function
(
messages
)
{
resolve
(
messages
);
});
});
});
};
// Register to the messages callback. "messages" will be emitted when new messages
// from the client have been created.
eth
.
on
(
"messages"
,
function
(
messages
,
id
)
{
for
(
var
i
=
0
;
i
<
filters
.
length
;
i
++
)
{
filters
[
i
].
trigger
(
messages
,
id
);
}
});
var
g_seed
=
1
;
function
postData
(
data
,
cb
)
{
data
.
_seed
=
Math
.
floor
(
Math
.
random
()
*
1000000
)
data
.
_seed
=
g_seed
;
if
(
cb
)
{
eth
.
_callbacks
[
data
.
_seed
]
=
cb
;
}
...
...
@@ -126,6 +456,8 @@
data
.
args
=
[];
}
g_seed
++
;
navigator
.
qt
.
postMessage
(
JSON
.
stringify
(
data
));
}
...
...
mist/assets/ext/pre.js
View file @
b4bd70c4
// Helper function for generating pseudo callbacks and sending data to the QML part of the application
function
postData
(
data
,
cb
)
{
data
.
_seed
=
Math
.
floor
(
Math
.
random
()
*
1000000
)
if
(
cb
)
{
eth
.
_callbacks
[
data
.
_seed
]
=
cb
;
}
if
(
data
.
args
===
undefined
)
{
data
.
args
=
[];
}
navigator
.
qt
.
postMessage
(
JSON
.
stringify
(
data
));
}
navigator
.
qt
.
onmessage
=
function
(
ev
)
{
var
data
=
JSON
.
parse
(
ev
.
data
)
if
(
data
.
_event
!==
undefined
)
{
eth
.
trigger
(
data
.
_event
,
data
.
data
);
}
else
{
if
(
data
.
_seed
)
{
var
cb
=
eth
.
_callbacks
[
data
.
_seed
];
if
(
cb
)
{
// Figure out whether the returned data was an array
// array means multiple return arguments (multiple params)
if
(
data
.
data
instanceof
Array
)
{
cb
.
apply
(
this
,
data
.
data
)
}
else
{
cb
.
call
(
this
,
data
.
data
)
}
// Remove the "trigger" callback
delete
eth
.
_callbacks
[
ev
.
_seed
];
}
}
}
}
if
(
typeof
(
Promise
)
===
"undefined"
)
{
window
.
Promise
=
Q
.
Promise
;
}
mist/assets/qml/wallet.qml
View file @
b4bd70c4
...
...
@@ -14,20 +14,22 @@ ApplicationWindow {
property
alias
miningButtonText
:
miningButton
.
text
property
var
ethx
:
Eth
.
ethx
property
var
web
width
:
900
height
:
60
0
width
:
1024
height
:
75
0
minimumHeight
:
300
title
:
"Mist"
// This signal is used by the filter API. The filter API connects using this signal handler from
// the different QML files and plugins.
signal
message
(
var
callback
,
int
see
d
);
signal
message
s
(
var
messages
,
int
i
d
);
function
invokeFilterCallback
(
data
,
receiverSeed
)
{
//var messages = JSON.parse(data)
// Signal handler
message
(
data
,
receiverSeed
);
messages
(
data
,
receiverSeed
);
root
.
web
.
messages
(
data
,
receiverSeed
);
}
TextField
{
...
...
@@ -44,7 +46,7 @@ ApplicationWindow {
// Takes care of loading all default plugins
Component.onCompleted
:
{
addPlugin
(
"./views/wallet.qml"
,
{
noAdd
:
true
,
close
:
false
,
section
:
"ethereum"
,
active
:
true
});
addPlugin
(
"./webapp.qml"
,
{
noAdd
:
true
,
close
:
false
,
section
:
"ethereum"
,
active
:
true
});
root
.
web
=
addPlugin
(
"./webapp.qml"
,
{
noAdd
:
true
,
close
:
false
,
section
:
"ethereum"
,
active
:
true
});
addPlugin
(
"./views/transaction.qml"
,
{
noAdd
:
true
,
close
:
false
,
section
:
"legacy"
});
addPlugin
(
"./views/chain.qml"
,
{
noAdd
:
true
,
close
:
false
,
section
:
"legacy"
});
...
...
mist/assets/qml/webapp.qml
View file @
b4bd70c4
This diff is collapsed.
Click to expand it.
mist/debugger.go
View file @
b4bd70c4
...
...
@@ -276,7 +276,7 @@ func (d *Debugger) halting(pc int, op ethvm.OpCode, mem *ethvm.Memory, stack *et
d
.
win
.
Root
()
.
Call
(
"clearStorage"
)
addr
:=
0
for
i
:=
0
;
i
+
32
<=
mem
.
Len
();
i
+=
16
{
for
i
:=
0
;
i
+
16
<=
mem
.
Len
();
i
+=
16
{
dat
:=
mem
.
Data
()[
i
:
i
+
16
]
var
str
string
...
...
mist/ui_lib.go
View file @
b4bd70c4
...
...
@@ -37,7 +37,6 @@ type UiLib struct {
jsEngine
*
javascript
.
JSRE
filterCallbacks
map
[
int
][]
int
//filters map[int]*ethpipe.JSFilter
}
func
NewUiLib
(
engine
*
qml
.
Engine
,
eth
*
eth
.
Ethereum
,
assetPath
string
)
*
UiLib
{
...
...
@@ -201,7 +200,7 @@ func (self *UiLib) UninstallFilter(id int) {
self
.
eth
.
UninstallFilter
(
id
)
}
func
(
self
*
UiLib
)
Transact
(
object
map
[
string
]
interface
{})
(
*
ethpipe
.
JSReceipt
,
error
)
{
func
mapToTxParams
(
object
map
[
string
]
interface
{})
map
[
string
]
string
{
// Default values
if
object
[
"from"
]
==
nil
{
object
[
"from"
]
=
""
...
...
@@ -223,6 +222,8 @@ func (self *UiLib) Transact(object map[string]interface{}) (*ethpipe.JSReceipt,
var
data
[]
string
if
list
,
ok
:=
object
[
"data"
]
.
(
*
qml
.
List
);
ok
{
list
.
Convert
(
&
data
)
}
else
if
str
,
ok
:=
object
[
"data"
]
.
(
string
);
ok
{
data
=
[]
string
{
str
}
}
for
_
,
str
:=
range
data
{
...
...
@@ -238,14 +239,29 @@ func (self *UiLib) Transact(object map[string]interface{}) (*ethpipe.JSReceipt,
dataStr
+=
str
}
object
[
"data"
]
=
dataStr
fmt
.
Println
(
object
)
conv
:=
make
(
map
[
string
]
string
)
for
key
,
value
:=
range
object
{
if
v
,
ok
:=
value
.
(
string
);
ok
{
conv
[
key
]
=
v
}
}
return
conv
}
func
(
self
*
UiLib
)
Transact
(
params
map
[
string
]
interface
{})
(
*
ethpipe
.
JSReceipt
,
error
)
{
object
:=
mapToTxParams
(
params
)
return
self
.
JSPipe
.
Transact
(
object
[
"from"
]
.
(
string
)
,
object
[
"to"
]
.
(
string
)
,
object
[
"value"
]
.
(
string
)
,
object
[
"gas"
]
.
(
string
)
,
object
[
"gasPrice"
]
.
(
string
)
,
dataStr
,
object
[
"from"
],
object
[
"to"
],
object
[
"value"
],
object
[
"gas"
],
object
[
"gasPrice"
],
object
[
"data"
]
,
)
}
...
...
@@ -257,3 +273,15 @@ func (self *UiLib) Compile(code string) (string, error) {
return
ethutil
.
Bytes2Hex
(
bcode
),
err
}
func
(
self
*
UiLib
)
Call
(
params
map
[
string
]
interface
{})
(
string
,
error
)
{
object
:=
mapToTxParams
(
params
)
return
self
.
JSPipe
.
Execute
(
object
[
"to"
],
object
[
"value"
],
object
[
"gas"
],
object
[
"gasPrice"
],
object
[
"data"
],
)
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment