Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Introduction to mcl-wasm
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
herumi
September 15, 2023
Technology
890
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Introduction to mcl-wasm
herumi
September 15, 2023
More Decks by herumi
See All by herumi
Constant Integer Division and Modulo Optimization Revisited (English)
herumi
0
77
定数整数除算・剰余算最適化再考
herumi
1
130
Constant integer division faster than compiler-generated code
herumi
2
1.1k
Batch Processing Algorithm for Elliptic Curve Operations and Its AVX-512 Implementation
herumi
0
280
Mathematics used in cryptography around us
herumi
2
1.1k
Xbyak Internals and Hacks
herumi
1
800
The NOPs You Don't Know
herumi
4
560
LLVM/ASMを使った有限体の高速実装
herumi
0
320
署名とゼロ知識証明の初歩
herumi
6
5.7k
Other Decks in Technology
See All in Technology
千葉での単身赴任からAWSをやり続け、千葉に戻ってきた話
yama3133
1
100
Comment regagner la souveraineté de vos données tout en étant payé grâce à Nostr !
rlifchitz
0
160
10年間のブログ発信を振り返って見えたWebアプリケーションエンジニアとしての軌跡
stefafafan
0
180
IaC コードを資産へ:AWS CDK 社内ライブラリと横断展開 / aws-summit-japan-2026
gotok365
10
1.5k
ぼっちではじめた登壇が「51名」「241件」の発信に化けた
subroh0508
1
300
GitHub Copilot 最新アップデート – 「一歩先」の実践活用術
moulongzhang
5
1.6k
20260619 私の日常業務での生成 AI 活用
masaruogura
1
240
[AWS Summit Japan 2026]迷っているあなたへ_小さな一歩が、やがて自分を助けてくれる
sh_fk2
1
370
Oracle Cloud Infrastructure:2026年6月度サービス・アップデート
oracle4engineer
PRO
0
260
SONiCのLinuxベースを活かしたZabbix監視
sonic
0
280
Oracle AI Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
6
1.6k
“詰む”前に仕組みを作れ 〜技術の波に溺れないためのキャッチアップ術〜
takasyou
7
3.5k
Featured
See All Featured
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
400
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.5k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
390
The SEO Collaboration Effect
kristinabergwall1
1
490
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
320
Abbi's Birthday
coloredviolet
3
8.2k
Scaling GitHub
holman
464
140k
Transcript
暗号プリミティブライブラリ mcl-wasmの紹介 2023/9/15 WebAssembly night #11 光成滋生
@herumi • サイボウズ・ラボで暗号と最適化の研究・OSS開発 • ペアリング/BLS署名ライブラリmcl/bls • https://github.com/herumi/mcl • Go/Java/C#/Rust binding
• Node.js/Wasm用パッケージ(今回紹介) • x64用JITアセンブラXbyak • https://github.com/herumi/xbyak • Intelの深層学習フレームワークoneDNNのエンジン • スーパーコンピュータ富岳版Xbyak_aarch64も関わる • RISC-V版も開発中 2 / 8
mcl/-wasm • 様々な暗号技術の基本パーツを提供 https://www.npmjs.com/package/mcl-wasm • IDベース暗号・準同型暗号 • BLS署名・集約署名 • ゼロ知識証明・秘密分散など
• Ethereum Foundationや Optimismのgrantを受ける • アクセス数 • GitHubのDependency graph : 15万 Repositories • 2021/4/1からの総download数 : 1200万over • https://npm-stat.com/charts.html?package=mcl-wasm&from=2021-04-01 3 / 8 600K 2021/Apr 2023/Sep 月間ダウンロード数 400K 200K
BLS署名 • nodeでの実行例 • bls-eth-wasmなどの専用packageも提供 const mcl = require('mcl-wasm') mcl.init().then(()
=> { const P = new mcl.G1() P.setStr('1 -1 1') // 初期設定 const s = new mcl.Fr() s.setByCSPRNG() // 署名鍵(秘密鍵)の作成 const Q = mcl.mul(P, s) // 検証鍵(公開鍵)の作成 const H = mcl.hashAndMapToG2('abc') // 検証文字列のハッシュ const sig = mcl.mul(H, s) // ハッシュに対する署名 const ok = mcl.pairing(Q,H).isEqual(mcl.pairing(P,sig))//署名の検証 // 注意 : もっと効率のよい方法はある }) 4 / 8
• JavaScriptのBigIntによる有限体Frの演算実装 • 加減乗算の後に素数rで割った余りを求める操作 • 性能評価 • 単位:usec • あれ,
add/subはBigIntの方が速い??? mcl-wasmの多倍長演算とBigIntとの比較 const g_r = BigInt(254ビットの素数) function FrAdd (x, y) { const z = x + y return z >= g_r ? (z - g_r) : z } function FrMul (x, y) { return (x * y) % g_r } BigInt mcl-wasm add 0.113 0.437 sub 0.099 0.444 mul 0.681 0.572 5 / 8
• JavaScriptはdestructorが無い(GCがある)言語 • mcl-wasmは関数呼び出しをメモリ操作処理でラップしてる • WasmにGCが正式サポートされればまた変わるかも • JS側でメモリ管理を自分でするなら速い • 1回当たり約0.4usecの変換コスト(@Xeon
8280 2.8GHz) WAMの呼び出し変換コスト add(x : Fp, y : Fp) => Fp { const z = new Fp() const stack = mod.stackSave() // 現在のWasmのSPを取得 const xPos = x._sallocAndCopy() // スタックに確保して状態をコピー const yPos = y._sallocAndCopy() // スタックに確保して状態をコピー const zPos = z._salloc() // スタックに確保 mod._mclBnFpAdd(zPos, xPos, yPos) // Wasm関数呼び出し z._save(zPos) // 結果をzにコピー // スタックを元に戻す mod.stackRestore(stack) return z } BigInt mcl-wasm direct call add 0.113 0.437 0.035 sub 0.099 0.444 0.035 mul 0.681 0.572 0.130 6 / 8
• 楕円曲線の加算のベンチマーク • 変換コストは相対的に無視できる • ペアリングなどの複雑な演算処理はもっと差が開く 重たい計算はmcl-wasmが速い BigInt mcl-wasm direct
G1::add 21.609 7.9 7 / 8
• 暗号ライブラリmcl/mcl-wasmの紹介 • 軽い関数呼び出しはWasm側が不利になることがある • 暗号や実装の解説記事を書いてます • https://zenn.dev/herumi まとめ 8
/ 8