vulpemventures / secp256k1-zkp

JavaScript bindings of libsecp256k1-zkp with support for pedersen commitments and range proofs.
MIT License
15 stars 10 forks source link

Trying to compile wasm with a newer emcc #13

Open asoltys opened 3 years ago

asoltys commented 3 years ago

Hi, I've been down a bit of a rabbit hole this morning. I'm trying to use the confidential.unblindOutput function but getting an error in my browser console:

liquidjs-lib.js:2628 Uncaught (in promise) ReferenceError: tempDouble is not defined
    at Object.setValue (liquidjs-lib.js:2628)
    at Object.rewind (liquidjs-lib.js:4583)
    at Object.unblindOutput (liquidjs-lib.js:8969)
    at unblind (wallet.js:73)

I think it may be related to this issue: https://github.com/emscripten-core/emscripten/issues/8774

Possibly I'm just noticing this because I've bundled liquidjs-lib with rollup to use as an ES module and I guess that makes it run in strict mode.

I noticed the docker image FROM apiaryio/emcc:latest that's used to compile the secp lib into wasm is a few years old so I tried switching to the newer official image emscripten/emsdk but then got some errors when running the compile step:

emcc: warning: linking a library with `-shared` will emit a static object file.  This is a form of emulation to support existing build systems.  If you want to build a runti
me shared library use the SIDE_MODULE setting. [-Wemcc]                                                                                                                      
emcc: warning: ignoring unsupported linker flag: `-soname` [-Wlinkflags]                                                                                                     
  CCLD     bench_verify                                                                                                                                                      
  CCLD     bench_sign                                                                                                                                                        
  CCLD     bench_generator                                                                                                                                                   
  CCLD     bench_ecdh                                                                                                                                                        
  CCLD     bench_rangeproof                                                                                                                                                  
wasm-ld: error: duplicate symbol: secp256k1_context_preallocated_size 

emcc: warning: ignoring unsupported linker flag: `-soname` [-Wlinkflags]                                                                                                     
  CCLD     bench_verify                                                                                                                                                      
  CCLD     bench_sign                                                                                                                                                        
  CCLD     bench_generator                                                                                                                                                   
  CCLD     bench_ecdh                                                                                                                                                        
  CCLD     bench_rangeproof                                                                                                                                                  
wasm-ld: error: duplicate symbol: secp256k1_context_preallocated_size                                                                                                        
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)                                                                                               
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o                                                                                                                 

wasm-ld: error: duplicate symbol: secp256k1_context_preallocated_clone_size                                                                                                  
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)                                                                                               
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o                                                                                                                 

wasm-ld: error: duplicate symbol: secp256k1_context_preallocated_create                                                                                                      
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)                                                                                               
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o                                                                                                                 

wasm-ld: error: duplicate symbol: secp256k1_context_create                                                                                                                   
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)                                                                                               
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o                                                                                                                 

wasm-ld: error: duplicate symbol: secp256k1_context_preallocated_clone                                                                                                       
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)                                                                                               
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o                                                                                                                 

wasm-ld: error: duplicate symbol: secp256k1_context_clone
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o

wasm-ld: error: duplicate symbol: secp256k1_context_preallocated_destroy
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o

wasm-ld: error: duplicate symbol: secp256k1_context_no_precomp
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o

wasm-ld: error: duplicate symbol: secp256k1_context_clone
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o

wasm-ld: error: duplicate symbol: secp256k1_context_preallocated_destroy
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o

wasm-ld: error: duplicate symbol: secp256k1_context_no_precomp
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o

wasm-ld: error: duplicate symbol: secp256k1_context_destroy
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o

wasm-ld: error: duplicate symbol: secp256k1_context_set_illegal_callback
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o

wasm-ld: error: duplicate symbol: secp256k1_context_set_error_callback
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)                                                                                              
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o                                                                                                                

wasm-ld: error: duplicate symbol: secp256k1_scratch_space_create                                                                                                            
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)                                                                                              
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o                                                                                                                

wasm-ld: error: duplicate symbol: secp256k1_scratch_space_destroy                                                                                                           
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)                                                                                              
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o                                                                                                                

wasm-ld: error: duplicate symbol: secp256k1_ec_pubkey_parse                                                                                                                 
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)                                                                                              
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o

wasm-ld: error: duplicate symbol: secp256k1_ecdsa_signature_parse_der
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o

wasm-ld: error: duplicate symbol: secp256k1_ecdsa_signature_parse_compact
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o

wasm-ld: error: duplicate symbol: secp256k1_ecdsa_signature_serialize_der
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o

wasm-ld: error: duplicate symbol: secp256k1_ecdsa_signature_serialize_compact
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o

wasm-ld: error: duplicate symbol: secp256k1_ecdsa_signature_normalize
>>> defined in secp256k1-zkp/.libs/libsecp256k1.a(libsecp256k1_la-secp256k1.o)
>>> defined in secp256k1-zkp/src/libsecp256k1_la-secp256k1.o

wasm-ld: error: too many errors emitted, stopping now (use -error-limit=0 to see all errors)                                                                                
emcc: error: '/emsdk/upstream/bin/wasm-ld -o ./dist/secp256k1-zkp.wasm -Lsecp256k1-zkp/.libs secp256k1-zkp/.libs/libsecp256k1.a /tmp/emscripten_temp_y56aozys/main_0.o secp256k1-zkp/src/libsecp256k1_la-secp256k1.o -L/emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten /emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/libgl.a /emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/libal.a /emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/libhtml5.a /emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/libc.a /emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/libcompiler_rt.a /emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/libc++-noexcept.a /emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/libc++abi-noexcept.a /emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/libdlmalloc.a /emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/libc_rt_wasm.a /emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/libsockets.a -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr --lto-legacy-pass-manager --allow-undefined --strip-debug --export free --export malloc --export ecdh --export generator_generate_blinded --export generator_parse --export generator_serialize --export pedersen_blind_generator_blind_sum --export pedersen_commitment_parse --export pedersen_commitment_serialize --export pedersen_commit --export pedersen_blind_sum --export pedersen_verify_tally --export rangeproof_sign --export rangeproof_info --export rangeproof_verify --export rangeproof_rewind --export surjectionproof_parse --export surjectionproof_serialize --export surjectionproof_initialize --export surjectionproof_generate --export surjectionproof_verify --export stackSave --export stackRestore --export stackAlloc --export __wasm_call_ctors --export __errno_location --export-table --export __start_em_asm --export __stop_em_asm -z stack-size=5242880 --initial-memory=16777216 --no-entry --max-memory=16777216 --global-base=1024' failed (1)
Error: No such container:path: linux-build:/build/dist/secp256k1-zkp.js
linux-build
linux-build

Anyone with more familiarity with emcc have suggestions or willing to take a crack at this?

tiero commented 3 years ago

Hey @asoltys I will take a look, I always assumed apiaryio/emcc:latest was the way to go.

First question, have you tried to pull the latest git submodules from secp?

asoltys commented 3 years ago

Thanks for taking a look! Yeah I ran the git submodule update --init command just before the compile step.

tiero commented 3 years ago

I can replicate this, also with other projects such as https://github.com/tiero/docker-libwally-wasm/tree/new-docker-image

I do think is something related with the base image at this point.