比特幣價格 比特幣價格
Ctrl+D 比特幣價格
ads

zk-STARK: 在以太坊上驗證復雜的自動對戰計算

Author:

Time:1900/1/1 0:00:00

原文作者:?Killari

原文標題:?STARKs:VerifyingcomplexautobattlercalculationonEthereum—Scalingdecentralizedgames

在以太坊上執行復雜的函數一直是一個大忌,永遠不應該這么做。區塊鏈計算是非常昂貴的,因為需要所有節點執行相同的計算來驗證其正確性。

StarkWare是以太坊擴展服務之一,它試圖使用STARK證明來擴展以太坊。在這篇文章中,我不會太深入于STARK是如何工作的,但我將對它在實踐中的應用做一個實際的概述。

有時在STARK前面加上“zk-”前綴,表示“零知識證明”,這使得STARK能夠在不透露我們試圖證明的事物的所有信息的情況下證明一些東西。StarkWare公司正致力于在以后的管道中加入ZK,但現在他們只關注可擴展性,而要實現這一點并不需要零知識。

Vitalik的博客文章對于zk-SNARK如何呈現在用戶面前所繪制的插圖。

Vitalik在他的文章中對STARK做了一個簡短的概述。STARK第一部分:用多項式進行證明,簡要解釋了這些加密基元的工作原理。還有SNARK,可以實現與STARK類似的東西,但有點不同。如果對理解zk-SNARK更感興趣,強烈推薦這篇解釋論文:zk-SNARK的原理和實現,MaksymPetkus的權威解釋。Petkus解釋了zk-SNARK的原理,從非常基本的數學,然后逐步深入更復雜的數學,站在前人的肩膀上眺望。非常棒的閱讀體驗。

Petkus對zk-SNARK總結如下:

零知識簡明非交互式知識論證是真正巧妙的方法,可以證明某件事情是真實的,而不透露任何其他信息。

STARK和自動對戰游戲

自動對戰游戲是一種游戲類型,玩家在其中做出角色成長的選擇,但在戰斗當中不能做出任何選擇,而是自動進行。如果有這樣的游戲在以太坊L1上運行,會很好玩,但目前這樣的游戲做不起來。

那么,STARK能給自動對戰游戲帶來什么好處呢?自動對戰游戲的模擬可能是非常復雜的,所以很難跑起來。如果有一種技術可以使它只運行一次,而其他玩家可以只相信這種計算,同時確信沒有人在說謊,這將使我們能夠擁有一個去中心化的自動對戰。

以下是行動計劃:

1)用Python編寫自動對戰邏輯。

2)用StarkNet的Cairo語言建立一個驗證器。

3)執行自動戰斗的代碼,用我們建立的Cairo驗證器創建一個關于程序執行的STARK證明。

4)觀察我們如何在以太坊的Solidity環境利用自動戰斗器的戰斗結果。

用Python編寫自動戰斗系統

為了開始我們的旅程,我們簡單地對自動對戰的邏輯進行編程,就像我們平時做的那樣,這里不需要STARK的魔法。

我們在兩個角色之間做一個自動對戰的模擬器。這些角色有四種狀態:

-健康。等于他們能承受的傷害總量。

接下來,讓我們選出誰將會有這場史詩般的戰斗:

我們將有一個食人魔,它有很長的血條,每次攻擊造成48點傷害,但每次攻擊之間需要等80下。食人魔每回合還能恢復三點健康值。

Opside ZK-RaaS現已支持ETH/BSC/Polygon測試網等L1選項:8月14日消息,據官方消息,ZK-RaaS平臺OpsideOpside 宣布發布Rollup LaunchBase Alpha版本,現已上線測試網。

該版本中,Rollup L1主鏈選項新增支持 ETH/BSC/Polygon 測試網,并提供多種 DA / shared sequencer 等模塊化組件。此外,Rollup LaunchBase還支持添加多種Infra as a Service選項供項目方進行初期選擇,包括Dex as a Service, Oracle as a Service, NFTmarket as a Service, DID as a Service等,可選項涵蓋 iZUMi、Star Protocol、Space ID、Supraoracle等。[2023/8/14 16:24:42]

