溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么以DApp的方式實現(xiàn)匿名版的以太貓

發(fā)布時間:2021-12-17 17:24:53 來源:億速云 閱讀:101 作者:柒染 欄目:互聯(lián)網(wǎng)科技

本篇文章為大家展示了怎么以DApp的方式實現(xiàn)匿名版的以太貓,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

現(xiàn)在區(qū)塊鏈開發(fā)平臺的隱私保護(hù)問題

我們現(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)就能分析一個賬號的資金流向,以及持幣等情況,這對個人來說毫無隱私可言。

SERO:世界上首個支持智能合約的匿名公鏈

怎么以DApp的方式實現(xiàn)匿名版的以太貓

目前門羅幣(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ū)塊瀏覽器中找到。

怎么以DApp的方式實現(xiàn)匿名版的以太貓

以太貓程序包括了七個主程序:
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)系在一起。

匿名版以太貓實現(xiàn)

怎么以DApp的方式實現(xià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的站點(diǎn),其中有一個名為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ù)傳遞很重要的一點(diǎn)就是為做一個身份校驗,并不反生資產(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中顯然這一點(diǎn)無法做到這一點(diǎn),因為每次傳入到智能合約中的地址可能都不一樣了,即使是同一個地址。雖然無法實現(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)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI