成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

如何編寫(xiě)一個(gè)可升級(jí)的智能合約

Euphoria / 1466人閱讀

摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接如何編寫(xiě)一個(gè)可升級(jí)的智能合約原文已更新,請(qǐng)讀者前往原文閱讀區(qū)塊鏈信任基礎(chǔ)的數(shù)據(jù)不可修改的特性,讓它傳統(tǒng)應(yīng)用程序有一個(gè)很大的不同的地方是一經(jīng)發(fā)布于區(qū)塊鏈上就無(wú)法修改不能直接在原有的合約上直接修改再重新發(fā)布。

本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)
原文鏈接:如何編寫(xiě)一個(gè)可升級(jí)的智能合約原文已更新,請(qǐng)讀者前往原文閱讀

區(qū)塊鏈信任基礎(chǔ)的數(shù)據(jù)不可修改的特性,讓它傳統(tǒng)應(yīng)用程序有一個(gè)很大的不同的地方是一經(jīng)發(fā)布于區(qū)塊鏈上就無(wú)法修改(不能直接在原有的合約上直接修改再重新發(fā)布)。

寫(xiě)在前面

閱讀本文前,你應(yīng)該對(duì)以太坊、智能合約及Solidity語(yǔ)言有所了解,如果你還不了解,建議你先看以太坊是什么

當(dāng)智能合約出現(xiàn)bug

一方面正式由于智能合約的不可修改的特性,因?yàn)橹灰?guī)則確定之后,沒(méi)人能夠修改它,大家才能夠信任它。但另一方面,如果規(guī)則的實(shí)現(xiàn)有Bug, 可能會(huì)造成代幣被盜,或是調(diào)用消耗大量的gas。這時(shí)就需要我們?nèi)バ迯?fù)錯(cuò)誤。

我們知道一個(gè)智能合約包含兩部分: 代碼邏輯和數(shù)據(jù),而代碼邏輯又是最容易出問(wèn)題的部分, 如在實(shí)現(xiàn)如下合約時(shí),由于手抖在寫(xiě)addTen()時(shí),10寫(xiě)成了11。

pragma solidity ^0.4.18;

contract MyContract {
    mapping (address => uint256) public balanceOf;
    
    function setBlance(address _address,uint256 v) public {
        balanceOf[_address] = v;
    }

    function addTen(address addr) public returns (uint){
        return balanceOf[addr] + 11;
    }
}

假如我們?cè)诓渴鹬蟀l(fā)現(xiàn)了這個(gè)問(wèn)題,想要修復(fù)這個(gè)bug的話,只好重新部署合約,可是這時(shí)會(huì)有一個(gè)尷尬的問(wèn)題,原來(lái)的合約已經(jīng)有很多人使用,如果部署新的合約,老合約的數(shù)據(jù)將會(huì)丟失。

數(shù)據(jù)合約及控制合約

那么如何解決上面的問(wèn)題了,一個(gè)解決方案是分離合約中的數(shù)據(jù),使用一個(gè)多帶帶的合約來(lái)存儲(chǔ)數(shù)據(jù)(下文稱數(shù)據(jù)合約),使用一個(gè)多帶帶的合約寫(xiě)業(yè)務(wù)邏輯(下文稱控制合約)。
我們來(lái)看看代碼如何實(shí)現(xiàn)。

pragma solidity ^0.4.18;

contract DataContract {
    mapping (address => uint256) public balanceOf;

    function setBlance(address _address,uint256 v) public {
        balanceOf[_address] = v;
    }
}

contract ControlContract {

    DataContract dataContract;

    function ControlContract(address _dataContractAddr) public {
        dataContract = DataContract(_dataContractAddr);
    }

    function addTen(address addr) public returns (uint){
        return dataContract.balanceOf(addr) + 11;
    }
}

現(xiàn)在我們有兩個(gè)合約DataContract 專門用來(lái)存數(shù)據(jù),ControlContract用來(lái)處理邏輯,并利用DataContract來(lái)讀寫(xiě)數(shù)據(jù)。通過(guò)這樣的設(shè)計(jì),可以在更新控制合約后保持?jǐn)?shù)據(jù)合約不變,這樣就不會(huì)丟失數(shù)據(jù),也不用遷移數(shù)據(jù)。

讀寫(xiě)控制

通過(guò)DataContract我們可以多帶帶更新合約邏輯,不過(guò)你也許發(fā)現(xiàn)了一個(gè)新的問(wèn)題,DataContract的數(shù)據(jù)不僅僅可以被ControlContract讀寫(xiě),還可以被其他的合約讀寫(xiě),因此需要對(duì)DataContract添加讀寫(xiě)控制。我們給DataContract添加一個(gè)mapping, 用來(lái)控制哪些地址可以訪問(wèn)數(shù)據(jù),同時(shí)添加了修飾器及設(shè)置訪問(wèn)的方法,代碼如下:

pragma solidity ^0.4.18;

contract DataContract {
    mapping (address => uint256) public balanceOf;
    mapping (address => bool) accessAllowed;
    
    function DataContract() public {
        accessAllowed[msg.sender] = true;
    }

    function setBlance(address _address,uint256 v) public {
        balanceOf[_address] = v;
    }
    
    modifier platform() {
        require(accessAllowed[msg.sender] == true);
        _;
    }
    
    function allowAccess(address _addr) platform public {
        accessAllowed[_addr] = true;
    }
    
    function denyAccess(address _addr) platform public {
        accessAllowed[_addr] = false;
    }
}

...

訂閱我的小專欄可參看合約的完整代碼。

部署方法如下:

先部署DataContract合約

使用DataContract合約地址作為部署ControlContract合約的參數(shù)

