mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-03-25 20:45:43 +00:00
move emscripten build to separate repository (hd-wallet/fastxpub)
This commit is contained in:
parent
c950342063
commit
8d0852403c
15
.travis.yml
15
.travis.yml
@ -27,21 +27,6 @@ script:
|
||||
- ITERS=10 py.test
|
||||
- mkdir _build && cd _build && cmake .. && make && cd ..
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- env: BUILD=emscripten
|
||||
script:
|
||||
- cd emscripten && rm trezor-crypto.js && make docker-build && make test-correctness && cd ..
|
||||
services:
|
||||
- docker
|
||||
sudo: required
|
||||
install: true
|
||||
compiler: true
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- nodejs
|
||||
|
||||
notifications:
|
||||
webhooks:
|
||||
urls:
|
||||
|
2
emscripten/.gitignore
vendored
2
emscripten/.gitignore
vendored
@ -1,2 +0,0 @@
|
||||
node_modules/
|
||||
benchmark-browserify.js
|
@ -1,37 +0,0 @@
|
||||
EMFLAGS = \
|
||||
-Os --closure 1 \
|
||||
--memory-init-file 0 \
|
||||
--pre-js pre.js --post-js post.js \
|
||||
-I ../ed25519-donna \
|
||||
-s EXPORTED_FUNCTIONS='["_hdnode_public_ckd_address_optimized", "_ecdsa_read_pubkey"]'
|
||||
|
||||
SRC = ../bignum.c ../ecdsa.c ../secp256k1.c ../hmac.c ../bip32.c \
|
||||
../base58.c ../ripemd160.c ../sha2.c ../rand.c ../address.c
|
||||
|
||||
all: trezor-crypto.js benchmark-browserify.js
|
||||
|
||||
trezor-crypto.js: $(SRC)
|
||||
emcc $(EMFLAGS) -o $@ $^
|
||||
|
||||
benchmark-browserify.js: node_modules trezor-crypto.js benchmark.js
|
||||
$(shell npm bin)/browserify benchmark.js -o $@ --noparse=`pwd`/trezor-crypto.js
|
||||
@echo "open benchmark.html in your favourite browser"
|
||||
|
||||
benchmark-node: node_modules trezor-crypto.js benchmark.js
|
||||
node benchmark.js
|
||||
|
||||
node_modules:
|
||||
npm install
|
||||
npm install browserify
|
||||
|
||||
clean:
|
||||
rm -f trezor-crypto.js benchmark-browserify.js
|
||||
|
||||
docker:
|
||||
docker run --rm -i -v $(shell pwd)/..:/src -t apiaryio/emcc /bin/bash
|
||||
|
||||
docker-build:
|
||||
docker run --rm -v $(shell pwd)/..:/src apiaryio/emcc /bin/bash -c 'cd emscripten && make'
|
||||
|
||||
test-correctness: node_modules
|
||||
node test-correctness.js test-correctness-segwit-p2sh.js
|
@ -1,8 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<script async src="benchmark-browserify.js"></script>
|
||||
</body>
|
||||
</html>
|
@ -1,98 +0,0 @@
|
||||
var crypto = require('./trezor-crypto');
|
||||
var bitcoin = require('bitcoinjs-lib');
|
||||
|
||||
var XPUB =
|
||||
'xpub6AHA9hZDN11k2ijHMeS5QqHx2KP9aMBRhTDqANMnwVtdyw2TDYRm' +
|
||||
'F8PjpvwUFcL1Et8Hj59S3gTSMcUQ5gAqTz3Wd8EsMTmF3DChhqPQBnU';
|
||||
var node = bitcoin.HDNode.fromBase58(XPUB).derive(0);
|
||||
|
||||
var nodeStruct = {
|
||||
depth: node.depth,
|
||||
child_num: node.index,
|
||||
fingerprint: node.parentFingerprint,
|
||||
chain_code: node.chainCode,
|
||||
public_key: node.keyPair.getPublicKeyBuffer()
|
||||
};
|
||||
|
||||
var suite;
|
||||
var worker;
|
||||
|
||||
if (typeof Worker !== 'undefined') {
|
||||
console.log('enabling web worker benchmark');
|
||||
worker = new Worker('./trezor-crypto.js');
|
||||
worker.onerror = function (error) {
|
||||
console.error('worker:', error);
|
||||
};
|
||||
suite = [
|
||||
// benchBitcoinJS,
|
||||
// benchBrowserify,
|
||||
benchWorker
|
||||
];
|
||||
} else {
|
||||
suite = [
|
||||
benchBitcoinJS,
|
||||
benchBrowserify
|
||||
];
|
||||
}
|
||||
|
||||
benchmark(suite, 1000, 1000);
|
||||
|
||||
function benchmark(suite, delay, ops) {
|
||||
(function cycle(i) {
|
||||
setTimeout(function () {
|
||||
var benchmark = suite[i];
|
||||
runBenchmark(benchmark, ops, function (runtime) {
|
||||
printResult(benchmark, ops, runtime);
|
||||
cycle(i+1 < suite.length ? i+1 : 0);
|
||||
});
|
||||
}, delay);
|
||||
}(0));
|
||||
}
|
||||
|
||||
function benchBitcoinJS(ops, fn) {
|
||||
var i;
|
||||
for (i = 0; i < ops; i++) {
|
||||
node.derive(i).getAddress();
|
||||
}
|
||||
fn();
|
||||
}
|
||||
|
||||
function benchBrowserify(ops, fn) {
|
||||
var i;
|
||||
crypto.serializeNode(nodeStruct);
|
||||
for (i = 0; i < ops; i++) {
|
||||
crypto.deriveAddress(i, 0);
|
||||
}
|
||||
fn();
|
||||
}
|
||||
|
||||
function benchWorker(ops, fn) {
|
||||
worker.onmessage = function (event) {
|
||||
fn();
|
||||
};
|
||||
worker.postMessage({
|
||||
type: 'deriveAddressRange',
|
||||
node: nodeStruct,
|
||||
from: 0,
|
||||
to: ops - 1,
|
||||
version: 0
|
||||
});
|
||||
}
|
||||
|
||||
function runBenchmark(benchmark, ops, fn) {
|
||||
var start = new Date();
|
||||
benchmark(ops, function () {
|
||||
var end = new Date();
|
||||
fn(end - start);
|
||||
});
|
||||
}
|
||||
|
||||
function printResult(benchmark, ops, runtime) {
|
||||
var opssec = (ops / runtime) * 1000;
|
||||
console.log(
|
||||
benchmark.name,
|
||||
'ops #', ops,
|
||||
'runtime', runtime / 1000,
|
||||
'sec, ops/sec', opssec
|
||||
);
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
{
|
||||
"name": "trezor-crypto-test",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"dependencies": {
|
||||
"bitcoinjs-lib": "^2.1.1"
|
||||
}
|
||||
}
|
@ -1,115 +0,0 @@
|
||||
/*
|
||||
typedef struct {
|
||||
uint32_t depth;
|
||||
uint32_t fingerprint;
|
||||
uint32_t child_num;
|
||||
uint8_t chain_code[32];
|
||||
uint8_t private_key[32];
|
||||
uint8_t public_key[33];
|
||||
} HDNode;
|
||||
*/
|
||||
|
||||
var HEAPU8 = Module['HEAPU8'];
|
||||
var _malloc = Module['_malloc'];
|
||||
var _hdnode_public_ckd_address_optimized = Module['_hdnode_public_ckd_address_optimized'];
|
||||
var _ecdsa_read_pubkey = Module['_ecdsa_read_pubkey'];
|
||||
var Pointer_stringify = Module['Pointer_stringify'];
|
||||
|
||||
// HDNode structs global
|
||||
var PUBPOINT_SIZE = 2 * 9 * 4; // (2 * bignum256 (= 9 * uint32_t))
|
||||
var _pubpoint = _malloc(PUBPOINT_SIZE);
|
||||
var PUBKEY_SIZE = 33;
|
||||
var _pubkey = _malloc(PUBKEY_SIZE);
|
||||
var CHAINCODE_SIZE = 32;
|
||||
var _chaincode = _malloc(CHAINCODE_SIZE);
|
||||
|
||||
// address string global
|
||||
var ADDRESS_SIZE = 60; // maximum size
|
||||
var _address = _malloc(ADDRESS_SIZE);
|
||||
|
||||
/*
|
||||
* public library interface
|
||||
*/
|
||||
|
||||
/**
|
||||
* @param {HDNode} node HDNode struct, see the definition above
|
||||
*/
|
||||
function serializeNode(node) {
|
||||
var u8_pubkey = new Uint8Array(33);
|
||||
u8_pubkey.set(node['public_key'], 0);
|
||||
HEAPU8.set(u8_pubkey, _pubkey);
|
||||
|
||||
var u8_chaincode = new Uint8Array(32);
|
||||
u8_chaincode.set(node['chain_code'], 0);
|
||||
HEAPU8.set(u8_chaincode, _chaincode);
|
||||
|
||||
_ecdsa_read_pubkey(0, _pubkey, _pubpoint);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Number} index BIP32 index of the address
|
||||
* @param {Number} version address version byte
|
||||
* @return {String}
|
||||
*/
|
||||
function deriveAddress(index, version, segwit) {
|
||||
_hdnode_public_ckd_address_optimized(_pubpoint, _chaincode, index, version, _address, ADDRESS_SIZE, segwit);
|
||||
return Pointer_stringify(_address);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {HDNode} node HDNode struct, see the definition above
|
||||
* @param {Number} firstIndex index of the first address
|
||||
* @param {Number} lastIndex index of the last address
|
||||
* @param {Number} version address version byte
|
||||
* @return {Array<String>}
|
||||
*/
|
||||
function deriveAddressRange(node, firstIndex, lastIndex, version, segwit) {
|
||||
var addresses = [];
|
||||
serializeNode(node);
|
||||
var i;
|
||||
for (i = firstIndex; i <= lastIndex; i++) {
|
||||
addresses.push(deriveAddress(i, version, segwit));
|
||||
}
|
||||
return addresses;
|
||||
}
|
||||
|
||||
if (typeof module !== 'undefined') {
|
||||
module['exports'] = {
|
||||
'serializeNode': serializeNode,
|
||||
'deriveAddress': deriveAddress,
|
||||
'deriveAddressRange': deriveAddressRange
|
||||
};
|
||||
}
|
||||
|
||||
/*
|
||||
* Web worker processing
|
||||
*/
|
||||
|
||||
function processMessage(event) {
|
||||
var data = event['data'];
|
||||
var type = data['type'];
|
||||
|
||||
switch (type) {
|
||||
case 'deriveAddressRange':
|
||||
var addresses = deriveAddressRange(
|
||||
data['node'],
|
||||
data['firstIndex'],
|
||||
data['lastIndex'],
|
||||
data['version'],
|
||||
!!data['segwit']
|
||||
);
|
||||
self.postMessage({
|
||||
'addresses': addresses,
|
||||
'firstIndex': data['firstIndex'],
|
||||
'lastIndex': data['lastIndex']
|
||||
});
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new Error('Unknown message type: ' + type);
|
||||
}
|
||||
}
|
||||
|
||||
if (ENVIRONMENT_IS_WORKER) {
|
||||
self.onmessage = processMessage;
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
// stub importScripts for the faulty detection of web worker env
|
||||
if (typeof importScripts === 'undefined'
|
||||
&& typeof WorkerGlobalScope !== 'undefined'
|
||||
&& this instanceof WorkerGlobalScope
|
||||
) {
|
||||
this.importScripts = function () {
|
||||
throw new Error('importScripts is a stub');
|
||||
};
|
||||
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,30 +0,0 @@
|
||||
var crypto = require('./trezor-crypto');
|
||||
var bitcoin = require('bitcoinjs-lib');
|
||||
|
||||
var XPUB =
|
||||
'xpub6CVKsQYXc9awxgV1tWbG4foDvdcnieK2JkbpPEBKB5WwAPKBZ1mstLbKVB4ov7QzxzjaxNK6EfmNY5Jsk2cG26EVcEkycGW4tchT2dyUhrx';
|
||||
var node = bitcoin.HDNode.fromBase58(XPUB).derive(0);
|
||||
|
||||
var nodeStruct = {
|
||||
depth: node.depth,
|
||||
child_num: node.index,
|
||||
fingerprint: node.parentFingerprint,
|
||||
chain_code: node.chainCode,
|
||||
public_key: node.keyPair.getPublicKeyBuffer()
|
||||
};
|
||||
|
||||
var addresses = crypto.deriveAddressRange(nodeStruct, 0, 999, 5, true);
|
||||
|
||||
var fs = require('fs');
|
||||
var loaded = fs.readFileSync('test-addresses-segwit-p2sh.txt').toString().split("\n");
|
||||
|
||||
for (var i = 0; i < 1000; i++) {
|
||||
if (loaded[i] !== addresses[i]) {
|
||||
console.log("bad address", i);
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
console.log("Testing address ended correctly");
|
||||
process.exit(0)
|
||||
|
@ -1,30 +0,0 @@
|
||||
var crypto = require('./trezor-crypto');
|
||||
var bitcoin = require('bitcoinjs-lib');
|
||||
|
||||
var XPUB =
|
||||
'xpub6BiVtCpG9fQPxnPmHXG8PhtzQdWC2Su4qWu6XW9tpWFYhxydCLJGrWBJZ5H6qTAHdPQ7pQhtpjiYZVZARo14qHiay2fvrX996oEP42u8wZy';
|
||||
var node = bitcoin.HDNode.fromBase58(XPUB).derive(0);
|
||||
|
||||
var nodeStruct = {
|
||||
depth: node.depth,
|
||||
child_num: node.index,
|
||||
fingerprint: node.parentFingerprint,
|
||||
chain_code: node.chainCode,
|
||||
public_key: node.keyPair.getPublicKeyBuffer()
|
||||
};
|
||||
|
||||
var addresses = crypto.deriveAddressRange(nodeStruct, 0, 999, 0, false);
|
||||
|
||||
var fs = require('fs');
|
||||
var loaded = fs.readFileSync('test-addresses.txt').toString().split("\n");
|
||||
|
||||
for (var i = 0; i < 1000; i++) {
|
||||
if (loaded[i] !== addresses[i]) {
|
||||
console.log("bad address", i);
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
console.log("Testing address ended correctly");
|
||||
process.exit(0)
|
||||
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user