我們的挑戰者英雄的生命值要低得多,只有240血,完全沒有生命值恢復,每次攻擊的傷害較小,但我們的英雄只需等待2個回合就可以攻擊。因此,至少我們的英雄在某種程度上比食人魔要好!這就是我們的英雄。這是一場真正的大衛和歌利亞之間的戰斗。

我們可以在代碼中定義我們的角色,如下所示

player1?=?Character(1000,?48,?80,?3)?#?Ogreplayer2?=?Character(240,?20,?2,?0)?#?Hero

然后我們可以通過調用戰斗函數來模擬戰斗。

simulateFight(player1,?player2

我們將得到戰斗的結果:

{????"player1":?{?????"stats":?????},????"player2":?{?????"stats":?????},????"log":?{?????"endHealths":?,?????"nCombatRounds":?272????}}ZERO_HP_POINT?=?1000assert?player1.damage?<?ZERO_HP_POINTassert?player2.damage?<?ZERO_HP_POINTdata?=?{????'player1':?{?????'stats':?????},????'player2':?{?????'stats':?????},??'log':?simulateFight(player1,?player2。data?=?]with?open('combat-input.json',?'w')?as?outfile:json.dump(data,?outfile)

我們可以從結果中讀出,這場戰斗持續了272個回合,戰斗結束是因為食人魔被打敗了。我們的英雄以巨多的96點血取得了勝利!這就是我們的英雄。

接下來讓我們把所有關于戰斗的必要的重要信息存儲在一個文件中,這樣我們就可以在以后用STARK證明來證明這場戰斗。我們所需要的是程序輸入和程序輸出。我們的驗證器根本不需要程序本身!

我們將用Cairo編寫驗證器。Cairo是一種用于編寫可驗證程序的編程語言。Cairo的許多要求之一是,所有的輸入都必須是非負數。這是我們開發人員的不幸,但是我們英雄的幸事,食人魔的健康值會變負,這就是一個負數:(

ZK-EVM Kakarot完成pre-seed輪融資,Vitalik、StarkWare等參投:6月2日消息,zkEVM 開發平臺 Kakarot 完成Pre-Seed 輪融資,StarkWare、LambdaClass 和天使投資人 Vitalik、Nicolas Bacca、Rand Hindi 等參投。

Kakarot zkEVM 是 Cairo 實施的 EVM,利用 STARK 證明來證明交易和區塊,確保透明度和安全性。據介紹,Kakarot zkEVM 發展分為三個階段:1、作為 EVM 存在于 Starknet L2 上;2、和 Starknet 定序器 Madara 合力創建第 3 層 zkEVM;3、Kakarot 和 Madara 組合啟用類型 1 zkEVM。[2023/6/2 11:54:47]

為了繞過這個限制,我們將在所有的健康值上加上1000,如果一個角色的健康值低于1000,就認為他已經死亡。為了使這個方法適用于不同的角色傷害值,我們還需要確保一個角色的傷害永遠不會超過1000,因為那樣的話某人的健康狀況可能會再次變成負數。以下是代碼:

{????"player1":?{?????"stats":?????},????"player2":?{?????"stats":?????},????"log":?{?????"endHealths":?,?????"nCombatRounds":?272????}}ZERO_HP_POINT?=?1000assert?player1.damage?<?ZERO_HP_POINTassert?player2.damage?<?ZERO_HP_POINTdata?=?{????'player1':?{?????'stats':?????},????'player2':?{?????'stats':?????},??'log':?simulateFight(player1,?player2。data?=?]with?open('combat-input.json',?'w')?as?outfile:json.dump(data,?outfile)

這段代碼為我們產生了最終的模擬輸出,它將被儲存在combat-input.json文件中。

{????"player1":?{?????"stats":?????},????"player2":?{?????"stats":?????},????"log":?{?????"endHealths":?,?????"nCombatRounds":?272????}}

編寫Cairo驗證器

接下來,我們需要編寫一個驗證器程序,以便能夠對我們的Python程序的執行進行STARK證明。這個程序需要能夠驗證,在給定初始玩家屬性的情況下,當模擬代碼運行時,模擬器會產生顯示在log區域的確切輸出。為了實現這一點,我們將改用Cairo語言編程。

我們將在Cairo中定義角色結構,其方式與我們在python中看到的非常相似:

struct?Character:????member?health:?felt????member?damage:?felt????member?attackRecoverTime:?felt????member?healthPerTurn:?feltend

動態 | Tezos宣布zk-SNARKs將是該網絡的下一個協議修訂:Tezos(XTZ)宣布,zk-SNARKs將是該網絡上的下一個協議修訂,通過這一改進,該網絡將有可能為包括商業銀行和中央銀行在內的新客戶提供解決方案。新的改進將為Tezos網絡提供“微調的(finetuned)隱私”,這對提高Tezos的可用性非常重要。此外,這次升級還將提供一個新的Michelson指令,允許智能合約在屏蔽的區塊鏈上存儲和執行事務。Nomadic Labs核心開發者Marc Beunardeau評論道:“這樣做的目的不是讓Tezos成為一枚隱私幣,而是讓用戶在處理自身監管問題的同時,擁有隱私交易的自由。[2019/10/23]

與Python相比,這里的一個很大的區別是,我們需要將所有的變量指定為某種陌生的數據類型felt。felt數據類型是一個252位的變量類型,定義在(-P/2,P/2)之間,其中P是一個252位的大素數。

雖然看起來很奇怪,但對于我們的目的來說,felt的行為就像一個整數。這種數據類型的意義在于,與我們實際處理整數或浮點變量類型相比,Cairo編譯器更容易從我們的代碼中做出STARK證明。你可以從Cairo的文檔中閱讀更多關于felt變量類型的信息。

現在,讓我們開始編寫Cairo程序,以確保戰斗已經按計劃進行,而且程序的執行者不能對其他玩家撒謊。除了輸入變量的felt類型和非負性之外,Cairo還有一些其他的限制。我們在Python代碼中使用了一個while循環,但是動態長度循環在Cairo中是不可能的,我們需要通過遞歸來實現同樣的邏輯。因此,讓我們定義一個遞歸函數,它將驗證一個單一回合的戰斗,然后再遞歸驗證所有其他回合的戰斗:

func?simulateCombat{?range_check_ptr?}?(?player1:?Character,?player2:?Character,?currentHealths:?(felt,?felt),?lastAttacks:?(felt,?felt),?currentRound:?felt,?nCombatRounds:?felt)?->?(?simNextHealths:?(felt,?felt),?simNextLastAttacks:?(felt,?felt))

該函數接收我們的兩個角色,他們當前的健康狀況和最后一次攻擊的計時器,當前的戰斗回合和要模擬的戰斗回合數。然后,我們將在驗證回合后返回更新的健康和最后一次攻擊的計時器,以便能夠通過遞歸驗證下一個回合。

你可能已經注意到了我們函數開頭的range_check_ptr。range_check_ptr是一個指針,我們需要用它來進行范圍檢查。這些運算在Cairo中也很困難,但幸運的是,我們仍然能夠通過使用Cairo的range_check_ptr內置函數來完成這些運算。

接下來,讓我們開始定義函數的內部內容。我們基本上實現了與我們在Python中的戰斗回合完全相同的邏輯:

alloc_localslocal?nextHealths:?(felt,?felt)local?nextLastAttacks:?(felt,?felt)local?ZERO_HP_POINT?=?1000if?lastAttacks?==?player2.attackRecoverTime:?tempvar?afterDamage?=?currentHealths?-?player2.damage?nextHealths?=?afterDamage??player1.healthPerTurn?nextLastAttacks?=?0else:?nextHealths?=?currentHealths??player1.healthPerTurn?nextLastAttacks?=?lastAttacks??1endif?lastAttacks?==?player1.attackRecoverTime:?tempvar?afterDamage?=?currentHealths?-?player1.damage?nextHealths?=?afterDamage??player2.healthPerTurn?nextLastAttacks?=?0else:?nextHealths?=?currentHealths??player2.healthPerTurn?nextLastAttacks?=?lastAttacks??1end

動態 | TRON將實現“四大發展” 包括將于2019年第二季度推出的zk-SNARKs:米莎·萊德曼(Misha Lederman)透露TRON的主要發展將在2019年第二季度實現,包括:

-比特流速度;

-對機構友好的多重簽名和賬戶管理;

-USDT-TRON穩定幣在TRX區塊鏈上推出;

-保護交易流程的隱私[2019/3/22]

與Python相比,Cairo代碼的編寫方式有些不同。這是因為在Cairo中我們只能利用常數變量。一旦我們為一個變量設置了一個值,我們就不能再改變它的內容。因此,當我們為健康恢復而增加玩家的生命值時,我們在計算傷害的同時也計算了它。

接下來我們將檢查我們是否已經模擬了所要求的回合數,如果是,我們就結束模擬。如果模擬還沒有結束,我們需要檢查兩個玩家是否還活著。如果我們沒有這個檢查,惡意的模擬器運行者可以一直模擬戰斗,直到兩個玩家都死了,這會讓一個已經死了的玩家繼續戰斗!我們不能允許這樣的瘋狂行為,我們不能允許不死的戰士出現在我們的競技場上!

if?currentRound?==?nCombatRounds:?return(nextHealths,?nextLastAttacks)else:?#?if?the?combat?has?not?ended,?nobody?can?be?dead?assert_nn(nextHealths?-?ZERO_HP_POINT)?assert_nn(nextHealths?-?ZERO_HP_POINT)end

這里我們使用的是assert_nn函數,它正在檢查函數內部的值是否為非負值:nextHealths>ZERO_HP_POINT。如果assert為假,則執行失敗,我們知道運行模擬器的人對我們撒謊了。

最后,讓我們調用我們的函數來獲得下一輪的模擬,然后我們將返回最終的模擬結果。

let?(simulatedEndHealths,?simulatedLastAttacks)?=?simulateCombat(?player1?=?player1,?player2?=?player2,?currentHealths?=?nextHealths,?lastAttacks?=?nextLastAttacks,?currentRound?=?currentRound??1,?nCombatRounds?=?nCombatRounds)return(?simNextHealths?=?simulatedEndHealths,?simNextLastAttacks?=?simulatedLastAttacks)

一旦我們有了模擬邏輯的代碼,我們就需要為我們的Cairo程序編寫主函數。該程序需要讀取Python程序的輸出,然后調用我們剛剛創建的simulateCombat函數。該函數將返回最終的健康值,然后我們需要將其與Python程序的輸出進行對比。下面是代碼:

func?main{?output_ptr:?felt*,?range_check_ptr?}()?->?():?alloc_locals?local?range_check_ptr?=?range_check_ptr?local?pl1:?Character*?local?pl2:?Character*?local?endHealths:?felt*?local?nCombatRounds:?felt?%{?????log?=?program_input?????dat_endHealths?=?log?????dat_nCombatRounds?=?log??????????ids.pl1?=?pl1?=?segments.add()?????for?i,?val?in?enumerate(program_input):?????????memory?=?val??????????????ids.pl2?=?pl2?=?segments.add()?????for?i,?val?in?enumerate(program_input):?????????memory?=?val?????ids.endHealths?=?endHealths?=?segments.add()?????for?i,?val?in?enumerate(dat_endHealths):?????????memory?=?val?????ids.nCombatRounds?=?dat_nCombatRounds?????assert?len(program_input)?==?4?????assert?len(program_input)?==?4?????assert?len(dat_endHealths)?==?2?%}?????local?player1:?Character?=?pl1?local?player2:?Character?=?pl2?????local?currentHealths:?(felt,?felt)?=?(player1.health,?player2.health)?local?lastAttacks:?(felt,?felt)?=?(0,?0)?????let?(simulatedEndHealths,?lastSimulatedAttacks)?=?simulateCombat(?????player1?=?player1,?????player2?=?player2,?????currentHealths?=?currentHealths,?????lastAttacks?=?lastAttacks,?????currentRound?=?0,?????nCombatRounds?=?nCombatRounds?)?????#?Check?that?the?healths?will?match?what?was?claimed?assert?simulatedEndHealths?=?endHealths?assert?simulatedEndHealths?=?endHealths?#?Return?the?program?input?and?output?serialize_word(player1.health)?serialize_word(player1.damage)?serialize_word(player1.attackRecoverTime)?serialize_word(player1.healthPerTurn)?????serialize_word(player2.health)?serialize_word(player2.damage)?serialize_word(player2.attackRecoverTime)?serialize_word(player2.healthPerTurn)?????serialize_word(simulatedEndHealths)?serialize_word(simulatedEndHealths)?????return?()end

聲音 | V神:建議使用zk-SNARK來擴展以太坊:據blockmanity消息,V神關于以太坊研究的最新文章,概述了一個關于鏈縮放的解決方案,沒有任何附加層,而是使用zk- spuks(隱私令牌ZCash背后的加密算法),該方案可能將以太坊擴展至500tx/秒。[2018/9/23]

除了檢查這些戰士的nCombatRounds模擬結果是否為給定的健康值外,我們還應該檢查在戰斗結束時是否有一個或兩個角色已經死亡。如果想讓戰斗持續下去,直到有人死亡。我們沒有在這個簡單的例子中實現這一點,可以由讀者來實現。在目前的代碼中,只能模擬運行幾輪,并在給定回合后,在任何一個玩家死之前停止戰斗。然而,執行者不能對模擬回合的進行情況撒謊,因為這是我們要檢查的。

運行!

我們可以運行Python模擬器,用以下命令編譯我們的Cairo驗證器:

>?python?combat.py>?cairo-compile?combat.cairo?--?output?combat-compiled.json

然后我們可以用我們用combat.py生成的輸入文件來運行Cairo程序,生成combat.pie文件:

>?cairo-run?--?program=combat-compiled.json?--?program_input=combat-input.json?--?layout=small?--?cairo_pie_output=combat.pie

我們還可以用以下命令驗證pie文件是否正確:

>?cairo-run?--?layout=small?--?run_from_cairo_pie=combat.pie

你可以嘗試修改battle-input.json文件的結果健康值,要注意的是,如果不得到Cairo的驗證錯誤,你就不能修改它們。對于每個起始輸入,戰斗只有一種解決方式。例如,如果我們試圖作弊,在戰斗結束時給我們的英雄多加一個健康值,驗證器會注意到我們在試圖作弊。

combat.cairo:120:5:?Error?at?pc=0:201:An?ASSERT_EQ?instruction?failed:?1096?!=?1097assert?simulatedEndHealths?=?endHealths^*******************************************^

.pie文件包含了SHARP為我們進行證明生成所需的所有信息。SHARP是由StarkWare運營的一項服務,它可以生成證明,證明Cairo程序執行的有效性。然后,它將這些證明發送到以太坊測試網,由以太坊智能合約進行驗證。

目前,SHARP不能在本地運行,從Cairo程序中生成證明的唯一方法是利用StarkWare的服務器來做證明驗證。希望這種情況在未來會有所改變,任何人都可以生成關于任何東西的證明。StarkWare公司計劃在稍后階段發布SHARP的源代碼。目前現狀來說,去中心化的游戲無法使用Cairo來構建。

讓我們向SHARP提交我們的工作吧:

>?cairo-sharp?submit?--?cairo_pie?combat.pieSubmitting?to?SHARP...Job?sent.Job?key:?f48c551e-c0c6-4cf5-8a52-a0aa1c43728cFact:?0x17ee903dfb54b55e53cc03d5a47602e83ed0ff9e219fe4567b8d59fa2666f682

過了很久,我們應該能看到我們的事實被驗證了,而且是有效的:

>?cairo-sharp?is_verified?0x17ee903dfb54b55e53cc03d5a47602e83ed0ff9e219fe4567b8d59fa2666f682?--?node_url=https://goerli-light.eth.linkpool.io/True

我們也可以從Cairo的游樂場找到這個結果。

https://www.cairo-lang.org/playground/sharp.html?job_key=f48c551e-c0c6-4cf5-8a52-a0aa1c43728c

在以太坊智能合約上利用證明

現在我們知道,對于給定的輸入值,給定事實哈希值,程序應該輸出最終的健康值,我們能夠在鏈上驗證計算,而無需在鏈上再次執行計算。

實際上,我們還缺少一個信息,那就是程序的哈希值。

>?cairo-hash-program?-program?combat-compiled.json0x248070cb7b7f20b0b9445a382fdb4faa6b69c1f3653355077ae05b82c636ddf

這是我們之前所有工作的高潮,現代密碼學的奇跡,一個簡單的Solidity函數可以驗證一個事實并檢查程序輸出programOutput是否有效。所有這些都不需要計算本身。

function?verifyCombatOutput(uint256?memory?programOutput)?public?bytes32?cairoProgramHash_?=?0x248070cb7b7f20b0b9445a382fdb4faa6b69c1f3653355077ae05b82c636ddf?//?Ensure?that?a?corresponding?proof?was?verified.?bytes32?outputHash?=?keccak256(abi.encodePacked(programOutput));?bytes32?fact?=?keccak256(abi.encodePacked(cairoProgramHash_,?outputHash));?require(cairoVerifier_.isValid(fact),?"MISSING_CAIRO_PROOF");?//?Ensure?the?output?consistency?with?current?system?state.?require(programOutput.length?==?10,?"INVALID_PROGRAM_OUTPUT");?require(player1.health?==?programOutput,?"INVALID_PROGRAM_OUTPUT?0");?require(player1.damage?==?programOutput,?"INVALID_PROGRAM_OUTPUT?1");?require(player1.attackRecoverTime?==?programOutput,?"INVALID_PROGRAM_OUTPUT?2");?require(player1.healthPerTurn?==?programOutput,?"INVALID_PROGRAM_OUTPUT?3");?????require(player2.health?==?programOutput,?"INVALID_PROGRAM_OUTPUT?4");?require(player2.damage?==?programOutput,?"INVALID_PROGRAM_OUTPUT?5");?require(player2.attackRecoverTime?==?programOutput,?"INVALID_PROGRAM_OUTPUT?6");?require(player2.healthPerTurn?==?programOutput,?"INVALID_PROGRAM_OUTPUT?7");?????//?Now?we?know?that?programOutput?and?programOutput?represent?the?resulting?health?values,?//?given?the?initial?combat?state?variables?programOutput!.?????//?Pure?Magic.}

這里cairoVerifier._isValid(fact)是一個Goerli的合約。

https://goerli.etherscan.io/address/0xAB43bA48c9edF4C2C4bB01237348D1D7B28ef168

可以在這里找到文章中文件的源代碼:https://github.com/KillariDev/STARK-Combat

Tags:PLAYPLALAYERSTAXCAD Network PLAYPlayermonlayer幣的價值I-STABLE價格

中幣下載
以太坊:以太坊分叉機會難道真的大于弊端嗎?非也!_ETH

最近鬧的沸沸揚揚的以太坊分叉,聊一聊一些看法:經過一番思考,這是我對ethpow分叉的看法1.許多人,包括我在內,多年來一直預測礦工將分叉以太坊以從他們的投資中提取最終的利益.

1900/1/1 0:00:00
COM:XT.COM關於暫停SC充提的公告_HTT價格

尊敬的XT.COM用戶:因SC錢包升級維護,XT.COM現已暫停SC充提業務。給您帶來的不便,請您諒解!感謝您對XT.COM的支持與信任.

1900/1/1 0:00:00
GEX:AMGEX跟單系統榮獲圈內一致好評_MGE

2022年,加密市場牛熊頻出,對于很多現貨交易者們來說,市場的頻繁動蕩很容易造成抄底失敗被套牢。在行情走勢不穩定的情況下,越來越多投資者紛紛投身合約交易.

1900/1/1 0:00:00
UDO:全面解讀sudoswap:團隊、特點和發幣規劃_amm幣怎樣

原文作者:Karen,ForesightNewsUniswap在收購NFT聚合市場Genie之后,又宣布將通過sudoswap實現NFT交易,而就在Uniswap官宣該合作關系前的半個月.

1900/1/1 0:00:00
BLO:Blockchain.com CEO:除了讓投資者獲利頗豐,以太坊「殺手」們水平有限_blockchaintechnology

本文來自?The?Block,原文作者:RyanWeeksOdaily星球日報譯者?|念銀思唐 摘要: -少數風險投資者從所謂的以太坊“殺手”中獲利頗豐——盡管以太坊繼續占據主導地位.

1900/1/1 0:00:00
DAI:復盤——身處鬧市,為何卻與最大的機會失之交臂?_Compound USDT

讓我們先看一組數據,ETH2.0概念幣的表現,從底部開始算1、OP,底部0.4,最高2.4,現在1.65,4倍2、ETC,底部13,34,最高45,現在43.4,現仍有4倍3、LDO.

1900/1/1 0:00:00
ads