Skip to content

Commit a58c81e

Browse files
takeutakpetermetz
authored andcommitted
feat(Validator): Validator on Ethereum-specific Ledger Plugin
Signed-off-by: Takuma TAKEUCHI <[email protected]>
1 parent 1627c95 commit a58c81e

38 files changed

+1399
-0
lines changed

packages/ledger-plugin/.gitkeep

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
core/node_modules/
2+
core/package-lock.json
3+
dependent/node_modules/
4+
dependent/package-lock.json
5+
core/npm-debug.log
6+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<!--
2+
Copyright 2019-2020 Fujitsu Laboratories Ltd.
3+
SPDX-License-Identifier: Apache-2.0
4+
5+
README.md
6+
-->
7+
# Validator of Ethereum-speicific Ledger Plugin
8+
9+
## Assumption
10+
- A ledger (Ethereum node) to connect is already running
11+
- Specify URL of the ledger node to connect to in "provider" of "PluginConfig.js"
12+
13+
## Execution
14+
<pre>
15+
cd core
16+
node ./bin/www.js
17+
</pre>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Copyright 2019-2020 Fujitsu Laboratories Ltd.
2+
# SPDX-License-Identifier: Apache-2.0
3+
FROM hyperledger/fabric-ccenv:x86_64-1.0.4
4+
#ENV http_proxy $HTTP_PROXY
5+
#ENV https_proxy $HTTP_PROXY
6+
#ENV HTTP_PROXY $HTTP_PROXY
7+
#ENV HTTPS_PROXY $HTTP_PROXY
8+
#ENV NO_PROXY "rest-server,ec1-connector,ec2-connector,geth1,geth2"
9+
RUN apt update
10+
RUN apt-get install -y screen
11+
RUN apt-get install -y npm
12+
#RUN npm -g config set proxy $HTTP_PROXY
13+
RUN npm -g install n
14+
RUN n --version
15+
RUN n 8.9.0
16+
RUN npm -g install express
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIBdTCCARoCCQC/F+Mh551QzDAKBggqhkjOPQQDAjBCMQswCQYDVQQGEwJKUDEQ
3+
MA4GA1UECAwHZXNqbXMxMjEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkg
4+
THRkMB4XDTE4MDYyNzA3MjIzNVoXDTI4MDYyNDA3MjIzNVowQjELMAkGA1UEBhMC
5+
SlAxEDAOBgNVBAgMB2Vzam1zMTIxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMg
6+
UHR5IEx0ZDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDPpSD2w0zrqJKraGD1b
7+
5Jq2sDuacThSUqi7fvz8oyrWtuKDjZ15zIaSOtak6XRxFh9V9Gokdg5GNbW/pTZc
8+
TuowCgYIKoZIzj0EAwIDSQAwRgIhAKH6ERsyd5bpEMIkY4clPqguwDWoTLk2VKq6
9+
ONEhUqotAiEA4yJxGmZpFdRScG2gDUIF2VDeX+XfHdJI2J41hyW9/zI=
10+
-----END CERTIFICATE-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
-----BEGIN CERTIFICATE REQUEST-----
2+
MIH9MIGkAgEAMEIxCzAJBgNVBAYTAkpQMRAwDgYDVQQIDAdlc2ptczEyMSEwHwYD
3+
VQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwWTATBgcqhkjOPQIBBggqhkjO
4+
PQMBBwNCAAQz6Ug9sNM66iSq2hg9W+SatrA7mnE4UlKou378/KMq1rbig42decyG
5+
kjrWpOl0cRYfVfRqJHYORjW1v6U2XE7qoAAwCgYIKoZIzj0EAwIDSAAwRQIgCUA1
6+
B5mZK7Hx79J1xBb0MGwuoUkt4bGPXbHqWEMZXQMCIQCRgadPkrNw56+pT5MVxA5K
7+
vV6xTgmxUYrYnpkR4tptqQ==
8+
-----END CERTIFICATE REQUEST-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
-----BEGIN EC PARAMETERS-----
2+
BggqhkjOPQMBBw==
3+
-----END EC PARAMETERS-----
4+
-----BEGIN EC PRIVATE KEY-----
5+
MHcCAQEEICIlCfK3zMTFzUgdaj01LAHjJmHlbg6Xql9+i70iPz5EoAoGCCqGSM49
6+
AwEHoUQDQgAEM+lIPbDTOuokqtoYPVvkmrawO5pxOFJSqLt+/PyjKta24oONnXnM
7+
hpI61qTpdHEWH1X0aiR2DkY1tb+lNlxO6g==
8+
-----END EC PRIVATE KEY-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright 2019-2020 Fujitsu Laboratories Ltd.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*
5+
* app.js
6+
*/
7+
8+
/* Summary:
9+
*
10+
*/
11+
12+
var express = require('express');
13+
var cookieParser = require('cookie-parser');
14+
var bodyParser = require('body-parser');
15+
16+
var app = express();
17+
18+
app.use(bodyParser.json());
19+
app.use(bodyParser.urlencoded({ extended: false }));
20+
app.use(cookieParser());
21+
22+
// catch 404 and forward to error handler
23+
app.use(function(req, res, next) {
24+
var err = new Error('Not Found');
25+
err.status = 404;
26+
next(err);
27+
});
28+
29+
// error handler
30+
app.use(function(err, req, res, next) {
31+
// set locals, only providing error in development
32+
res.locals.message = err.message;
33+
res.locals.error = req.app.get('env') === 'development' ? err : {};
34+
35+
// render the error page
36+
res.status(err.status || 500);
37+
console.log(err);
38+
res.send(err);
39+
});
40+
41+
module.exports = app;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
* Copyright 2019-2020 Fujitsu Laboratories Ltd.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*
5+
* default.js
6+
*/
7+
8+
module.exports = {
9+
// Defined value for the destination independent part.
10+
// Destination dependent definition values should be in lib/PluginConfig.js.
11+
"sslParam" : {
12+
"port" : 5050,
13+
"key" : './CA/connector.priv',
14+
"cert" : './CA/connector.crt'
15+
},
16+
// Log level (trace/debug/info/warn/error/fatal)
17+
"logLevel" : "debug"
18+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"name": "connector",
3+
"version": "0.0.0",
4+
"private": true,
5+
"scripts": {
6+
"start": "node ./bin/www"
7+
},
8+
"dependencies": {
9+
"body-parser": "~1.17.1",
10+
"config": "^1.26.1",
11+
"cookie-parser": "~1.4.3",
12+
"debug": "~4.1.1",
13+
"express": "~4.15.2",
14+
"log4js": "^3.0.6",
15+
"morgan": "~1.8.1",
16+
"serve-favicon": "~2.4.2",
17+
"socket.io": "^2.0.4"
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
* Copyright 2019-2020 Fujitsu Laboratories Ltd.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*
5+
* PluginConfig.js
6+
*/
7+
8+
/*
9+
* Summary:
10+
* Configuration file of cooperation server: a part dependent on end-chains
11+
* Definition values specific to the connection dependent part, etc.
12+
*/
13+
14+
module.exports = {
15+
// URL to operate and monitor
16+
//"provider" : 'http://geth1:8545'
17+
"provider" : 'http://localhost:8545'
18+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* Copyright 2019-2020 Fujitsu Laboratories Ltd.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*
5+
* PluginUtil.js
6+
*/
7+
8+
/*
9+
* Summary:
10+
* Cooperation server: utility library dependent on endchains
11+
* For example, implementing internal functions that should not be exposed as functions of server plugins.
12+
*/
13+
14+
/*
15+
* convNum
16+
*
17+
* @param {String/Number} value: The scientific string or numeric value to be converted. For numbers, it is returned as is.
18+
* @param {String/Number} default_value: The value to use if conversion was not possible. Text or number in scientific notation. Optional.
19+
*
20+
* @return {Number} The value converted to a number, or the default_value if the conversion failed.
21+
*
22+
* @desc exponentiation is also supported. The following formats are supported:. (value, default_value)
23+
* 3.78*10^14
24+
* 3.78e14
25+
*/
26+
exports.convNum = function(value, default_value) {
27+
var retvalue = 0;
28+
var def_value = 0;
29+
30+
switch(typeof(default_value)) {
31+
case "number":
32+
def_value = default_value;
33+
break;
34+
case "string":
35+
var def_value_str = default_value.replace(/\*10\^/g, "e");
36+
def_value = parseFloat(def_value_str);
37+
break;
38+
default: // undefined should also be included here.
39+
// Fixed value because of cumbersome handling.
40+
def_value = 0;
41+
break;
42+
} // switch(typeof(default_value))
43+
44+
if(def_value==NaN) { // number is guaranteed.
45+
def_value = 0;
46+
}
47+
48+
switch(typeof(value)) {
49+
case "number":
50+
retvalue = value;
51+
break;
52+
case "string":
53+
var value_str = value.replace(/\*10\^/g, "e");
54+
retvalue = parseFloat(value_str);
55+
break;
56+
default:
57+
// Set default value.
58+
retvalue = def_value;
59+
break;
60+
} // switch(typeof(value))
61+
62+
if(retvalue==NaN) { // number is guaranteed.
63+
retvalue = def_value;
64+
}
65+
66+
return retvalue;
67+
}
68+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
/*
2+
* Copyright 2019-2020 Fujitsu Laboratories Ltd.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*
5+
* ServerMonitorPlugin.js
6+
*/
7+
8+
/*
9+
* Summary:
10+
* Connector: monitoring class of a part dependent on end-chains
11+
* Used in the case of monitoring continuously.
12+
* Processing that ends with the acceptance of a single event is handled by a custom function implementation in server plugins.
13+
* Unlike server plugins, it basically does not handle its own functions.
14+
*/
15+
16+
// configuration file
17+
var SplugConfig = require('./PluginConfig.js');
18+
var config = require('config');
19+
// Log settings
20+
var log4js = require('log4js');
21+
var logger = log4js.getLogger('ServerMonitorPlugin[' + process.pid + ']');
22+
logger.level = config.logLevel;
23+
// Load libraries, SDKs, etc. according to specifications of endchains as needed
24+
var Web3 = require('web3');
25+
26+
/*
27+
* ServerMonitorPlugin
28+
* Class definitions of server monitoring
29+
*/
30+
var ServerMonitorPlugin = class {
31+
/*
32+
* constructors
33+
*/
34+
constructor(){
35+
// Define dependent specific settings
36+
// Initialize monitored filter
37+
this._filterTable = {};
38+
}
39+
40+
/*
41+
* startMonitor
42+
* Start Monitoring
43+
* @param {string} clientId: Client ID from which monitoring start request was made
44+
* @param {function} cb: A callback function that receives monitoring results at any time.
45+
*/
46+
startMonitor(clientId, cb) {
47+
logger.info('*** START MONITOR ***');
48+
logger.info('Client ID :' + clientId);
49+
// Implement handling to receive events from an end-chain and return them in a callback function
50+
var filter = this._filterTable[clientId];
51+
if (!filter) {
52+
logger.info('create new web3 filter and start watching.');
53+
try {
54+
var web3 = new Web3();
55+
var provider = new web3.providers.HttpProvider(SplugConfig.provider);
56+
web3.setProvider(provider);
57+
filter = web3.eth.filter("latest");
58+
// filter should be managed by client ID
59+
// (You should never watch multiple urls from the same client)
60+
this._filterTable[clientId] = filter;
61+
filter.watch(function (error, blockHash) {
62+
if (!error) {
63+
console.log('##[HL-BC] Notify new block data(D2)');
64+
var blockData = web3.eth.getBlock(blockHash, true);
65+
var trLength = blockData.transactions.length;
66+
logger.info(trLength + " transactions in block " + blockData.number);
67+
console.log('##[HL-BC] Validate transactions(D3)');
68+
console.log('##[HL-BC] digital sign on valid transaction(D4)');
69+
if (trLength > 0) {
70+
logger.info('*** SEND BLOCK DATA ***');
71+
// Notify only if transaction exists
72+
var ret_obj = {
73+
"status" : 200,
74+
"blockData" : blockData
75+
};
76+
cb(ret_obj);
77+
}
78+
} else {
79+
var err_obj = {
80+
"status" : 504,
81+
"errorDetail" : error
82+
};
83+
cb(err_obj);
84+
}
85+
});
86+
} catch (e) {
87+
var emsg = e.toString().replace(/Error: /g , "");
88+
var err_obj = {
89+
"status" : 504,
90+
"errorDetail" : emsg
91+
};
92+
cb(err_obj);
93+
}
94+
} else {
95+
logger.info('target filter has already start watching.');
96+
}
97+
}
98+
99+
/*
100+
* stopMonitor
101+
* monitoring stop
102+
* @param {string} clientId: Client ID from which monitoring stop request was made
103+
*/
104+
stopMonitor(clientId) {
105+
// Implement a process to end EC monitoring
106+
var filter = this._filterTable[clientId];
107+
if (filter) {
108+
// Stop the filter & Remove it from table
109+
logger.info('stop watching and remove filter.');
110+
filter.stopWatching();
111+
delete this._filterTable[clientId];
112+
}
113+
}
114+
115+
} /* class */
116+
117+
module.exports = ServerMonitorPlugin;
118+

0 commit comments

Comments
 (0)