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
08d396fd
Commit
08d396fd
authored
Mar 10, 2015
by
Jeffrey Wilcke
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #437 from ethersphere/poc9/natspec
[WIP] Poc9/natspec
parents
0d64163f
0743d68d
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
150 additions
and
103 deletions
+150
-103
natspec.go
ethutil/natspec/natspec.go
+28
-30
natspec_js.go
ethutil/natspec/natspec_js.go
+47
-44
natspec_test.go
ethutil/natspec/natspec_test.go
+75
-29
No files found.
ethutil/natspec/natspec.go
View file @
08d396fd
package
natspec
package
natspec
import
(
import
(
"fmt"
"github.com/obscuren/otto"
"github.com/obscuren/otto"
"io/ioutil"
)
)
type
NatSpec
struct
{
type
NatSpec
struct
{
jsvm
*
otto
.
Otto
jsvm
*
otto
.
Otto
}
}
func
NewNATSpec
(
transaction
string
)
(
self
*
NatSpec
,
err
error
)
{
// TODO: should initialise with abi and userdoc jsons
func
New
()
(
self
*
NatSpec
,
err
error
)
{
self
=
new
(
NatSpec
)
self
=
new
(
NatSpec
)
self
.
jsvm
=
otto
.
New
()
self
.
jsvm
=
otto
.
New
()
code
,
err
:=
ioutil
.
ReadFile
(
"natspec.js"
)
if
err
!=
nil
{
return
}
_
,
err
=
self
.
jsvm
.
Run
(
string
(
code
)
)
_
,
err
=
self
.
jsvm
.
Run
(
natspecJS
)
if
err
!=
nil
{
if
err
!=
nil
{
return
return
}
}
...
@@ -27,39 +24,40 @@ func NewNATSpec(transaction string) (self *NatSpec, err error) {
...
@@ -27,39 +24,40 @@ func NewNATSpec(transaction string) (self *NatSpec, err error) {
return
return
}
}
self
.
jsvm
.
Run
(
"var transaction = "
+
transaction
+
";"
)
return
}
func
(
self
*
NatSpec
)
SetDescription
(
desc
string
)
(
err
error
)
{
_
,
err
=
self
.
jsvm
.
Run
(
"var expression =
\"
"
+
desc
+
"
\"
;"
)
return
return
}
}
func
(
self
*
NatSpec
)
SetABI
(
abi
string
)
(
err
error
)
{
func
(
self
*
NatSpec
)
Notice
(
transaction
,
abi
,
method
,
expression
string
)
(
string
,
error
)
{
var
err
error
_
,
err
=
self
.
jsvm
.
Run
(
"var abi = "
+
abi
+
";"
)
if
_
,
err
=
self
.
jsvm
.
Run
(
"var transaction = "
+
transaction
+
";"
);
err
!=
nil
{
return
return
""
,
fmt
.
Errorf
(
"natspec.js error setting transaction: %v"
,
err
)
}
}
func
(
self
*
NatSpec
)
SetMethod
(
method
string
)
(
err
error
)
{
_
,
err
=
self
.
jsvm
.
Run
(
"var method = '"
+
method
+
"';"
)
if
_
,
err
=
self
.
jsvm
.
Run
(
"var abi = "
+
abi
+
";"
);
err
!=
nil
{
return
return
""
,
fmt
.
Errorf
(
"natspec.js error setting abi: %v"
,
err
)
}
}
if
_
,
err
=
self
.
jsvm
.
Run
(
"var method = '"
+
method
+
"';"
);
err
!=
nil
{
return
""
,
fmt
.
Errorf
(
"natspec.js error setting method: %v"
,
err
)
}
func
(
self
*
NatSpec
)
Parse
()
string
{
if
_
,
err
=
self
.
jsvm
.
Run
(
"var expression =
\"
"
+
expression
+
"
\"
;"
);
err
!=
nil
{
return
""
,
fmt
.
Errorf
(
"natspec.js error setting expression: %v"
,
err
)
}
self
.
jsvm
.
Run
(
"var call = {method: method,abi: abi,transaction: transaction};"
)
self
.
jsvm
.
Run
(
"var call = {method: method,abi: abi,transaction: transaction};"
)
value
,
err
:=
self
.
jsvm
.
Run
(
"natspec.evaluateExpression(expression, call);"
)
value
,
err
:=
self
.
jsvm
.
Run
(
"natspec.evaluateExpression(expression, call);"
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
.
Error
()
return
""
,
fmt
.
Errorf
(
"natspec.js error evaluating expression: %v"
,
err
)
}
evalError
:=
"Natspec evaluation failed, wrong input params"
if
value
.
String
()
==
evalError
{
return
""
,
fmt
.
Errorf
(
"natspec.js error evaluating expression: wrong input params in expression '%s'"
,
expression
)
}
}
return
value
.
String
()
if
len
(
value
.
String
())
==
0
{
return
""
,
fmt
.
Errorf
(
"natspec.js error evaluating expression"
)
}
return
value
.
String
(),
nil
}
}
ethutil/natspec/natspec
.js
→
ethutil/natspec/natspec
_js.go
View file @
08d396fd
require
=
(
function
e
(
t
,
n
,
r
){
function
s
(
o
,
u
){
if
(
!
n
[
o
]){
if
(
!
t
[
o
]){
var
a
=
typeof
require
==
"function"
&&
require
;
if
(
!
u
&&
a
)
return
a
(
o
,
!
0
);
if
(
i
)
return
i
(
o
,
!
0
);
var
f
=
new
Error
(
"Cannot find module '"
+
o
+
"'"
);
throw
f
.
code
=
"MODULE_NOT_FOUND"
,
f
}
var
l
=
n
[
o
]
=
{
exports
:{}};
t
[
o
][
0
].
call
(
l
.
exports
,
function
(
e
){
var
n
=
t
[
o
][
1
][
e
];
return
s
(
n
?
n
:
e
)},
l
,
l
.
exports
,
e
,
t
,
n
,
r
)}
return
n
[
o
].
exports
}
var
i
=
typeof
require
==
"function"
&&
require
;
for
(
var
o
=
0
;
o
<
r
.
length
;
o
++
)
s
(
r
[
o
]);
return
s
})({
1
:[
function
(
require
,
module
,
exports
){
package
natspec
const
natspecJS
=
`require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
},{}],2:[function(require,module,exports){
},{}],2:[function(require,module,exports){
// shim for using process in browser
// shim for using process in browser
...
@@ -3452,8 +3454,8 @@ var natspec = (function () {
...
@@ -3452,8 +3454,8 @@ var natspec = (function () {
var mapExpressionsToEvaluate = function (expression, cb) {
var mapExpressionsToEvaluate = function (expression, cb) {
var evaluatedExpression = "";
var evaluatedExpression = "";
// match everything in
`` quotes
// match everything in
backtick
var
pattern
=
/
\`
(?:\\
.|
[^
`
\\])
*
\
`
/gim
var pattern = /\`
+
"`"
+
`(?:\\.|[^`
+
"`"
+
`\\])*\`
+
"`"
+
`/gim
var match;
var match;
var lastIndex = 0;
var lastIndex = 0;
while ((match = pattern.exec(expression)) !== null) {
while ((match = pattern.exec(expression)) !== null) {
...
@@ -3515,3 +3517,4 @@ module.exports = natspec;
...
@@ -3515,3 +3517,4 @@ module.exports = natspec;
},{"./node_modules/ethereum.js/lib/abi.js":3}]},{},[]);
},{"./node_modules/ethereum.js/lib/abi.js":3}]},{},[]);
`
ethutil/natspec/natspec_test.go
View file @
08d396fd
...
@@ -6,7 +6,7 @@ import (
...
@@ -6,7 +6,7 @@ import (
func
TestNotice
(
t
*
testing
.
T
)
{
func
TestNotice
(
t
*
testing
.
T
)
{
ns
,
err
:=
NewNATSpec
(
`
tx
:=
`
{
{
"jsonrpc": "2.0",
"jsonrpc": "2.0",
"method": "eth_call",
"method": "eth_call",
...
@@ -16,13 +16,9 @@ func TestNotice(t *testing.T) {
...
@@ -16,13 +16,9 @@ func TestNotice(t *testing.T) {
}],
}],
"id": 6
"id": 6
}
}
`
)
`
if
err
!=
nil
{
abi
:=
`
t
.
Errorf
(
"NewNATSpec error %v"
,
err
)
}
ns
.
SetABI
(
`
[{
[{
"name": "multiply",
"name": "multiply",
"constant": false,
"constant": false,
...
@@ -36,11 +32,22 @@ func TestNotice(t *testing.T) {
...
@@ -36,11 +32,22 @@ func TestNotice(t *testing.T) {
"type": "uint256"
"type": "uint256"
}]
}]
}]
}]
`
)
`
ns
.
SetDescription
(
"Will multiply `a` by 7 and return `a * 7`."
)
ns
.
SetMethod
(
"multiply"
)
notice
:=
ns
.
Parse
()
desc
:=
"Will multiply `a` by 7 and return `a * 7`."
method
:=
"multiply"
ns
,
err
:=
New
()
if
err
!=
nil
{
t
.
Errorf
(
"NewNATSpec error %v"
,
err
)
}
notice
,
err
:=
ns
.
Notice
(
tx
,
abi
,
method
,
desc
)
if
err
!=
nil
{
t
.
Errorf
(
"expected no error got %v"
,
err
)
}
expected
:=
"Will multiply 122 by 7 and return 854."
expected
:=
"Will multiply 122 by 7 and return 854."
if
notice
!=
expected
{
if
notice
!=
expected
{
...
@@ -48,4 +55,43 @@ func TestNotice(t *testing.T) {
...
@@ -48,4 +55,43 @@ func TestNotice(t *testing.T) {
}
else
{
}
else
{
t
.
Logf
(
"returned notice
\"
%v
\"
"
,
notice
)
t
.
Logf
(
"returned notice
\"
%v
\"
"
,
notice
)
}
}
notice
,
err
=
ns
.
Notice
(
tx
,
abi
,
method
,
"Will multiply 122 by
\"
7
\"
and return 854."
)
expected
=
"natspec.js error setting expression: (anonymous): Line 1:41 Unexpected number"
if
err
==
nil
{
t
.
Errorf
(
"expected error, got nothing (notice: '%v')"
,
err
,
notice
)
}
else
{
if
err
.
Error
()
!=
expected
{
t
.
Errorf
(
"expected error '%s' got '%v' (notice: '%v')"
,
expected
,
err
,
notice
)
}
}
// https://github.com/ethereum/natspec.js/issues/1
// badDesc := "Will multiply `e` by 7 and return `a * 7`."
// notice, err = ns.Notice(tx, abi, method, badDesc)
// expected = "natspec.js error evaluating expression: wrong input param in expression ''"
// if err == nil {
// t.Errorf("expected error, got nothing (notice: '%v')", notice)
// } else {
// if err.Error() != expected {
// t.Errorf("expected error '%s' got '%v' (notice: '%v')", expected, err, notice)
// }
// }
notice
,
err
=
ns
.
Notice
(
tx
,
abi
,
"missing_method"
,
desc
)
expected
=
"natspec.js error evaluating expression: wrong input params in expression 'Will multiply `a` by 7 and return `a * 7`.'"
if
err
==
nil
{
t
.
Errorf
(
"expected error, got nothing (notice: '%v')"
,
notice
)
}
else
{
if
err
.
Error
()
!=
expected
{
t
.
Errorf
(
"expected error '%s' got '%v' (notice: '%v')"
,
expected
,
err
,
notice
)
}
}
}
}
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