亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

Euphoria / 1507人閱讀

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

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

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

寫在前面

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

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

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

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

假如我們在部署之后發(fā)現(xiàn)了這個(gè)問題,想要修復(fù)這個(gè)bug的話,只好重新部署合約,可是這時(shí)會有一個(gè)尷尬的問題,原來的合約已經(jīng)有很多人使用,如果部署新的合約,老合約的數(shù)據(jù)將會丟失。

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

那么如何解決上面的問題了,一個(gè)解決方案是分離合約中的數(shù)據(jù),使用一個(gè)多帶帶的合約來存儲數(shù)據(jù)(下文稱數(shù)據(jù)合約),使用一個(gè)多帶帶的合約寫業(yè)務(wù)邏輯(下文稱控制合約)。
我們來看看代碼如何實(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 專門用來存數(shù)據(jù),ControlContract用來處理邏輯,并利用DataContract來讀寫數(shù)據(jù)。通過這樣的設(shè)計(jì),可以在更新控制合約后保持?jǐn)?shù)據(jù)合約不變,這樣就不會丟失數(shù)據(jù),也不用遷移數(shù)據(jù)。

讀寫控制

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

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í)對老的控制合約執(zhí)行denyAccess()。

更多

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

盡管合約可以通過本文的方式升級,但我們依然要謹(jǐn)慎升級,因?yàn)樯壉硎灸憧梢灾貙戇壿?,會降低用戶對你的信任度?br>本文介紹升級方法更多的是一種思路,實(shí)際項(xiàng)目中可能會對應(yīng)多個(gè)控制合約及數(shù)據(jù)合約。

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

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

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

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

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/24108.html

相關(guān)文章

  • 深度剖析智能合約升級——inherited storage

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

    aervon 評論0 收藏0
  • 智能合約升級模式介紹 — 入門篇

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

    YFan 評論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)用場景,想做區(qū)塊鏈應(yīng)用開發(fā),可進(jìn)一步閱讀以太坊系列。 本文始發(fā)于深入淺出區(qū)塊鏈社區(qū), 原文:區(qū)塊鏈技術(shù)學(xué)習(xí)指引 原文已更新,請讀者前往原文閱讀 本章的文章越來越多,本文是一個(gè)索引帖,方便找到自己感興趣的文章,你也可以使用左側(cè)...

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

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

    Winer 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<