Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
TauriとRustとSolidJSで作るEthereum Address生成機 / Ethereum Address Generator made by Tauri, Rust, SolidJS
serinuntius
July 02, 2022
Technology
0
7
TauriとRustとSolidJSで作るEthereum Address生成機 / Ethereum Address Generator made by Tauri, Rust, SolidJS
社内勉強会の資料です。
https://github.com/serinuntius/ethereum-address-generator
serinuntius
July 02, 2022
Tweet
Share
More Decks by serinuntius
See All by serinuntius
NFTのインデクシングとGraphQLのすゝめ / NFT indexing and GraphQL
serinuntius
0
16
世界最速でArbitrumで NFTを作って震えたい!!!!/ I want to make NFT with Arbitrum in the fastest way in the world and tremble !!!!
serinuntius
0
530
なぜフラッシュローンという概念が俺達の魂を震えさせるのか / Why does the concept of flash loans make our souls tremble?
serinuntius
0
570
Why does the concept of DeFi make our souls tremble? / なぜDeFiという概念が俺達の魂を震えさせるのか ~DEX(AMM)まで~
serinuntius
0
990
NotionがCMS代わりに!? / Notion replaces CMS!?
serinuntius
0
620
ont hackathon
serinuntius
0
54
Golangでリクエストごとのクエリログが見たい!! kamakura.go #4 / go-query-and-request-logger
serinuntius
1
490
新卒Rubyistが1ヶ月で Perl Mongerになった話
serinuntius
0
290
Other Decks in Technology
See All in Technology
大声で伝えたい!定時に帰る方法
sbtechnight
0
240
Istioを活用したセキュアなマイクロサービスの実現/Secure Microservices with Istio
ido_kara_deru
3
420
品質特性のすすめ
honamin09
0
170
Microsoft Data Analytics trends : ”Lakehouse” , ”Data Mesh"
ryomaru0825
2
130
Azure DevOps Online Vol.6 - 業務で必要なCIをみんなで考えよう
kkamegawa
0
270
塩漬けにしているMySQL 8.0.xxをバージョンアップしたくなる、ここ数年でのMySQL 8.0の改善点 / MySQL Update 202208
yoshiakiyamasaki
1
690
ECS Fargate+Mackerelにおける監視費用を削減するまでの話
nulabinc
PRO
1
460
20220731 如何跟隨開源技術保持你的職涯發展
pichuang
0
120
EC/CRMの自社サービス開発をマネジメントするようになって1年でやってきたこととこれから / devio2022-takano-sho-road-to-good-development-team-management
masaru_b_cl
0
430
MySQL v5.7 勉強会/study-mysql-ver-5-7
andpad
0
2k
Micro frontends and micro services
kashif98
0
150
疎ベクトル検索と密ベクトル検索: 第68回 Machine Learning 15minutes! Broadcast
keyakkie
1
250
Featured
See All Featured
The Invisible Side of Design
smashingmag
290
48k
Support Driven Design
roundedbygravity
87
8.6k
Robots, Beer and Maslow
schacon
152
7.1k
Git: the NoSQL Database
bkeepers
PRO
415
59k
Become a Pro
speakerdeck
PRO
3
910
Build your cross-platform service in a week with App Engine
jlugia
219
17k
Rails Girls Zürich Keynote
gr2m
87
12k
Music & Morning Musume
bryan
35
4.3k
Adopting Sorbet at Scale
ufuk
63
7.6k
Building Your Own Lightsaber
phodgson
95
4.7k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
181
15k
Build The Right Thing And Hit Your Dates
maggiecrowley
19
1.2k
Transcript
Tauri とRust とSolidJS で作る Ethereum Address 生成機
What is Tauri? 🪶 軽量 - アプリのサイズがElectron 比で1/16 です 💻
省メモリ - メモリ使用量がElectron 比で 60% 少ないです ⚡️ 起動が速い - 起動もめちゃんこ速いです 🔥 No Chromium - Chromium に依存していません 🌈 並列処理も得意 - バックエンドはRust なのでマルチスレッドも得意だよ 📱 モバイルも対応予定 - iOS やAndroid やWASM にも対応予定です(soon ) 🔑 セキュア - allowlist でAPI ごとに詳細に権限を分けれるので安全です Tauri はRust 製のアプリフレームワークです
What is Ethereum Address Generator ? 好きなEthereum のアドレスを生成するヤツ CPU で計算すると先頭4桁ぐらいのマッチングが限界か
GPU で計算すると先頭8 桁ぐらいであれば現実的な速度で出る 詳細はこちら これを利用したハックとか😈 リテラシーが高い人はアドレス先頭4桁と後部4桁でアドレスが正規のものかチェックする その習性を利用してよくハッキングに使われる ex) 正しいアドレス: 0x abcd 1234000ae1c8e8ac27103e4ff65f42a4e 0000 悪意のあるアドレス: 0x abcd e4a24f56ff4e30172ca8e8c1ea0004321 0000 ` ` ` ` ` ` ` `
Demo 0:00
What is SolidJS ? ⚡ ハイパフォーマンス - UI のスピードとメモリ使用率のベンチで常にトップらしい 💻
React っぽい - JSX で書ける! useState 的な概念もだいたい似てる ㌰㌍️ 簡単 - React のhooks は初心者にはとっつき辛いルールの上で成り立っているが、SolidJS はその辺をカ バーしている感じがする ちなみにTauri は別にSolidJS は マストではない! React, Vue, Vanilla 等々なんでも書ける。 ` `
コードの解説とか(Tauri 側) view full page #[tauri::command(async)] async fn generate_address(start_with: String)
-> Result<(String, String), ()> { ... 省略 let key = Wallet::<SigningKey>::new(&mut rand::thread_rng()); let address = key.address().to_string(); if address.starts_with(start_with.as_str()) { let hex_key = key.signer().to_bytes().encode_hex(); println!("hex_key: {}", hex_key); if let Some(err) = tx.send((format!("{:?}", key.address()), hex_key)).err() { println!("err: {}", err); } break; } ... 省略 let answer = rx.recv().expect("failed to recvs"); Ok(answer) }
コードの解説とか(SolidJS 側) React と違うのは const calcByRust = async (target: string):
Promise<string[]> => { // await invoke(' 関数名') ってやるだけで非同期でRust の関数呼び出せる! // お手軽!!! const result = await invoke('generate_address', {startWith: target}) as string[]; return [result[0],`0x${result[1]}`]; } // `useState` の代わりに `createSignal` を使う const [address, setAddress] = createSignal<string>(''); const [secretKey, setSecretKey] = createSignal<string>(''); // しかも `createSignal` はどこにでも置ける const [address, setAddress] = createSignal<string>(''); const Component = () => { return ( <div> {address()} </div> ); }
仕事で実際に使ってみてわかったRust のいいところ Result 型がいい! あえて冗長に書いてます。 fn get_file(path: Path) -> Result<(),
Error> { // 戻り値がResult 型で、Ok かErr が入ってる let file = File::open(path); let mut contents = String::new(); match file { Ok(f) => f.read_to_string(&mut contents).unwrap(), Err(err) => panic!("panic!!! {:?}", err), } Ok(()) }
Result 型 Result<T,E> は失敗するかもしれない処理の結果を表現する列挙型です。 Result を無視するとwarning が出るのでエラーハンドリングを強制& 可視化できる! Rust には例外がない
エラーハンドリングをサボると可視化される仕組みがすごい let ok_value: Result<usize, &'static str> = Ok(1); match ok_value { Ok(v) => println!("ok value = {}", v), Err(e) => println!("err value = {}", e), }; // どちらか片方の場合だけ処理したいならif let が便利 if let Ok(v) = ok_value { println!("ok value = {}", v); } // Ok の場合は中身を返し、Err の場合はpanic する assert_eq!(ok_value.unwrap(), 1); // unwrap と同じだが、panic 時のエラーメッセージを指定できる assert_eq!(ok_value.expect("panic"), 1);
? でエラーを返す Go が嫌いって言う人がよく言う if err != nil { return
err } を書かなくていいw 間違いなくスマートではある。ちなみにそんなに気にならない派。 ? 演算子 というシンタックスシュガーがあり、エラーをそのまま返せる ` ` fn get_hoge() -> Result<(), Error> { let err_value: Result<usize, &'static str> = Err("error message"); // err がある場合はerr をreturn する, no_err にはOk 時のあたいが入る let no_err = err_value?; // err の場合はここにはもう到達しない } ` ` // こんなやつ if err := get_hoge(); err != nil { return nil, err; }
さっきの冗長なコードを ? で書くとこんな感じ ` ` fn get_file(path: Path) -> Result<(),
Error> { let mut contents = String::new(); File::open(path)?.read_to_string(&mut contents)?; Ok(()) }
コンパイラがめちゃくちゃ賢い なんで君それがやばいってわかるの?ってレベルで丁寧に検査されている 最初はコンパイル通すのが大変だけど、通った時の安心感はやばい 100% バグなく正しく動きそうな気がするw ( 決してそんなことはないけど、それぐらい型付けもしっかりしてる)
学習曲線云々は、間違いなく誇大広告だと思う いざ仕事で書かなきゃいけない状況に追い込まれると、書けるようになる(経験談 コンパイラエラーは、慣れるとすぐに解決できるようになるし、コンパイラのお気持ちもわかってくる Rust 書いたこともないのに、学習コストが〜〜〜とか言ってる エアプおじさん は無視して🆗 あと書く環境が大事 特にこだわりがなければ、VS Code
で rust-analyzer 入れれば神 静的型付け言語やったことがあって、参照とかのスタックとヒープの話がわかってればOK 型推論も効くし最高 ` `
まとめ Rust 最高 Tauri 最高 SolidJS 最高
参考文献 Rust のOption とResult Rust GUI の決定版! Tauri を使ってクロスプラットフォームなデスクトップアプリを作ろう