在ETH智能合約內驗證過去區塊的Hash值 - 數位貨幣
By Quanna
at 2020-08-14T17:39
at 2020-08-14T17:39
Table of Contents
在Ropsten測試鏈上放了一個驗證區塊Hash值的合約。
如果我們要在乙太坊的智能合約內取得過去某個區塊的Blockhash,EVM有提供內建函式
blockhash(uint blockNumber),可以取得最近256個區塊的Hash值。若是超過256個區
塊,內建函式就無能為力了。取而代之的,我們可以要求使用者把區塊Hash值及證明傳
入合約函式,由合約驗證傳入的區塊Hash值是否正確。
合約位址及程式碼見Etherscan:
https://ropsten.etherscan.io/address/2c003df99cab1064ed93e273f54275ee8e24393a
另外有個懸賞合約給找出偽陰性(?)案例的板友1個Ropsten ETH,請見文章最後。
(雖然Ropsten ETH到水龍頭拿就有了 XD)
=============================================================================
MMR結構
合約的原理是將區塊Hash值用Merkle Mountain Range結構儲存
Merkle Mountain Range(MMR)結構就是多棵不同高度的Full Merkle Tree
G
/ \
/ \
C F
/ \ / \
A B D E H
/ \ / \ / \ / \ / \
00 01 02 03 04 05 06 07 08 09 10
如圖,11個Blockhash值組成3棵Tree,分別是
Block#00-#07的8個區塊組成高度3的Tree
Block#08-#09的2個區塊組成高度1的Tree
Block#10的1個區塊組成高度0的Tree
合約儲存這3棵Tree的Root(稱為Peak),也就是G、H、10。
當新的Blockhash值加入MMR結構時,會發生合併現象。
G
/ \
/ \
C F J
/ \ / \ / \
A B D E H I
/ \ / \ / \ / \ / \ / \
00 01 02 03 04 05 06 07 08 09 10 11
Block#11加入後,Block#08-#11合併為1棵高度2的Tree,
合約內儲存的內容變成G、J兩個Peak。
MMR的證明和驗證與一般的Merkle Tree證明流程相同,
要證明00,則額外傳入[01,B,F]做為證明,
合約內進行3次hash後,將結果與G比對即可驗證。
基本的原理是這樣,至於技術細節的說明還在寫,若想研究細節請先看程式碼。
做了一個簡單的網頁介面,可以看到MMR結構的現況,產生證明和進行驗證:
https://ayukawayen.github.io/MerkleMountainRange/
(建議開Metamask連,Metamask要連到Ropsten鏈)
=============================================================================
MMR Token
合約需要定期將新區塊的Hash值寫入MMR結構。
傳送Tx至合約位址會呼叫合約的fallback function,觸發更新流程。
這個動作需要花費gas,根據更新者所花費的gas值,給予等量的MMR Token做為回報。
任何人都可以傳送Tx來協助維護合約,Tx不需要任何input data,Gas limit建議設為
330000。
以下是一個範例Tx的ID,總共花了237,682的gas,獲得202,670個MMR Token:
0xff230cc54fe3837a074b99d4056e44b4fd4348b08852728418aba170077ad9f2
MMR Token可以用來支付驗證手續費。
其他合約在鏈上呼叫合約的verifyOnChain()函式時,每次驗證收取6000個MMR Token做
為手續費,鏈下呼叫verify()函式時則不需要手續費。
也可以直接用Ropsten ETH向合約換MMR Token,避免需要驗證卻無法取得Token的情況。
=============================================================================
懸賞合約
合約位址與程式碼同樣見Etherscan:
https://ropsten.etherscan.io/address/a702611a1b4cd6149df1bac72d3462e286d3d918
UI還沒寫好,熟悉Etherscan操作的人可以先使用Etherscan和合約互動。
只要能輸入1個blockNumber、2個blockHash及證明,符合以下條件:
兩個blockHash都不是0
兩個blockHash值不相同
兩個blockHash都通過MMR驗證
就能取得合約裡的所有Ropsten ETH。
兩次驗證需要12000個MMR Token,底下開放推文,留下Ropsten位址,我會轉12000個
Token過去,approve給懸賞合約後,呼叫challengeWithToken()進行挑戰。
=============================================================================
如果有在Ropsten上開發智能合約,有驗證過去區塊的需求的話,也可以試用看看。
不過程式碼是未經審查的,可能有bug。
--
ethereum:0xF78CF7Bb109f7fB55e3Cba2DD87edd5e836Eb0b3
simpleledger:qqjzmy6mjp8sp97c7thhflv9s2j96xk0q5dcppcf4p
--
Tags:
數位貨幣
All Comments
By Donna
at 2020-08-16T16:12
at 2020-08-16T16:12
By Elizabeth
at 2020-08-20T09:35
at 2020-08-20T09:35
By Yuri
at 2020-08-20T14:24
at 2020-08-20T14:24
By Zenobia
at 2020-08-20T16:18
at 2020-08-20T16:18
By Gilbert
at 2020-08-24T11:56
at 2020-08-24T11:56
By Xanthe
at 2020-08-28T04:59
at 2020-08-28T04:59
By Ophelia
at 2020-09-01T12:13
at 2020-09-01T12:13
By Ivy
at 2020-09-03T20:07
at 2020-09-03T20:07
By Ophelia
at 2020-09-06T00:37
at 2020-09-06T00:37
By Hedy
at 2020-09-06T19:18
at 2020-09-06T19:18
By Rae
at 2020-09-10T07:46
at 2020-09-10T07:46
By Connor
at 2020-09-11T17:13
at 2020-09-11T17:13
By Michael
at 2020-09-12T18:57
at 2020-09-12T18:57
By Poppy
at 2020-09-13T11:20
at 2020-09-13T11:20
By Selena
at 2020-09-15T16:26
at 2020-09-15T16:26
By Mary
at 2020-09-20T09:12
at 2020-09-20T09:12
Related Posts
Yam Finance沈痛宣告項目死亡幣暴跌99%,
By Sandy
at 2020-08-14T16:14
at 2020-08-14T16:14
以太幣挖礦的黃金時機 ft. GPUMINE 朱昱翰
By Olive
at 2020-08-14T13:24
at 2020-08-14T13:24
區塊鏈於萬物聯網經濟將扮演關鍵性作用
By Elizabeth
at 2020-08-14T11:33
at 2020-08-14T11:33
《富爸爸》作者:現在是買進黃金、白銀
By John
at 2020-08-13T16:08
at 2020-08-13T16:08
IOTA下周主網將達到1000TPS ??
By Jessica
at 2020-08-11T12:29
at 2020-08-11T12:29