使用 Web3.js 進行 EIP-712 類型結構化資料簽名與檢驗
之前在的文章 Solidity 智能合約 - EIP-712 類型結構化資料雜湊和簽名,說明了智能合約如何檢驗 EIP-712 的簽章。這篇文章將說明如何使用 Web3.js 來進行 EIP-712 簽章。本篇文章使用 Web3.js 4.1.1 版本。 簽章瀏覽器錢包簽章Web3.js 可以使用下面函式來進行 EIP-712 的簽章: web3.eth.signTypedData web3.currentProvider.request 瀏覽器錢包可以使用上面的函式,但 Web3.js 沒有內建私鑰的簽署方式,所以後面會介紹另一個套件來處理。 web3.eth.signTypedData這個函式在 4.1.0 加入 1web3.eth.signTypedData(address: string, typedData: Eip712TypedData): Promise<string> address: 簽署人地址。 typedData: 簽署的內容,包含 EIP-712 的 domain、類別定義和訊息內容,直接參考下面範例說明。 回傳值: 為 Promise 物件 ...
在陣列中找出第 K 大的數字
題目在陣列中找出第 K 大的數字。Find Kth largest number in an array. 說明找第 K 大的數字,我們可以直覺的用排序後就可以找出來,時間複雜度取決於排序演算法,例如使用快速排序法為 O(n log n)。 另外一個方法是延續前一個題目的想法,找第 K 大就用 K 個變數去保存?不過由於 K 也是個變數,所以我們需利用動態的資料結構來保存,這個 Case 使用 Linked List 是最合適。時間複雜度則為 O(n K),而當 K 很小的時候可以接近 O(n)的效能,反之,K 很大的時候,可能會比直接用快速排序法還慢。 解法123456789101112131415static int Find(int[] array, int k){ List list = new List(); for (int i = 0; i < array.Length; ++i) { int n = array[i]; int j = 0; for (int length = Math ...
計算 1 * 2 + 2 * 3 +...+ (N - 1) * N 總和
題目計算 1 * 2 + 2 * 3 +…+ (n-1) * n 總和。Write a function to calculate 1 * 2 + 2 * 3 + … + (N - 1) * N. 說明題目為計算 1 * 2 + 2 * 3 +…+ (n-1) * n 的總和,一樣是求合的問題,同樣使用迴圈或遞迴即可,如果能用數學證明出公式的話,也可以直接套公式。 迴圈解1234567int sum(int n){ int sum = 0; for (int i = 2; i <= n; ++i) sum += (i - 1) * i; return sum;} 遞迴解123456int sum(int n){ if (n < 2) return 0; return (n - 1) * n + sum(n - 1);} 數學解網路上沒有找到比較好的推導,主要概念是將數列拆解為下面兩個數列 然後這兩個數列可以找到公式 最後將兩個式子相減 寫成程式碼 1234int sum ...
Solidity 智能合約 - EIP-712 類型結構化資料雜湊和簽名
本篇文章說明 EIP-712 的標準,以及如何使用 Solidity 實作 EIP-712 的智能合約簽章驗證。 簡介在之前的文章介紹過一些簽章和檢驗的方式,而實際運用的時候可能會簽署許多資料來使用,例如這個例子: 123456789function permit(address owner, address spender, uint value, uint nonce, uint deadline, uint8 v, bytes32 r, bytes32 s) external { require(deadline >= block.timestamp, "signature expired"); require(!usedNonces[nonce], "used nonce"); bytes32 messageHash = abi.encodePacked(block.chainid, address(this), spender, value, nonce, deadline); bytes32 hash = ke ...
使用 Ethers.js 簽章與檢驗
之前在 Solidity 智能合約 - ecrecover 簽章檢驗這篇文章,說明了智能合約如何檢驗簽章,這篇文章將說明如何使用 Ethers.js 來進行簽章與檢驗。本篇文章使用 Ethers.js 6.7.1 版本。 Signer後面內容要使用 Signer 物件,這邊先簡單說明如何取得。 私鑰 signer12345import { JsonRpcProvider, Wallet } from "ethers";const privateKey = '0x...'const provider = new JsonRpcProvider(url);const signer = new Wallet(privateKey, provider); 瀏覽器錢包 signer1234import { BrowserProvider } from "ethers";const provider = new BrowserProvider(window.ethereum);const sign ...
使用 Web3.js 簽章與檢驗
之前在 Solidity 智能合約 - ecrecover 簽章檢驗這篇文章,說明了智能合約如何檢驗簽章,這篇文章將說明如何使用 Web3.js 來進行簽章與檢驗。本篇文章使用 Web3.js 4.1.1 版本。 簽章Web3.js 提供幾種鏈下簽章的函式,本篇文章介紹下面三種: web3.eth.sign web3.eth.accounts.sign web3.personal.sign 關於 EIP-712 相關的方法,參考使用 Web3.js 進行 EIP-712 類型結構化資料簽名。 web3.eth.sign這是早期使用的函式,簽章不使用前綴。 1web3.eth.sign(message: Bytes, address: string): Promise<string> message: 簽署的內容,只能是 32 bytes 長度的二進位內容。可以是 Uint8Array 或 0x 開頭的字串。 address: 簽署人地址。 回傳值: 為 Promise 物件,內容為簽章。 Metamask 已經停用了這個功能,使用會在 console 看到錯誤訊息: ...
Solidity 智能合約 - 簽名延展性 (Signature Malleability)
之前的文章介紹了 ecrecover 的用法,不過內建的 ecrecover 存在簽名延展性 (Signature Malleability) 的問題。這篇文章將說明這個問題,以及如何解決。 問題拿之前文章的例子 1234567function test() external view returns(address) { bytes32 hash = 0xc1af4b94166cd32fc49b7b926cbb91ee421de2d04450e8ae57857b9b56ac7e53; uint8 v = 0x1b; bytes32 r = 0xe1077fb9321c187d8a43926896abac5455ce6add269e098f855ff059d6b846a3; bytes32 s = 0x56320be5f6d79c4d0e5583d6b9a2e50fae78f1fb5ff0553541e69c66dae2b2f8; return ecrecover(hash , v, r, s);} 上面的結果會得到簽署人為 0xDD980c315dFA ...
Solidity 智能合約 - ecrecover 簽章檢驗
簡介智能合約中的 ecrecover 函式,可以用來驗證錢包的的簽章。檢驗方可以在沒有簽章者私鑰的情況下,確認簽署者的身份。常用來作為鏈下授權,再由第三方上鏈使用或是單純的身份驗證。 函式1function ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address) hash: 是被簽章訊息的雜湊 v: 簽章的 v 值 r: 簽章的 r 值 s: 簽章的 s 值 回傳: 簽章者地址 範例例如下面的範例 123456789contract EcrecoverTest { function test() external view returns(address) { bytes32 hash = 0xc1af4b94166cd32fc49b7b926cbb91ee421de2d04450e8ae57857b9b56ac7e53; uint8 v = 0x1b; bytes32 r = 0xe1077fb9321c187d8a43926896abac5455ce ...
Stable Diffusion web UI 擴充功能 - Civitai Helper
簡介透過使用 Civitai Helper,我們可以直接下載安裝模型,不需要再開啟資料夾手動安裝。除此之外他也能自動下載預覽圖,提供在 Extrad Network 中瀏覽使用。 安裝在可用擴充搜索 Civitai 的文字,找到 Stable Diffusion Webui Civitai Helper 的項目,進行安裝與重啟。詳細參考之前的文章 Stable Diffusion 教學 - 擴充功能 (Extensions)。 安裝完成後會在上方出現 Civitai Helper 的頁籤 功能介紹Scan Models for Civitai這個功能是可以幫目前已經安裝的模型自動下載預覽圖。 Download Max Size Preview: 字面上意思應該是下載尺寸最大的圖來當預覽圖。 Skip NSFW Preview Images: 略過兒童不宜的圖片。 Model Types 對應 Extra Netowrk 中的四個頁籤,勾選要處理類別。 ti: Textual Inversion hyper: Hypernetworks ckp: Checkpoints lora: ...
Stable Diffusion 教學 - web UI Extra Networks
本篇文章介紹 Stable Diffusion web UI Extra Networks 的功能,包含子模型 Textual Inversion、Hypernetworks 和 Lora 的安裝和使用。 功能區塊在提示詞右邊區塊點擊中間的 🎴 圖示 會在下方展開 Extra Networkd 功能區塊 包含了四個子頁籤: Textual Inversion Hypernetworks Checkpoints Lora 以及右邊的搜索和排序等功能。 功能介紹Textual InversionTextual Inversion 分頁會列出目前已安裝的 Textual Inversion 子模型,一開始沒有安裝的時候會提示安裝路徑: 1stable-diffusion-webui/embeddings 安裝檔案到資料夾後,點擊右邊的 [Refresh] 按鈕可以重新整理來載入模組。 點擊想使用的 Textual Inversion,他會自動帶入到提示詞或反向提示詞使用,他會帶入到最後點擊的輸入框,再次點擊可以移除。 點擊右上角的圖示 [Edit metadata] 可以開啟編輯資訊 ...


*n/20230921095241.jpg)



