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。網路上已經有很多關於帳戶抽象的介紹,這邊只簡單說明一 ...
使用 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 物件 ...
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 ...
zkEVM 空投資訊整理
zkEVM 是其中一個 ZK Rollup 的 L2 方案,雖然已經有 MATIC 代幣,但據說可能也有空投機會,這邊研究並整理一份資料給大家參考。作為同樣 L2 ZK Rollup 的方案,策略就一樣參考之前的 zkSync 空投策略。 錢包使用 Metamask 即可。 BridgezkEVM 的 Bridge 頁面,建議在 $6 (0.0028 ETH) 以下時進行交互。 應用列出一些已經上主網的應用 名稱 發幣 類型 備註 Balancer O DEX Quickswap O DEX 0VIX X Lending 成本以太主網 操作 預估成本 Bridge 入金 0.0028 ETH 轉帳 ETH 0.0005 ETH 總計 0.0033 ETH zkEVM 操作 預估成本 0VIX Approve USDC 0.00003 ETH 0VIX Deposit USDC 0.00018 ETH Balancer Swap ETH to USDC 0.0001 ETH Balancer Add ETH Liq ...
FTX 填寫索賠證明
本篇文章說明如何填寫 FTX 索賠證明,從 FTX 點擊[提交索賠證明]後,會跳到 Kroll 平台進行填寫,首先會看到以下畫面 點擊 [View Scheduled Claim] 會進入以下畫面,看到自己的帳戶資料。這是我完成後補的截圖,第一次進來左邊應該是 Not Started。 點擊 [Next] 進入主要的填寫畫面,最上面會有一些說明和選擇你使用是哪一個的 FTX 交易所。ftx.com 預設會自動選擇 FTX Trading Ltd. (d/b/a “FTX”) (Case No. 22-11068) ftx.us 預設會自動選擇 West Realm Shires Services Inc. (d/b/a “FTX US”) (Case No. 22-11071) 下面會列出你持有的法幣、加密貨幣和 NFT 的資產,每個章節都會問你是否有額外要列舉的,每個項目都會問你是否同意這個數字。沒有問題的話就是全部不列舉並同意數字,法幣部分: Do you agree with the Scheduled Quantity? 選 Yes D ...