用ControlContract合約地址作為參數(shù)調(diào)用DataContract合約的allowAccess方法。

如果需要更新控制合約(如修復(fù)了addTen)則重新執(zhí)行第2-3步,同時(shí)對(duì)老的控制合約執(zhí)行denyAccess()。

更多

當(dāng)我們?cè)趯?shí)現(xiàn)數(shù)據(jù)合約時(shí),它包含的邏輯應(yīng)該越少越好,并且應(yīng)該是嚴(yán)格測(cè)試過(guò)的,因?yàn)橐坏?shù)據(jù)合約部署之后,就沒(méi)法更改。
大多數(shù)情況下,和用戶交互的是DApp, 因此當(dāng)控制合約升級(jí)之后,需要升級(jí)DApp,使之關(guān)聯(lián)新的控制合約。

盡管合約可以通過(guò)本文的方式升級(jí),但我們依然要謹(jǐn)慎升級(jí),因?yàn)樯?jí)表示你可以重寫(xiě)邏輯,會(huì)降低用戶對(duì)你的信任度。
本文介紹升級(jí)方法更多的是一種思路,實(shí)際項(xiàng)目中可能會(huì)對(duì)應(yīng)多個(gè)控制合約及數(shù)據(jù)合約。

? 深入淺出區(qū)塊鏈 - 系統(tǒng)學(xué)習(xí)區(qū)塊鏈,打造最好的區(qū)塊鏈技術(shù)博客。

? 我的知識(shí)星球為各位解答區(qū)塊鏈技術(shù)問(wèn)題,歡迎加入討論。

? 關(guān)注公眾號(hào)“深入淺出區(qū)塊鏈技術(shù)”第一時(shí)間獲取區(qū)塊鏈技術(shù)信息。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/24108.html

相關(guān)文章

  • 深度剖析智能合約升級(jí)——inherited storage

    摘要:接上篇合約升級(jí)模式介紹筆者改寫(xiě)了一個(gè)可用于實(shí)踐生產(chǎn)的升級(jí)框架,需要自取。在介紹合約升級(jí)模式中提到了一個(gè)可以解決這個(gè)問(wèn)題的方法。深度理解注意為中的低階方法下文中出現(xiàn)的方法,是我在智能合約中寫(xiě)的一個(gè)方法名稱,不要混淆。 接上篇:合約升級(jí)模式介紹筆者改寫(xiě)了一個(gè)可用于實(shí)踐生產(chǎn)的升級(jí)框架,需要自取。https://github.com/hammewang/... 同時(shí)歡迎討論,微信xiuxiu1...

    aervon 評(píng)論0 收藏0
  • 智能合約升級(jí)模式介紹 — 入門篇

    摘要:以后的邏輯合約可以升級(jí)現(xiàn)有的方法或者創(chuàng)造新的方法,但是不能引入新的狀態(tài)變量。使用非結(jié)構(gòu)化存儲(chǔ)升級(jí)非結(jié)構(gòu)化存儲(chǔ)模式和繼承存儲(chǔ)類似,但是不要求邏輯合約繼承任何和升級(jí)相關(guān)的狀態(tài)變量。 以太坊最大的優(yōu)勢(shì)就是,每一筆用來(lái)轉(zhuǎn)賬、部署合約或者和合約交互的交易(事務(wù))都被存在一個(gè)叫做區(qū)塊鏈的公共賬本上。一旦交易發(fā)生,就再也無(wú)法隱藏或者改變。這帶來(lái)一個(gè)巨大的好處,就是在以太坊中的每一個(gè)節(jié)點(diǎn)都可以去驗(yàn)證任...

    YFan 評(píng)論0 收藏0
  • 區(qū)塊鏈技術(shù)學(xué)習(xí)指引

    摘要:引言給迷失在如何學(xué)習(xí)區(qū)塊鏈技術(shù)的同學(xué)一個(gè)指引,區(qū)塊鏈技術(shù)是隨比特幣誕生,因此要搞明白區(qū)塊鏈技術(shù),應(yīng)該先了解下比特幣。但區(qū)塊鏈技術(shù)不單應(yīng)用于比特幣,還有非常多的現(xiàn)實(shí)應(yīng)用場(chǎng)景,想做區(qū)塊鏈應(yīng)用開(kāi)發(fā),可進(jìn)一步閱讀以太坊系列。 本文始發(fā)于深入淺出區(qū)塊鏈社區(qū), 原文:區(qū)塊鏈技術(shù)學(xué)習(xí)指引 原文已更新,請(qǐng)讀者前往原文閱讀 本章的文章越來(lái)越多,本文是一個(gè)索引帖,方便找到自己感興趣的文章,你也可以使用左側(cè)...

    Cristic 評(píng)論0 收藏0
  • 智能合約開(kāi)發(fā)環(huán)境搭建及Hello World合約

    摘要:今天我們來(lái)一步一步從搭建以太坊智能合約開(kāi)發(fā)環(huán)境開(kāi)始,講解智能合約的如何編寫(xiě)。開(kāi)發(fā)環(huán)境搭建安裝強(qiáng)烈建議新手使用來(lái)進(jìn)行開(kāi)發(fā)。第行修改部署賬戶為新賬戶索引,即使用新賬戶來(lái)部署合約。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約開(kāi)發(fā)環(huán)境搭建及Hello World合約原文已更新,請(qǐng)讀者前往原文閱讀 如果你對(duì)于以太坊智能合約開(kāi)發(fā)還沒(méi)有概念(本文會(huì)假設(shè)你已經(jīng)知道這些概念),建議先閱讀入門篇。就先...

    Winer 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<