本篇文章為大家展示了怎么以DApp的方式實現(xiàn)匿名版的以太貓,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
十年的新河網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都營銷網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整新河建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)從事“新河網(wǎng)站設(shè)計”,“新河網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實執(zhí)行。
我們現(xiàn)在基本都知道以太坊是一個區(qū)塊鏈應(yīng)用開發(fā)平臺,基于以太坊構(gòu)建的網(wǎng)絡(luò)和智能合約語言,我們可以實現(xiàn)各種各樣的與現(xiàn)實世界接近的分布式應(yīng)用(DApp)。這種基于智能合約實現(xiàn)去中心化的分布式應(yīng)用固然是一種創(chuàng)新,但不覺又引發(fā)了市場對信息安全的擔(dān)憂。目前通過以太坊區(qū)塊瀏覽器很容易就能追溯一個賬號的所有交易情況,以及該賬戶資金情況等,這基本上沒有任何門檻,只要你能上網(wǎng)就能分析一個賬號的資金流向,以及持幣等情況,這對個人來說毫無隱私可言。
目前門羅幣(Monero),達(dá)世幣(DASH)以及大零幣(Zcash)等熱門的匿名區(qū)塊鏈技術(shù)。雖然都能匿名起到隱私保護(hù)的作用,但是它們都不支持智能合約,無法用來開發(fā)DApp。超零協(xié)議(SERO)[白皮書]的公鏈,是個支持圖靈完備智能合約的匿名公鏈,采用零知識證明實現(xiàn)隱私保護(hù)技術(shù),并且已經(jīng)發(fā)布beta版本。SERO似乎是隱私保護(hù)的一個完美方案,并且可以在其上開發(fā)匿名的DAPP。
以太貓應(yīng)該是以太坊迄今為止最成熟,最成功的Dapp。它在很短的時間內(nèi)造成了以太坊的交易擁堵。以太貓是按照ERC721開發(fā)的,智能合約代碼大約兩千行,源碼在github上有開源,并且也可以在以太坊區(qū)塊瀏覽器中找到。
以太貓程序包括了七個主程序:
1、KittyAccessControl,這個合約管理只能由特定角色執(zhí)行操作的各種地址和約束。這些角色叫CEO, CFO and COO。
2、KittyBase,這個合約定義在整個核心功能中共享的最基本代碼的地方。這包括我們的主要數(shù)據(jù)存儲,常量和數(shù)據(jù)類型,以及用于管理這些數(shù)據(jù)的內(nèi)部函數(shù)。
3、KittyOwnership,這提供了遵循ERC-721規(guī)范草案的基本不可互換令牌交易所需的方法。
4、KittyBreeding,這個文件包含了將貓一起繁殖所必需的方法,包括跟蹤繁殖提供者,并依靠外部基因組合合約。
5、KittyAuctions,在這里,有公開的方法來拍賣貓或招標(biāo)貓或繁殖貓。實際的拍賣功能是在兩個兄弟合約(一個用于買賣,一個用于繁殖)中處理的,而拍賣的創(chuàng)建和投標(biāo)主要是通過核心合約。
6、KittyMinting,該合約包含用來創(chuàng)建新的gen0貓的功能
7、KittyCore,這是主要的CryptoKitties合約,編譯和運(yùn)行在以太坊區(qū)塊鏈上。這份合約把所有東西聯(lián)系在一起。
按照SERO的DApp編程規(guī)范,可以實現(xiàn)一款匿名版以太貓的DApp。目前SERO支持"發(fā)行匿名票據(jù)"的功能已經(jīng)發(fā)布,這個功能對應(yīng)的就是以太坊ERC721協(xié)議,是實現(xiàn)以太貓的基礎(chǔ)。
票據(jù)(Ticket)相關(guān)接口定義
SERO團(tuán)隊部署了一個Remix-ide的站點,其中有一個名為SeroInterface.sol的例子,主要是提供發(fā)布匿名token和ticket的接口,這些應(yīng)該是系統(tǒng)接口,只要是想實行匿名就必須繼承的。根據(jù)SERO團(tuán)隊提供的例子,在生成、轉(zhuǎn)移Ticket的接口中必須包含系統(tǒng)定義好的日志Topic
/** * the follow topics is system topics,can not be changed at will */ bytes32 private topic_sero_send = 0x868bd6629e7c2e3d2ccf7b9968fad79b448e7a2bfb3ee20ed1acbc695c3c8b23; bytes32 private topic_sero_allotTicket = 0xa6a366f1a72e1aef5d8d52ee240a476f619d15be7bc62d3df37496025b83459f; bytes32 private topic_sero_category = 0xf1964f6690a0536daa42e5c575091297d2479edcc96f721ad85b95358644d276; bytes32 private topic_sero_ticket = 0x9ab0d7c07029f006485cf3468ce7811aa8743b5a108599f6bec9367c50ac6aad;
從上面定義的topic來看每種類型的Ticket都必須有category屬性,類似于ERC721中的syboml。
SeroInterface主要提供了以下幾個接口是本次寫匿名版以太貓需要用到的:
1.生成ticketId,并將ticketId直接存入到個人賬號中去.
/** * @dev generate a tickeId and allot to the receiver address * @param _receiver receiving address of tickeId * @param _value the seq of tickeId,can be zero. if zero the system ,the system randomly generates * @param _category the category of the ticket */ function sero_allotTicket(address _receiver, bytes32 _value, string memory _category) internal returns (bytes32 ticket){ bytes memory temp = new bytes(96); assembly { let start := temp mstore(start, _value) mstore(add(start, 0x20), _receiver) mstore(add(start, 0x40), _category) log1(start, 0x60, sload(topic_sero_allotTicket_slot)) ticket := mload(add(start, 0x40)) } return; }
2.獲取交易參數(shù)中的category
/** * @dev the get category from the tx params */ function sero_msg_category() internal returns (string) { bytes memory tmp = new bytes(32); bytes32 b32; assembly { log1(tmp, 0x20, sload(topic_sero_category_slot)) b32 := mload(tmp) } return bytes32ToString(b32); }
3.獲取交易參數(shù)中的ticketId
/** * @dev the get ticketId from the tx params */ function sero_msg_ticket() internal returns (bytes32 value) { bytes memory tmp = new bytes(32); assembly { log1(tmp, 0x20, sload(topic_sero_ticket_slot)) value := mload(tmp) } return; }
4.將交易中的ticketId存入到接收方的個人賬號
/** * @dev transfer the tickeId to the receiver * @param _receiver the address of receiver * @param _category the category of ticket * @param _ticket the tickeId */ function sero_send_ticket(address _receiver, string memory _category, bytes32 _ticket)internal returns (bool success){ return sero_send(_receiver,"",0,_category,_ticket); } /** * @dev transfer the token or ticket to the receiver * @param _receiver the address of receiver * @param _currency the currency of token * @param _amount the amount of token * @param _category the category of the ticket * @param _ticket the Id of the ticket */ function sero_send(address _receiver, string memory _currency, uint256 _amount, string memory _category, bytes32 _ticket) internal returns (bool success){ bytes memory temp = new bytes(160); assembly { mstore(temp, _receiver) mstore(add(temp, 0x20), _currency) mstore(add(temp, 0x40), _amount) mstore(add(temp, 0x60), _category) mstore(add(temp, 0x80), _ticket) log1(temp, 0xa0, sload(topic_sero_send_slot)) success := mload(add(temp, 0x80)) } return; }
繼承SeroInterface的智能合約生成的ticketId將直接保存到個人賬號中去,智能合約無需管理個人賬號資產(chǎn),因此當(dāng)轉(zhuǎn)移ticket的時候,ticketId和category必須通過交易參數(shù)傳遞,無法通過智能合約方法的參數(shù)傳遞,轉(zhuǎn)移的ticketId最終也將直接存儲到接收方的個人賬號中去。弄清楚上面這幾個SERO提供的接口后,以太貓的改動就很簡單了,某種程度上在SERO上寫以太貓會更簡單,而且代碼量應(yīng)該會更少。
KittyBase
由于SERO上ticekId的數(shù)據(jù)類型全部變?yōu)閎ytes32,一次需要將KittyBase中所有ticketId的數(shù)據(jù)類型全部有uint32變成bytes32。
struct Kitty { bytes32 kittyId; uint256 genes; uint64 birthTime; uint64 cooldownEndBlock; bytes32 matronId; bytes32 sireId; bytes32 siringWithId; uint16 cooldownIndex; uint16 generation; address owner; }
kittyId的數(shù)據(jù)類型轉(zhuǎn)變后,相應(yīng)的一些數(shù)據(jù)接口也需要做調(diào)整,需要將KittyBase中的kittys由數(shù)組類型改成map
mapping(bytes32 => Kitty) kittys;
從SERO的源碼來看,做匿名交易的第一步就是匿名賬號地址,所有交易中涉及的賬號地址都被一次性地址給替換,所以之前的KittyBase中的sireAllowedToAddress修改為sireAllowedToTokenId。由tickeId到賬號的映射修改為tickeId到ticketId的映射。
mapping (bytes32 => bytes32) public sireAllowedToTokenId;
刪除kittyIndexToOwner、ownershipTokenCount兩個屬性,因為所有的ticekId最終都保存在個人賬號中,因此無需智能合約來保存ticketId和賬號之間的關(guān)系。
生成Kitty的時候在_createKitty方法中直接調(diào)用SeroInterface.sol中的sero_allotTicket方法生成kittyId并且將kittyId保存到owner的個人賬號中去,無需調(diào)用一次_transfer方法。
KittyOwnership
由于通過智能合約創(chuàng)建的kittyId創(chuàng)建后就直接發(fā)送到個人賬號中去了,因此該文件中無需ownerOf、tokensOfOwner這樣的方法,只要你能夠在你的個人賬戶中查詢到并且能夠通過交易參數(shù)將kittyId傳遞到智能合約中,就證明你這個賬號擁有這個kittyId。因此該智能合約最終只有transfer和totalSupply兩個方法。
因為本次是簡單的嘗試,很多地方從簡了。刪除了approve相關(guān)的方法,需要加上的話,我想思路就是將kittyId到賬號的映射修改為kittyId到kittyId的映射,弱化地址。只要你能將kittyId通過交易發(fā)送出去,就能證明你有擁有這個kittyId,反過來推理就能證明kittyId擁有者就是你所需要授信的賬號地址。在最終的實現(xiàn)過程中發(fā)現(xiàn)approve方法在匿名版的以太貓中可以不需要。
KittyBreeding
這個文件應(yīng)該不需要怎么改動,由于將sireAllowedToAddress修改為sireAllowedToTokenId,因此只需要修改下approveSiring方法。
function approveSiring(bytes32 _matronId) external whenNotPaused { //get _sireId A Kitty that you own from the tx param bytes32 _sireId = sero_msg_ticket(); sireAllowedToKittyId[_sireId] = _matronId; //Re-save _sireId to your personal account after approval sero_send_ticket(msg.sender,symbol,_sireId); }
_sireId就是通過交易參數(shù)傳遞給智能合約的,因此需要調(diào)用SeroInterface的sero_msg_ticket的方法獲取交易參數(shù)的中的ticekId。因為_sireId是通過交易參數(shù)傳遞,SERO鏈上會將_sireId從個人賬號中標(biāo)記為已經(jīng)使用掉,你將不再擁有該_sireId。但此處只是實現(xiàn)授權(quán),并不需要發(fā)生資產(chǎn)轉(zhuǎn)移,因此在方法的最后還需要將該_sireId再次存入到個人賬號中去。
KittyAuction
刪除createSaleAuction、createSiringAuction方法中的_kittyId參數(shù),所有該參數(shù)的獲取都調(diào)用SeroInterface的sero_msg_ticket的方法從交易參數(shù)中獲取。此處和以太坊的實現(xiàn)稍微有些區(qū)別,以太坊之前的做法是先要對saleAuction、siringAuction進(jìn)行授信,然后再通過nonFungibleContract將_kitttyId轉(zhuǎn)移到自己賬號中進(jìn)行托管。由于SERO鏈上的kittyId都存在個人賬號中,并且創(chuàng)建拍賣的時候kittyId都是通過交易參數(shù)傳遞,一旦交易成功,kittyId不可能再次使用這個kittyId,因此無需托管這一步,等bid方法被調(diào)用后直接將kittyId存入到winner的個人賬號中去。
刪除bidOnSiringAuction方法中的_matronId的參數(shù),調(diào)用者通過交易參數(shù)傳遞,然后在方法體中通過sero_msg_ticket方法獲取。此處和KittyBreeding中的approveSiring有類似的情況,_matronId通過交易參數(shù)傳遞很重要的一點就是為做一個身份校驗,并不反生資產(chǎn)的轉(zhuǎn)移,因此在方法的最后還需要將該_matronId再次存入到個人賬號中去
至此,以太貓的核心部分就都修改完成,由于GeneScienceInterface的智能合約未公布,因此mixGenes方法用生成隨機(jī)數(shù)的方法替代。有興趣的可以去網(wǎng)上找破解版的。
以太貓核心部分就是基于以太坊的ERC721(非同質(zhì)代幣協(xié)議),其次就是核心的業(yè)務(wù)邏輯。本次實現(xiàn)匿名版的以太貓主要是調(diào)整ERC721接口實現(xiàn)部分,根據(jù)SERO團(tuán)隊在SeroInterface.sol中提供的接口完全能夠?qū)崿F(xiàn)以太坊ERC721的功能,因此以上的調(diào)整主要是針對kittyId的生成,存儲,鑒權(quán)以及參數(shù)的傳遞。
因為SERO上生成的kittyId無論是創(chuàng)建還是發(fā)生交易最終都會直接存執(zhí)到個人賬號中去,因此智能合約無需管理kittyId的歸屬。在調(diào)用智能合約方法的時候,凡是涉及到需要傳遞自己擁有的kittyId的地方都必須通過交易參數(shù)傳遞到智能合約中去。需要特別注意的地方是,SERO鏈上會將交易參數(shù)中的kittyId從個人賬號中標(biāo)記為已經(jīng)使用掉,你將不再擁有該kittyId。如果通過交易參數(shù)傳遞的kittyId僅作為鑒權(quán)使用而不需要發(fā)生資產(chǎn)轉(zhuǎn)移,切記在智能合約的方法中還需要將該kittyId再次存入到個人賬號中去。
SERO實現(xiàn)匿名的第一步就是對地址作文章,無論是交易中的地址還是傳入到智能合約中地址都將轉(zhuǎn)換成一次性地址,最終只有擁有該地址私有的人才能查詢到自己的資產(chǎn)情況并且使用這些資產(chǎn),這無形當(dāng)中弱化了地址的功效。在以太貓中存在將kittyId授信給一個地址的情況,在SERO中顯然這一點無法做到這一點,因為每次傳入到智能合約中的地址可能都不一樣了,即使是同一個地址。雖然無法實現(xiàn)對一個地址直接授信,但SERO同樣可以實現(xiàn)類似的功能,只需要我們轉(zhuǎn)換下思路就可以了。因為SERO的所有資產(chǎn)都保存到個人賬戶中去了,因此對于擁有非同質(zhì)代幣的人,在某種情況下一個tickeId就能證明一個地址的身份,因此以太貓中類似將kittyId授信給一個地址的時候,都可以替換為將一個kittyId授信給另外一個kiettyId這樣的方式來實現(xiàn),授信方的kittyId必須通過交易參數(shù)傳遞到智能合約中。搞清楚以上一些主要的變化后,在不變動以太貓的業(yè)務(wù)邏輯的情況下,就能很容易將其匿名化。對比原版代碼量會更少,而且資產(chǎn)的管理邏輯也會減少,實現(xiàn)起來主要的重心就在業(yè)務(wù)邏輯上了。
通過SERO,不但可以實現(xiàn)以太貓匿名化,而且SERO之于智能合約,在支持匿名的基礎(chǔ)上還簡化了資產(chǎn)管理邏輯,使所有的DApp開發(fā)者可以將重心放到業(yè)務(wù)邏輯開發(fā)上來。某種情況下SERO降低了通過智能合約發(fā)布代幣的門檻,使傳統(tǒng)App開發(fā)者可以更加容易上手開發(fā)自己的DApp。
上述內(nèi)容就是怎么以DApp的方式實現(xiàn)匿名版的以太貓,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)頁名稱:怎么以DApp的方式實現(xiàn)匿名版的以太貓
當(dāng)前路徑:http://jinyejixie.com/article32/jopjpc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、面包屑導(dǎo)航、網(wǎng)站設(shè)計、網(wǎng)站營銷、網(wǎng)站建設(shè)、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)