Closed fanatid closed 3 years ago
At creation moment optimized release WASM file is ~400KB, what is insane.
My crappy wasm-pack WASM which did so many bad inefficient rust things was 153KB... but when it is gzipped it is reduced by size 65%.
Maybe some of the optimization tools I used (like wee_alloc and the WASM strippers I used in the docker command etc.) will help. I see you are already using wasm-opt.
wasm-strip
https://github.com/WebAssembly/wabt
wee_alloc
https://github.com/rustwasm/wee_alloc
This PR is historic and godlike.
Moving JS libraries to depend on libsecp256k1 via a slim interface built from a single rust code base compiled into WASM and NAPI/NEON bindings is a huge leap towards having a "less insecure" JS Bitcoin ecosystem.
My crappy wasm-pack WASM which did so many bad inefficient rust things was 153KB
wasm-bindgen
which wasm-pack
uses under the hood is an awesome project. Currently, 400KB because std allocator (but I hope that I'll able to exclude it completely), all functions from bitcoin-core/secp256k1
exported, etc...
Just checked junderw/tiny-secp256k1-wasm master and I get 289KB (91KB after gzip) for wasm-bindgen
+ wasm-strip
+ wasm-opt
.
I'm not sure what secp256k1.wasm in bitauth/libauth include, but size is 176KB. This looks like a good size.
Finally, first benchmark! Wasm vs js: 2x for sign and pk creation, 4x for verify, etc.
opt-level-3.so 1447000
opt-level-s.so 1353608
opt-level-z.so 1352792
after strip
:
opt-level-3.so 383104
opt-level-s.so 309376
opt-level-z.so 309376
-Z build-std=panic_abort,std | size | size, after strip |
---|---|---|
yes | 405208 | 366720 |
no | 1448176 | 383104 |
Need few more things:
examples/react-app
to gh-pages
but this should not prevent review.
Hope that review will not take a long time @junderw :laughing:
I am still in the middle of review.
One quick fix I would like to see:
Changed to ES6 import only in https://github.com/fanatid/tiny-secp256k1/pull/16
tACK 364b416568e325510c1899d6661510ba1ccffcd1
Leftover tasks:
npm pack
and try to get the same hash, or figure out why diff is occurring...Moved to #55
WIP... huge upgrade: move from C++ Node.js addon (NAN) and JS (elliptic) to WebAssembly and Rust Node.js addon (~probably napi, or maybe neon?~ napi).
At the moment of creating pull request:
Next steps for moving pull request from the draft:
secp256k1-sys
. https://github.com/fanatid/tiny-secp256k1/pull/3secp256k1
FFI crate.~profile.release
inCargo.toml
,#![no_std]
)~, or use optionalDependencies? https://github.com/fanatid/tiny-secp256k1/pull/8import
will be good for browsers, while for Node.js we will need to convert our code torequire
.~ https://github.com/fanatid/tiny-secp256k1/pull/4/I hope that I can handle all this :sweat_smile: