使用 Ethers.js 操作 zkSync 帳戶抽象
在前一篇文章 zkSync 帳戶抽象 (Account Abstraction) 程式範例說明了如何撰寫和部署帳戶抽象合約,也有使用抽象帳戶發起交易的方法。不過專案是用 zksync-cli 建立,使用的是 Ethers.js v5 的版本。這篇文章會以如何在 Dapp 中,使用現成抽象帳戶的角度來說明。包含 Ethers.js v5 和 v6 的用法,以及實際使用 Metamask 連接使用效果。 zksync 套件zkSync 提供了官方的套件可以用來處理帳戶抽象相關的交易,原先的版本為 zksync-web3,新的版本更名為 zksync2-js。分別對應到 Ethers.js v5 和 v6。 Ethers.js v5:使用 zksync-web3。 Ethers.js v6:使用 zksync2-js。 連接錢包首先要連接錢包,即為後續程式中的 signer 和 provider 的取得方式。 v6私鑰錢包12345import { Provider, Wallet } from 'zksync2-js';const private ...
Solidity - zkSync 帳戶抽象 (Account Abstraction) 程式範例
簡介zkSync Era 原生支援帳戶抽象 (Account Abstraction) 的功能,這篇文章會簡單介紹一下帳戶抽象是什麼,主要會說明在 zkSync Era 如何實作相關的程式。 帳戶類型在介紹帳戶抽象之前,要先知道目前以太坊有兩種帳戶 外部擁有帳戶,英文為 EOA(Externally Owned Account),也就是一般有私鑰的錢包地址。 智能合約帳戶。 智能合約常會使用 msg.sender 來取得函式呼叫者,進一步作為在系統中的帳號,作為記帳之類的應用。EOA 的一般錢包可以直接發起交易來使用智能合約,而有時我們會使用另外的智能合約間接使用 dapp,例如多簽合約來管理,而這些智能合約帳戶本身無法自己發起交易,必須還是要有一般錢包來代為發送上鏈。 帳戶抽象 (Account Abstraction)現行的帳戶機制存在一些問題,例如 EOA 帳戶私鑰必須保管好不能遺失,智能合約帳戶本身無法自行發起交易等等。帳戶抽象被提出就是為了解決相關的問題的機制,可以參考完整的文件 EIP-4337 和 EIP-2938。網路上已經有很多關於帳戶抽象的介紹,這邊只簡單說明一 ...
Stable Diffusion 教學 - Hires. fix
本篇文章介紹 Stable Diffusion web UI 的 Hires. fix 功能,用來提升圖片的解析度。 原理說明Hires. fix 的原理其實很簡單,利用文生圖產生的圖片,進行放大之後再進行一次圖生圖,流程如下圖所示: 功能區塊在文生圖的頁面,採樣方法的下面可以找到 Hires. fix 的選項,勾起來就可以使用。同時下方會出現一些額外選項: Upscaler這是圖片放大時使用的方法,目前有以下的方法可以選擇 Latent, Latent (antialiased), Latent (bicubic), Latent (bicubic antialiased), Latent (nearest), Latent (nearest-exact), None, Lanczos, Nearest, ESRGAN_4x, LDSR, R-ESRGAN 4x+, R-ESRGAN 4x+ Anime6b, ScuNET, ScuNET PSNR, SwinIR_4x 後面會有實驗結果參考。 Hires steps這是在進行圖生圖階段時使用的 Sampling steps,0 表示 ...
Stable Diffusion 教學 - Tiling
本篇文章介紹 Stable Diffusion web UI 的 Tiling 功能,能用來生成 Tiled Image,可以用來作為背景圖或桌布。 Tiled Image首先要先知道什麼是 Tiled Image,他是一種特殊的紋理圖片,在四個方向重複拼接的時候,能夠無縫接軌,看不出交界。例如下面這張圖片: 往四周重複後 不會看到明顯交接處。 功能區塊在文生圖和圖生圖的頁面,採樣方法的下面可以找到 Tiling 的選項,勾起來就可以使用。 實驗結果Tiling 的功能有時需要比較大的解析度才能正常產生圖片,例如下面產生花的提示詞,分別在不同解析度產生的結果: 256x256 512x512 768x768 可以發現在 256x256 無法正常產生的結果,但並不是一定多少解析度,同樣解析度有時會成功有時會失敗,不過越大成功率越高。下面把上面的三張圖片都拿來展開看看效果: ...
Stable Diffusion 教學 - Restore faces
本篇文章介紹 Stable Diffusion web UI 的 Restore faces 功能,能達到修復臉部的效果。 功能區塊在文生圖和圖生圖的頁面,採樣方法的下面可以找到 Restore faces 的選項,勾起來就可以使用。 設定在設定下的 Face restoration 頁簽,有更多的設定可以使用 Face restoration model主要有兩種 model 可以選擇: CodeFormer GFPGAN 這些模型原本是用來把模糊的照片變清晰,而在文生圖或圖生圖時使用的話,會在產生圖片後進行後處理。 CodeFormer weight使用 CodeFormer 還可設定權重,這邊和直覺相反,數字越大效果越小。可以設定 0 - 1,預設 0.5。 額外設定除了 Face restoration 頁簽外,在 Saving images/grids 頁簽下面還有一個設定和 Restore faces 有關,在下面找到選取方塊 1Save a copy of image before doing face restoration. 勾起後會另外儲存一份處理前 ...
使用 Ethers.js 進行 EIP-712 類型結構化資料簽名
之前在的文章 Solidity 智能合約 - EIP-712 類型結構化資料雜湊和簽名,說明了智能合約如何檢驗 EIP-712 的簽章。這篇文章將說明如何使用 Ethers.js 來進行 EIP-712 簽章。本篇文章使用 Ethers.js 6.7.1 版本。 簽章signer.signTypedDataEthers.js 使用下面函式進行簽署,參考之前的文章使用 Ethers.js 簽章與檢驗取得 Signer。 1signer.signTypedData(domain, types, value): Promise<string> domain: 合約中 eip712Domain 的資料。 types: 類別定義。 value: 訊息內容,直接參考下面範例說明。 回傳值: 為 Promise 物件,內容為簽章。 使用之前的範例合約來說明 12345678910111213141516171819202122232425262728293031323334import "@openzeppelin/contracts/utils/cryptography/ ...
使用 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 ...