📜 [專欄新文章] Merkle Tree in JavaScript
✍️ Johnson
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
這篇文章會說明 Merkle Tree 的運作原理,以及解釋 Merkle Proofs 的用意,並以 JavaScript / TypeScript 簡單實作出來。
本文為 Tornado Cash 研究系列的 Part 1,本系列以 tornado-core 為教材,學習開發 ZKP 的應用,另兩篇為:
Part 2:ZKP 與智能合約的開發入門
Part 3:Tornado Cash 實例解析
Special thanks to C.C. Liang for review and enlightenment.
本文中實作的 Merkle Tree 是以 TypeScript 重寫的版本,原始版本為 tornado-core 以 JavaScript 實作而成,基本上大同小異。
Merkle Tree 的原理
在理解 Merkle Tree 之前,最基本的先備知識是 hash function,利用 hash 我們可以對資料進行雜湊,而雜湊後的值是不可逆的,假設我們要對 x 值做雜湊,就以 H(x) 來表示,更多內容可參考:
一次搞懂密碼學中的三兄弟 — Encode、Encrypt 跟 Hash
SHA256 Online
而所謂的 Merkle Tree 就是利用特定的 hash function,將一大批資料兩兩進行雜湊,最後產生一個最頂層的雜湊值 root。
當有一筆資料假設是const leaves = [A, B, C, D],我們就用function Hash(left, right),開始製作這顆樹,產生H(H(A) + H(B))與H(H(C) + H(D)),再將這兩個值再做一次 Hash 變成 H(H(H(A) + H(B)) + H(H(C) + H(D))),就會得到這批資料的唯一值,也就是 root。
本文中使用的命名如下:
root:Merkle Tree 最頂端的值,特色是只要底下的資料一有變動,root 值就會改變。
leaf:指單一個資料,如 H(A)。
levels:指樹的高度 (height),以上述 4 個資料的假設,製作出來的 levels 是 2,levels 通常會作為遞迴的次數。
leaves:指 Merkle Tree 上的所有資料,如上述例子中的 H(A), H(B), H(C), H(D)。leaves 的數量會決定樹的 levels,公式是 leaves.length == 2**levels,這段建議先想清楚!
node:指的是非 leaves 也非 root 的節點,或稱作 branch,如上述例子中的H(H(A) + H(B)) 和 H(H(C) + H(D))。
index:指某個 leaf 所在的位置,leaf = leaves[index],index 如果是偶數,leaf 一定在左邊,如果是奇數 leaf 一定在右邊。
Merkle Proofs
Merkle Proofs 的重點就是要證明資料有沒有在樹上。
如何證明?就是提供要證明的 leaf 以及其相對應的路徑 (path) ,經過計算後一旦能夠產生所需要的 root,就能證明這個 leaf 在這顆樹上。
因此這類要判斷資料有無在樹上的證明,類似的說法有:proving inclusion, proving existence, or proving membership。
這個 proof 的特點在於,我們只提供 leaf 和 path 就可以算出 root,而不需要提供所有的資料 (leaves) 去重新計算整顆 Merkle Tree。這讓我們在驗證資料有沒有在樹上時,不需要花費大量的計算時間,更棒的是,這讓我們只需要儲存 root 就好,而不需要儲存所有的資料。
在區塊鏈上,儲存資料的成本通常很高,也因此 Merkle Tree 的設計往往成為擴容上的重點。
我們知道 n 層的 Merkle Tree 可以存放 2**n 個葉子,以 Tornado Cash 的設計來說,他們設定 Merkle Tree 有 20 層,也就是一顆樹上會有 2**20 = 1048576 個葉子,而我們用一個 root 就代表了這 1048576 筆資料。
接續上段的例子,這顆 20 層的 Merkle Tree 所產生的 Proof ,其路徑 (path) 要從最底下的葉子 hash 幾次才能到達頂端的 root 呢?答案就是跟一棵樹的 levels 一樣,我們要驗證 Proof 所要遞迴的次數就會是 20 次。
在實作之前,我們先來看 MerkleTree 在 client 端是怎麼調用的,這有助於我們理解 Merkle Proofs 在做什麼。
基本上一個 proof 的場景會有兩個人:prover 與 verifier。
在給定一筆 leaves 的樹,必定產生一特定 root。prover 標示他的 leaf 在樹上的 index 等於 2,也就是 leaves[2] == 30,以此來產生一個 proof,這個 proof 的內容大致上會是這個樣子:
對 verifier 來說,他要驗證這個 proof,就是用裡面的 leaf 去一個一個與 pathElements 的值做 hash,上述就是 H('30', 40) 後得出 node,再 hash 一次 H('19786...', node) 於是就能得出這棵樹的 root。
重點來了,這麼做有什麼意義?它的巧思在於對 verifier 來說,他只需要儲存一個 root,由 prover 提交證明給他,經過計算後產生的 root 如果跟 verifier 儲存的 root 一樣,那就證明了 prover 所提供的資料確實存在於這個樹上。
而 verifier 若不透過 proof ,要驗證某個 leaf 是否存在於樹上,也可以把 leaves = [10, 20 ,leaf ,40]整筆資料拿去做 MerkleTree 的演算法跑一趟也能產生特定的 root。
但由 prover 先行計算後所提交的 proof,讓 verifier 不必儲存整批資料,也省去了大量的計算時間,即可做出某資料有無在 Merkle Tree 上的判斷。
Sparse Merkle Tree
上述能夠證明資料有無在樹上的 Merkle Proofs 是屬於標準的 Merkle Tree 的功能。但接下來我們要實作的是稍微不一樣的樹,叫做 Sparse Merkle Tree。
Sparse Merkle Tree 的特色在於除了 proving inclusion 之外,還可以 proving non-inclusion。也就是能夠證明某筆資料不在某個 index,例如 H(A) 不在 index 2 ,這是一般 Merkle Tree 沒辦法做到的。
而要做到 non-membership 的功能其實也不難,就是我們要在沒有資料的葉子裡補上 zero value,或是說 null 值。更多內容請參考:What’s a Sparse Merkle Tree。
實作細節
本節將完整的程式碼分成三個片段來解釋。
首先,這裡使用的 Hash Function 是 MiMC,主要是為了之後在 ZKP 專案上的效率考量,你可以替換成其他較常見的 hash function 例如 node.js 內建 crypto 的 sha256:
crypto.createHash("sha256").update(data.toString()).digest("hex");
這裡定義簡單的 Merkle Tree 介面有 root, proof, and insert。
首先我們必須先給定這顆樹的 levels,也就是樹的高度先決定好,樹所能容納的資料量也因此固定為 2**levels 筆資料,至於要不要有 defaultLeaves 則看創建 Merkle Tree 的 client 自行決定,如果有 defaultLeaves 的話,constructor 就會跑下方一大段計算,對 default 資料開始作 hash 去建立 Merkle Tree。
如果沒有 defaultLeaves,我們的樹也不會是空白的,因為這是顆 Sparse Merkle Tree,這裡使用 zeroValue 作為沒有填上資料的值,zeros 陣列會儲存不同 level 所應該使用的 zero value。假設我們已經填上第 0 筆與第 1 筆資料,要填上第 2 筆資料時,第 2 筆資料就要跟 zeros[0] 做 hash,第 2 筆放左邊, zero value 放右邊。
我們將所有的點不論是 leaf, node, root 都用標籤 (index) 標示,並以 key-value 的形式儲存在 storage 裡面。例如第 0 筆資料會是 0–0,第 1 筆會是 0–1,這兩個 hash 後的節點 (node) 會是 1–0。假設 levels 是 2,1–0 節點就要跟 1–1 節點做 hash,即可產出 root (2–0)。
後半部份的重點在於 proof,先把 proof 和 traverse 看懂,基本上就算是打通任督二脈了,之後有興趣再看 insert 和 update。
sibling 是指要和 current 一起 hashLeftRight 的值…也就是相鄰在兩旁的 leaf (or node)。
到這裡程式碼的部分就結束了。
最後,讓我們回到一開始 client 調用 merkleTree 的例子:
以及 proof 的內容:
前面略過了 proof 裡頭的 pathIndices,pathIndices 告訴你的是當前的 leaf (or node) 是要放在左邊,還是放在右邊,大概是這個樣子:
if (indices == 0) hash(A, B);if (indices == 1) hash(B, A);
有興趣的讀者可以實作 verify function 看看就會知道了!
原始碼
TypeScript from gist
JavaScript from tornado-core
參考
Merkle Proofs Explained
What’s a Sparse Merkle Tree?
延伸:Verkle Tree
Merkle Tree in JavaScript was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
同時也有2部Youtube影片,追蹤數超過11萬的網紅CashLab卓倫,也在其Youtube影片中提到,如何在熊市獲得更多比特幣 -------------------------------------------------------------------------------------------------------------------- 這個方式不適合在牛市中使用 而偏偏在熊市...
ethereum node 在 Taipei Ethereum Meetup Facebook 的最讚貼文
📜 [專欄新文章] Optimistic Rollup 就這樣用(2)
✍️ Juin Chiu
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
ERC721 的儲值、轉移與提領
TL;DR
本文會跳過 Optimistic Rollup 的介紹而直接實際演示,關於 Optimistic Rollup 的概念與設計原理筆者將在日後另撰文說明,有興趣的讀者可以先參考下列三篇文章(由淺入深):1. OVM Deep Dive 2. (Almost) Everything you need to know about Optimistic Rollup 3. How does Optimism’s Rollup really work?
本文將演示一個 Optimism Rollup 的 ERC721 範例,程式碼在這裡。
本演示大量參考了以下範例:Optimistic Rollup Example: ERC20。
本演示所使用的 ERC721 Gateway 合約來自這個提案,目前尚未成為官方標準。
環境設置
Git
Node.js
Yarn
Docker
Docker-compose
筆者沒有碰到環境相容問題,但是建議都升到最新版本, Node.js 使用 v16.1.0 或以上版本
Optimism 服務啟動
有關 Optimisim 的所有服務,都包裝在 Optimism 這個超大專案當中了,直接使用原始碼進行組建:
$ git clone git@github.com:ethereum-optimism/optimism.git$ cd optimism$ yarn$ yarn build
組建完成後,就可以在本機啟動服務了:
$ cd ops$ docker-compose build$ docker-compose up
這個指令會啟動數個服務,包括:
L1 Ethereum Node (EVM)
L2 Ethereum Node (OVM)
Batch Submitter
Data Transport Layer
Deployer
Relayer
Verifier
Deployer 服務中的一個參數要特別注意: FRAUD_PROOF_WINDOW_SECONDS,這個就是 OPtimistic Rollup 的挑戰期,代表使用者出金(Withdraw)需等候的時長。在本篇演示中預設為 0 秒。
如果有需要重啟,記得把整個 Docker Volume 也清乾淨,例如: docker-compose down -v
Optimism 整合測試
在繼續接下來的演示之前,我們需要先確認 Optimism 是否有順利啟動,特別是 Relayer 是否運作正常,因此我們需要先進行整合測試:
$ cd optimism/integration-tests$ yarn build:integration$ yarn test:integration
確保 L1 <--> L2 Communication 相關測試通過後再繼續執行接下來的演示內容。
啟動服務及部署合約需要花費一些時間,運行一段時間(約 120 秒)之後再執行測試,如果測試結果全部皆為 Fail,可能是 Optimism 尚未啟動完成,再等待一段時間即可。
ERC721 合約部署
Optimism 啟動成功並且完成整合測試後,接下來進行 ERC721 合約的部署。筆者已將合約及部署腳本放在 optimistic-rollup-example-erc721 這個專案中:
$ git clone git@github.com:ethereum-optimism/optimistic-rollup-example-erc721.git$ cd optimistic-rollup-example-erc721$ yarn install$ yarn compile
接下來我們需要部署以下合約:
ERC721,部署於 L1
L2DepositedEERC721,部署於 L2
OVM_L1ERC721Gateway,部署於 L1
OVM_L1ERC721Gateway 只部署在 L1 上,顧名思義它就是 L1 <=> L2 的「門戶」,提供 Deposit / Withdraw 兩個基本功能,使用者必須透過這個合約來進出 L2。
雖然 OVM_L1ERC20Gateway 是 Optimistic Rollup 官方提供的合約。但是開發者也可以依需求自行設計自己的「門戶」。
OVM_L1ERC20Gateway 目前沒有 Optimism 的官方實作,本演示所使用的 ERC721 Gateway 合約來自這個提案,目前尚未成為官方標準。
接下來,我們直接用腳本進行部署:
$ node ./deploy.jsDeploying L1 ERC721...L1 ERC2721 Contract Address: 0xFD471836031dc5108809D173A067e8486B9047A3Deploying L2 ERC721...L2 ERC721 Contract Address: 0x09635F643e140090A9A8Dcd712eD6285858ceBefDeploying L1 ERC721 Gateway...L1 ERC721 Gateway Contract Address: 0xcbEAF3BDe82155F56486Fb5a1072cb8baAf547ccInitializing L2 ERC721...
ERC721 鑄造、儲值、轉移與提領
鑄造(L1)
初始狀態如下,所有帳戶皆尚未持有任何代幣:
接下來,我們將鑄造 2 個代幣以進行接下來的演示。首先,進入 ETH(L1) 的 Console:
$ npx hardhat console --network ethWelcome to Node.js v16.1.0.Type ".help" for more information.>
取得 Deployer / User 帳戶:
// In Hardhat ETH Console
> let accounts = await ethers.getSigners()
> let deployer = accounts[0]
> let user = accounts[1]
取得 ERC721 及 OVM_L1ERC721Gateway 合約物件,合約地址可以從部署訊息中取得:
// In Hardhat ETH Console
> let ERC721_abi = await artifacts.readArtifact("ExampleToken").then(c => c.abi)
> let ERC721 = new ethers.Contract("0xFD471836031dc5108809D173A067e8486B9047A3", ERC721_abi)
> let Gateway_abi = await artifacts.readArtifact("OVM_L1ERC721Gateway").then(c => c.abi)
> let Gateway = new ethers.Contract("0xcbEAF3BDe82155F56486Fb5a1072cb8baAf547cc", Gateway_abi)
鑄造兩個 ERC721 代幣:
// In Hardhat ETH Console
> await ERC721.connect(deployer).mintToken(deployer.address, "foo")
{ hash: "...", ...}
> await ERC721.connect(deployer).mintToken(deployer.address, "bar")
{ hash: "...", ...}
只有合約的 Owner(deployer) 可以進行鑄造的操作。
確認 Deployer 餘額:
> await ERC721.connect(deployer).balanceOf(deployer.address)
BigNumber { _hex: '0x02', _isBigNumber: true } // 2
確認代幣的 TokenID 與 Owner:
> await ERC721.connect(deployer).ownerOf(1)
'0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' // deployer
> await ERC721.connect(deployer).ownerOf(2)
'0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' // deployer
儲值(L1 => L2)
完成以上步驟後,目前的狀態如下:
接下來,授權 OVM_L1ERC721Gateway使用 TokenID 為 2 的代幣:
// In Hardhat ETH Console
> await ERC721.connect(deployer).approve("0xcbEAF3BDe82155F56486Fb5a1072cb8baAf547cc", 2)
{ hash: "...", ...}
在 OVM_L1ERC721Gateway 合約呼叫 Deposit,儲值 TokenID 為 2 的代幣:
// In Hardhat ETH Console
> await Gateway.connect(deployer).deposit(2)
{ hash: "...", ...}
我們可以到 Optimism (L2) 的 Console 確認入金是否成功:
$ npx hardhat console --network optimismWelcome to Node.js v16.1.0.Type ".help" for more information.>
取得 Deployer / User 帳戶:
// In Hardhat Optimism Console
> let accounts = await ethers.getSigners()
> let deployer = accounts[0]
> let user = accounts[1]
取得 L2DepositedERC721 合約物件,合約地址可以從部署訊息中取得:
// In Hardhat Optimism Console
> let L2ERC721_abi = await artifacts.readArtifact("OVM_L2DepositedERC721").then(c => c.abi)
> let L2DepositedERC721 = new ethers.Contract("0x09635F643e140090A9A8Dcd712eD6285858ceBef", L2ERC721_abi)
確認入金是否成功:
// In Hardhat Optimism Console
> await L2DepositedERC721.connect(deployer).balanceOf(deployer.address)
BigNumber { _hex: '0x01', _isBigNumber: true } // 1
> await L2DepositedERC721.connect(deployer).ownerOf(2)
'0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' // deployer
ERC721 轉移(L2 <=> L2)
完成以上步驟後,目前的狀態如下:
接下來,我們在 L2 從 Deployer 轉移代幣給 User:
// In Hardhat Optimism Console
> await L2DepositedERC721.connect(user).balanceOf(user.address)
BigNumber { _hex: '0x00', _isBigNumber: true } // 0
> await L2DepositedERC721.connect(deployer).transferFrom(depoyer.address, user.address, 2)
{ hash: "..." ...}
> await L2DepositedERC721.connect(user).balanceOf(user.address)
BigNumber { _hex: '0x01', _isBigNumber: true } // 1
> await L2DepositedERC721.connect(user).ownerOf(2)
'0x70997970C51812dc3A010C7d01b50e0d17dc79C8' // user
ERC721 提領(L2 => L1)
完成以上步驟後,目前的狀態如下:
接下來,我們用 User 帳戶提領資金,在 L2DepositedERC721 合約呼叫 Withdraw:
// In Hardhat Optimism Console
> await L2DepositedERC721.connect(user).withdraw(2)
{ hash: "..." ...}
> await L2DepositedERC721.connect(user).balanceOf(user.address)
BigNumber { _hex: '0x00', _isBigNumber: true }
最後,檢查在 L1 是否提領成功:
// In Hardhat ETH Console
> await ERC721.connect(user).balanceOf(user.address)
BigNumber { _hex: '0x01', _isBigNumber: true } // 1
> await ERC721.connect(deployer).balanceOf(deployer.address)
BigNumber { _hex: '0x01', _isBigNumber: true } // 1
> await ERC721.connect(user).ownerOf(2)
'0x70997970C51812dc3A010C7d01b50e0d17dc79C8' // user
由於挑戰期為 0 秒,因此提領幾乎無需等待時間,頂多只需數秒鐘
做完上述所有操作,最終狀態應該如下:
總結
本文演示了:
Optimistic Rollup 相關服務的本機部署
ERC721 L1 => L2 的儲值(Deposit)
ERC721 L2 帳戶之間轉移(Transfer)
ERC721 L2 => L1 的提領(Withdraw)
筆者未來將繼續擴充此系列的教學內容,例如支援其他標準的合約如 ERC1155,以及如何運行 Optimistic Rollup 生態系中最重要的驗證者(Verifier),敬請期待。
參考資料
OVM Deep Dive
(Almost) Everything you need to know about Optimistic Rollup
How does Optimism’s Rollup really work?
Optimistic Rollup Official Documentation
Ethers Documentation (v5)
Optimistic Rollup Example: ERC20(Github)
Optimism (Github)
optimism-tutorial (Github)
l1-l2-deposit-withdrawal (Github)
Proof-of-concept ERC721 Bridge Implementation (Github)
Optimistic Rollup 就這樣用(2) was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
ethereum node 在 Taipei Ethereum Meetup Facebook 的精選貼文
📜 [專欄新文章] Optimistic Rollup 就這樣用(1)
✍️ Juin Chiu
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
ERC20 的入金、轉帳與出金
TL;DR
本文會跳過 Optimistic Rollup 的介紹而直接實際演示,關於 Optimistic Rollup 的概念與設計原理我將在日後另撰文說明,有興趣的讀者可以先參考下列三篇文章(由淺入深):1. OVM Deep Dive 2. (Almost) Everything you need to know about Optimistic Rollup 3. How does Optimism’s Rollup really work?
本文將演示一個 Optimism Rollup 範例,程式碼在這裡。
本演示大量參考了以下這兩個官方範例:optimism-tutorial、l1-l2-deposit-withdrawal。
環境設置
Git
Node.js
Yarn
Docker
Docker-compose
筆者沒有碰到環境相容問題,但是建議都升到最新版本, Node.js 使用 v16.1.0 或以上版本
Optimism 服務啟動
有關 Optimisim 的所有服務,都包裝在 Optimism 這個超大專案當中了,直接使用原始碼進行組建:
$ git clone git@github.com:ethereum-optimism/optimism.git$ cd optimism$ yarn$ yarn build
組建完成後,就可以在本機啟動服務了:
$ cd ops$ docker-compose build$ docker-compose up
這個指令會啟動數個服務,包括:
L1 Ethereum Node (EVM)
L2 Ethereum Node (OVM)
Batch Submitter
Data Transport Layer
Deployer
Relayer
Verifier
Deployer 服務中的一個參數要特別注意: FRAUD_PROOF_WINDOW_SECONDS,這個就是 Optimistic Rollup 的挑戰期,代表使用者出金(Withdraw)需等候的時長。在本篇演示中預設為 0 秒。
如果有需要重啟,記得把整個 Docker Volume 也清乾淨,例如: docker-compose down -v
Optimism 整合測試
在繼續接下來的演示之前,我們需要先確認 Optimism 是否有順利啟動,特別是 Relayer 是否運作正常,因此我們需要先進行整合測試:
$ cd optimism/integration-tests$ yarn build:integration$ yarn test:integration
確保 L1 <--> L2 Communication 相關測試通過後再繼續執行接下來的演示內容。
啟動服務及部署合約需要花費一些時間,運行一段時間(約 120 秒)之後再執行測試,如果測試結果全部皆為 Fail,可能是 Optimism 尚未啟動完成,再等待一段時間即可。
ERC20 合約部署
Optimism 啟動成功並且完成整合測試後,接下來進行 ERC20 合約的部署。筆者已將合約及部署腳本放在 optimistic-rollup-example-erc20 這個專案中:
$ git clone git@github.com:ethereum-optimism/optimistic-rollup-example-erc20.git$ cd optimistic-rollup-example-erc20$ yarn install$ yarn compile
接下來我們需要部署以下合約:
ERC20,部署於 L1
L2DepositedEERC20,部署於 L2
OVM_L1ERC20Gateway,部署於 L1
其中,ERC20 與 L2DepositedERC20 是由上面的範例專案編譯的,可以直接在範例專案中直接取得 ABI;而 OVM_L1ERC20Gateway 則是由 Optimism 編譯的,屬於 Optimistic Rollup 協定的一部分,無法直接在範例專案中取得 ABI。
因此在部署以上三個合約前,我們需先手動將 OVM_L1ERC20Gateway 編譯後的生成品 (Artifacts)——即 ABI,複製到此專案中:
$ cp -r ~/projects/optimism/packages/contracts/artifacts/contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ERC20Gateway.sol ~/projects/optimistic-rollup-example-erc20/artifacts/contracts/
OVM_L1ERC20Gateway 只部署在 L1 上,顧名思義它就是 L1 <=> L2 的「門戶」,提供 Deposit / Withdraw 兩個基本功能,使用者必須透過這個合約來進出 L2。
雖然 OVM_L1ERC20Gateway 是 Optimistic Rollup 官方提供的合約。但是開發者也可以依需求自行設計自己的「門戶」。
接下來,我們直接用腳本進行部署:
$ node ./deploy.jsDeploying L1 ERC20...Deploying L1 ERC20...L1 ERC20 Contract Address: 0x1429859428C0aBc9C2C47C8Ee9FBaf82cFA0F20fDeploying L2 ERC20...L2 ERC20 Contract Address: 0x67d269191c92Caf3cD7723F116c85e6E9bf55933Deploying L1 ERC20 Gateway...L1 ERC20 Gateway Contract Address: 0xB0D4afd8879eD9F52b28595d31B441D079B2Ca07Initializing L2 ERC20...
ERC20 入金、轉帳與出金
ERC20 入金(L1 => L2)
目前餘額:
在合約部署完成後,Deployer 是目前唯一有資金的帳戶,接下來我們就進行入金(Deposit),將 Deployer 的資金從 L1 搬到 L2。
首先,進入 ETH(L1) 的 Console:
$ npx hardhat console --network ethWelcome to Node.js v16.1.0.Type ".help" for more information.>
取得 Deployer / User 帳戶:
// In Hardhat ETH Console
> let accounts = await ethers.getSigners()> let deployer = accounts[0]> let user = accounts[1]
取得 ERC20 及 OVM_L1ERC20Gateway 合約物件,合約地址可以從部署訊息中取得:
// In Hardhat ETH Console
> let ERC20_abi = await artifacts.readArtifact("ERC20").then(c => c.abi)> let ERC20 = new ethers.Contract("0x1429859428C0aBc9C2C47C8Ee9FBaf82cFA0F20f", ERC20_abi)> let Gateway_abi = await artifacts.readArtifact("OVM_L1ERC20Gateway").then(c => c.abi)> let Gateway = new ethers.Contract("0xB0D4afd8879eD9F52b28595d31B441D079B2Ca07", Gateway_abi)
先授權 OVM_L1ERC20Gateway 花費 ERC20:
// In Hardhat ETH Console
> await ERC20.connect(deployer).approve("0xB0D4afd8879eD9F52b28595d31B441D079B2Ca07", 10000)> await ERC20.connect(user).approve("0xB0D4afd8879eD9F52b28595d31B441D079B2Ca07", 10000)
注意:Deployer 及 User 都需要對 OVM_L1ERC20Gateway 進行授權,否則在接下來的出金步驟時 Relayer 會出錯
接著,在 OVM_L1ERC20Gateway 合約呼叫 Deposit:
// In Hardhat ETH Console
> await Gateway.connect(deployer).deposit(1000)
我們可以到 Optimism (L2) 的 Console 確認入金是否成功:
$ npx hardhat console --network optimismWelcome to Node.js v16.1.0.Type ".help" for more information.>
取得 Deployer / User 帳戶:
// In Hardhat Optimism Console
> let accounts = await ethers.getSigners()> let deployer = accounts[0]> let user = accounts[1]
取得 L2DepositedERC20 合約物件,合約地址可以從部署訊息中取得:
// In Hardhat Optimism Console
> let L2ERC20_abi = await artifacts.readArtifact("L2DepositedERC20").then(c => c.abi)> let L2DepositedERC20 = new ethers.Contract("0x67d269191c92Caf3cD7723F116c85e6E9bf55933", L2ERC20_abi)
確認入金是否成功:
// In Hardhat Optimism Console
> await L2DepositedERC20.connect(deployer).balanceOf(deployer.address)BigNumber { _hex: '0x03E8', _isBigNumber: true } // 1000
ERC20 轉帳(L2 <=> L2)
完成以上步驟後,目前的餘額如下:
接下來,我們在 L2 從 Deployer 轉移一部分資金給 User:
// In Hardhat Optimism Console
> await L2DepositedERC20.connect(user).balanceOf(user.address)BigNumber { _hex: '0x00', _isBigNumber: true } // 0> await L2DepositedERC20.connect(deployer).transfer(user.address, 1000){ hash: "..." ...}> await L2DepositedERC20.connect(wallet_1).balanceOf(user.address)BigNumber { _hex: '0x03E8', _isBigNumber: true } // 1000
ERC20 出金(L2 => L1)
完成以上步驟後,目前的餘額如下:
接下來,我們用 User 帳戶提領資金,在 L2DepositedERC20 合約呼叫 Withdraw:
// In Hardhat Optimism Console
> await L2DepositedERC20.connect(user).withdraw(1000){ hash: "..." ...}> await L2DepositedERC20.connect(user).balanceOf(user.address)BigNumber { _hex: '0x00', _isBigNumber: true }
最後,檢查在 L1 是否提領成功:
// In Hardhat ETH Console
> await ERC20.connect(user).balanceOf(user.address)BigNumber { _hex: '0x03E8', _isBigNumber: true } // 1000
由於挑戰期為 0 秒,因此提領幾乎無需等待時間,頂多只需數秒鐘
做完上述所有操作,餘額應該如下:
總結
本文演示了:
Optimistic Rollup 相關服務的本機部署
ERC20 L1 => L2 的入金(Deposit)
ERC20 L2 帳戶之間轉帳(Transfer)
ERC20 L2 => L1 的出金(Withdraw)
筆者未來將繼續擴充此系列的教學內容,例如 ERC721 / ERC1155 的使用方式,敬請期待。
參考資料
OVM Deep Dive
(Almost) Everything you need to know about Optimistic Rollup
How does Optimism’s Rollup really work?
Optimistic Rollup Official Documentation
Ethers Documentation (v5)
Optimism (Github)
optimism-tutorial (Github)
l1-l2-deposit-withdrawal (Github)
Optimistic Rollup 就這樣用(1) was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
ethereum node 在 CashLab卓倫 Youtube 的最佳貼文
如何在熊市獲得更多比特幣
--------------------------------------------------------------------------------------------------------------------
這個方式不適合在牛市中使用
而偏偏在熊市里 完美匹配
--------------------------------------------------------------------------------------------------------------------
「關於投資」
₿ 【加密貨幣投資開戶】:
如持BNB抵扣享75%折扣手續費優惠
買幣賣幣必備:
https://www.binance.com/zh-CN/register?ref=12196252
-------------------------------------
?【美股投資開戶】:
【微牛證券 WEBULL】:
開戶入金美股賬戶送5只美股股票
https://act.webullzone.com/invitation/cn/shareV3.html?hl=zh&inviteSource=wb_kol_us&inviteCode=cRVuQv6XNxMo
【老虎證券】:
??中國身份證開戶:
1:開戶即可1港幣兌換1股小米(01810.HK);
2:首次入金3000美金以上送10股小米+200港幣
3:首次入金10000美金以上額外送1股蘋果股票
https://itiger.com/accounts?invite=CASHLAB
??美國SSN開戶:
1、註冊開戶後抽2~15美金股票;
2、首次入金100/1000/2500/5000美元,則可以額外獲得1/2/3/4次抽取大額贈股機會,單股價值15~1000美元
https://tradeup.marsco.com/accounts/signup?invite=CASHLAB
?境外護照開戶:
開戶即送:180天60次免傭卡
入金≥ 2000SGD:送一股蘋果、5股小米
入金≥ 300000SGD:送一股亞馬遜
【TGM交易平台】
外匯/股指/貴金屬/期貨/比特幣
TMGM 開戶鏈接:
英文:https://portal.tmgm-cn.com/register?node=NjIxNjM=&language=en
中文:https://portal.tmgm-cn.com/register?node=NjIxNjM=&language=zh
Referral code: 5138132
使用卓倫的TMGM開戶邀請,將終身享受低至0點差ECN交易賬戶!
福利1、積分商城,交易兌換蘋果手機, AO門票,名表,旅遊等禮品
福利2、每日市場行情、分析師觀點無限期免費
福利3、每月交易7手 即可免費使用Forex VPS 或 阿裏雲VPS
中國大陸ID開戶客戶:6千/1萬美金入金免費好禮,限時雙倍積分
東南亞ID開戶客戶:入金$500 即可獲得$30 歡迎贈金
--------------------------------------------------------------------------------------------------------------------
【自媒體創業】
?♦限免YouTube教程:從毫無經驗的路人到月賺$1000美金只用2個月♦?
點擊獲取教程?:https://bit.ly/2VHEN2k
--------------------------------------------------------------------------------------------------------------------
?加入我的會員,窺探私密投資情況,第一時間掌握卓倫是暴富還是破產:
https://www.youtube.com/channel/UCKFrY_VVbvDwvQ3Mmd3DvUg/join
--------------------------------------------------------------------------------------------------------------------
聲明:
感謝你閱讀到這裡,以上信息中包含鏈接可能有部分為聯盟營銷鏈接,意味著本頻道會獲得很少的佣金,當然這並不會有損你個人的所有權益或收益,所有聯盟營銷的收益都將再投入進頻道以給大家提供更好的視頻內容,特此說明,謝謝。
#虛擬貨幣
#加密貨幣
#投資理財
![post-title](https://i.ytimg.com/vi/RLrQWru69vo/hqdefault.jpg)
ethereum node 在 iT24Hrs Youtube 的最佳解答
สรุปการลงทุนในสินทรัพย์ดิจิทัลทุกประเภท ลงทุนอะไรดี 2021 Digital Asset ปี 2021 / 2564 และ 3 ข้อควรระวัง
Chapters
00:00 Intro
01:31 Blockchain คืออะไร
05:40 PoW vs PoS อะไรดี
07:41 Smart Contracts คืออะไร
09:08 ICO คืออะไร
09:47 พ.ร.ก. สินทรัพย์ดิจิทัล
11:01 ICO Portal คือ
11:46 Markets & Exchange
13:02 ประเภทของ ICO
16:15 Tokenization คืออะไร
17:38 ข้อควรระวัง
Blockchain เทคโนโลยีสำคัญที่อยู่เบื้องหลัง currency อย่าง Bitcoin กำลังจะพลิกโฉมธุรกิจและการลงทุนในประเทศไทยด้วยการทำ Tokenization
Middle Man
Blockchain เข้ามาแทนที่ตัวกลางแบบเดิมๆ ต่างๆ ได้ด้วยค่าใช้จ่ายที่ถูกกว่ามากๆ และเร็วสุดๆ ด้วย
Blockchain คืออะไร
โดยพื้นฐานแล้ว Blockchain คือระบบฐานข้อมูลแบบง่ายๆ ในลักษณะรายการเดินบัญชี แต่มีคุณสมบัติพิเศษ 2 อย่าง
1. เก็บแบบถาวร - มีการเขียนข้อมูลเพิ่มอย่างเดียว ไม่มีการลบ และข้อมูลที่ได้รับการบันทึกไว้ภายใน blockchain แล้ว จะถูกแก้ไขได้ยากมากๆ จนแทบเป็นไปไม่ได้
2. Decentralized - ไม่มีศูนย์กลางในการเก็บข้อมูล ไม่มีใครเป็นเจ้าของข้อมูล แต่ข้อมูลจะถูกสำเนากระจายเก็บ เพื่อยืนยันกันเอง
Proof of Work
Blockchain มีกลไกที่ทำให้การสร้าง block ใหม่ยากขึ้น และใช้เวลานานขึ้น จะสร้าง block ได้ Block นึง ทุกครั้งต้องทำงานคำนวณอะไรบางอย่างก่อนที่ยากมากๆ เรียกว่า Proof of work ในกรณีของ Bitcoins ใช้เวลาเฉลี่ยประมาณ 10 นาที (คือการหา nonce ที่ทำให้ได้ค่า hash ต่ำกว่า target ที่จะปรับตามค่า difficulty)
แต่ 10 นาทีนี้ คือ เกิดจากกำลังประมวลผลของทั้ง network
Proof of Stake
วิธีหนึ่งที่ได้รับความนิยมในปัจจุบัน คือ Proof of Stake ที่จะดูเป็นทุนนิยมหน่อยๆ แต่ก็ใช้ปกป้องข้อมูลให้คงความถูกต้อง โปร่งใส และเชื่อถือได้เช่นกัน แต่ใช้พลังงานน้อยกว่า และ เป็นมิตรกับสิ่งแวดล้อม
Blockchain for Business
เนื่องจากข้อมูลที่ถูกบันทึกบน Blockchain ที่มีความสเถียร แก้ไขไม่ได้ และ มีความโปร่งใส เพราะกระจายสำเนาให้ทุก node ถือ และใครๆก็สามารถดูและตรวจสอบได้ จึงมีความน่าเชื่อถือ ทำให้มีการนำไปประยุกต์ใช้ในธุรกิจต่างๆ มากมายธนาคารบางธนาคาร ก็ใช้ Blockchain เชื่อมโยงเอกสารหนังสือค้ำประกันของคู่ค้า
Smart Contract
Blockchain ไม่ได้บันทึก ได้แค่ transaction Blockchain network ยุคใหม่ อย่าง Ethereum หรือ Tezos ยังถูกพัฒนาดีขึ้นอีกขั้น ให้สามารถ เขียน และ รัน Smart contract ได้
การซื้อขายอสังหาริมทรัพย์โดยไม่ต้องผ่านคนกลาง อย่าง โบรกเกอร์ นักกฏหมาย และ ธนาคาร ก็เป็นสิ่งที่ทำได้แล้ว
Investment ลงทุนอะไรดี 2021 / 2564
กระแสการลงทุนใน currency อย่าง Bitcoin ก็เคยทำให้ Bitcoin มีราคาเพิ่มสูงขึ้นอย่างน่าตระหนกถึง 20 เท่าภายในปีเดียว จากเหรียญละ 3 หมื่นบาท พุ่งไปถึง 6 แสนกว่าบาท ซึ่งก็ทำให้นักลงทุนทั่วโลกตื่นตัวกันสุดๆ กับการลงทุนในสินทรัพย์ดิจิทัลที่เกิดขึ้นจากเทคโนโลยี blockchain
ตามมาด้วยกระแสการระดมทุนของ startup ด้วยการทำ ICO หรือที่เราเรียกว่าการออกเหรียญ เพราะมีนักลงทุนจำนวนมากคิดว่าการลงทุนในเหรียญเหล่านี้ เป็นช่องทางที่จะได้รับผลตอบแทนมหาศาล
เป็นเหตุที่ทำให้ในประเทศไทย เกิดการบังคับใช้พระราชกำหนดการประกอบธุรกิจสินทรัพย์ดิจิทัล พ.ศ.2561 และการเข้ามาควบคุมการซื้อขายแลกเปลี่ยน เคอร์เรนซีและโทเคนดิจิทัลของ กลต หรือสำนักงานคณะกรรมการกำกับหลักทรัพย์และตลาดหลักทรัพย์
Digital Asset & Regulation ลงทุนอะไรดี 2021
โดยนิยามตามกฏหมายไทย สินทรัพย์ดิจิทัลมี 2 ประเภท คือ
1. Currency ซึ่งสร้างขึ้นเพื่อใช้เป็นสื่อกลางในการแลกเปลี่ยนสินค้า บริการ แบบเดียวกับเงิน เช่น Bitcoin
2. โทเคนดิจิทัล ซึ่งแบ่งเป็น 2 ประเภทย่อย คือ
• Investment token หรือ โทเคนเพื่อการลงทุน ที่สร้างขึ้นเพื่อกำหนดสิทธิของบุคคลในการร่วมลงทุน และ
• Utility token ที่สร้างขึ้นเพื่อกำหนดสิทธิในการได้รับสินค้าและบริการที่เฉพาะเจาะจง คล้ายกับ point หรือ คูปอง
ส่วน ICO ก็คือการระดมทุนด้วยการเสนอขายโทเคนดิจิทัล ซึ่งเป็นสินทรัพย์ดิจิทัลประเภทหนึ่งนะคะ โดยบริษัทจะเสนอขายโทเคนที่กำหนดสิทธิหรือผลประโยชน์ต่างๆ ของผู้ลงทุน เช่น ส่วนแบ่งกำไรจากโครงการ หรือสิทธิในการได้มาซึ่งสินค้าหรือ บริการที่เฉพาะเจาะจงและกำหนดให้ผู้ลงทุนที่ต้องการจะร่วมลงทุนสามารถเข้าร่วมได้โดยการนำเงิน มาแลกโทเคนที่บริษัทออก โดยมีการกำหนดและบังคับสิทธิที่จะได้รับด้วย smart contract
การทำ ICO ในประเทศไทยจะต้องได้รับอนุญาตจาก กลต เท่านั้นนะคะ และ ต้องทำผ่าน ICO Portal ก็คือผู้ให้บริการระบบเสนอขายโทเคนดิจิทัล ที่จะต้องได้รับความเห็นชอบ จาก กลต เช่นกัน
ซึ่งกิจกรรมการลงทุนอะไรในสินทรัพย์ดิจิทัล จะมี 2 ส่วนหลักๆ คือกิจกรรมในตลาดแรก และกิจกรรมในตลาดรอง คล้ายๆกับตลาดหุ้นเช่นกัน
ICO & Investment Token ลงทุนอะไรดี 2021 / 2564
แม้ ICO จะไม่มีการแบ่งประเภทตามกฎหมาย แต่เราอาจจะแบ่งตามลักษณะของการมีสินทรัพย์เป็นหลักประกันได้ 2 ประเภท เราจะลงทุนอะไรดี
1) Project Based ICO คือ การทำ ICO ที่นิยมทำมากในหมู่ startup
เป็นการเขียนข้อเสนอโครงการขึ้นมาเป็น white paper ระบุว่าจะนำเงินไปสร้างธุรกิจนวัตกรรมอะไร แล้วก็ระดมทุนด้วยการออกเหรียญ ซึ่ง ICO แบบนี้มูลค่าของเหรียญจะขึ้นอยู่กับอนาคตของโครงการเป็นสำคัญ
2) Asset backed ICO
ถือเป็นพัฒนาการของ ICO อีกรูปแบบหนึ่ง เป็นการออกเหรียญที่มีสินทรัพย์หนุน หรือค้ำมูลค่าอยู่ ด้วยการทำ Tokenization
Tokenization คือการแปลงสินทรัพย์ต่างๆ ทั้งที่มีตัวตนอย่าง อาคาร ที่ดิน และไม่มีตัวตน อย่าง ลิขสิทธิ์ ให้เป็น Investment Token หรือ โทเคนเพื่อการลงทุน
เว็บไซต์ของ ก.ล.ต https://www.sec.or.th/digitalasset หรือโทรสายด่วน กลต 1207
![post-title](https://i.ytimg.com/vi/zwThNO1aLOE/hqdefault.jpg)