做軟體開發的都知道,沒有完美的**,在當前設計的時候由於考慮不完備或者後續需要增加一些新功能,需要對軟體進行迭代公升級。在以太坊的智慧型合約中也存在這種情況,由於功能的完善可能會"公升級"智慧型合約。大家都知道,部署到鏈上的合約**是不可修改的,怎麼實現合約**的"公升級"呢?
比如小強就讀某小學二年級,納入教學評估的有數學和語文兩門學科,現在要在教學主鏈上部署乙個統計小強每次教學考試語文。數學以及兩科總成績的合約,要求成績統計資料和成績統計邏輯要分離。則其合約架構就類似上圖結構,業務合約就是各科成績統計,資料合約1儲存語文成績統計資料,資料合約2儲存數學成績統計資料,資料合約3為總成績統計資料。下面就來實現相關合約**。
資料合約:
pragma solidity ^0.4.17;
//數學成績儲存 合約**
contract mathgradedata
function setdrage(address _address,uint16 _vaule) public onlymanagercancall
function getdrage(address _address,uint256 _off) public returns (uint16)
function setmanager(address _address) public onlydeloycancall
function getmanager() public view returns (address)
modifier onlymanagercancall()
modifier onlydeloycancall()
}//語文成績儲存 合約**
contract chinesegradedata
//綜合成績儲存 合約**
contract totalgradedata
上述原始碼主要介紹資料合約原始碼,接下來介紹一下業務合約原始碼,即資料統計合約:
pragma solidity ^0.4.17;
contract businesscontract
function setdatacontractaddress(address _math,address _chinses,address _total) public onlydeloycancall
function writegrade(address _student,uint16 _math,uint16 _chinese) public onlymanagercancall
function readgrade(address _student,uint _off) public returns (uint16 _math,uint16 _chinses,uint16 _total)
function setmanager(address _address) public onlydeloycancall
function getmanager() public view returns (address)
modifier onlydeloycancall()
modifier onlymanagercancall()
}
上述是業務合約的**邏輯,接下來介紹一下**合約的**:
pragma solidity ^0.4.17;
//**合約
contract agent
function setbusinesscontractaddress(address _business) public onlydeloycancall
function read(address _student,uint _off) public onlydeloycancall returns (uint16 _math,uint16 _chinses,uint16 _total)
function write(address _student,uint16 _math,uint16 _chinses) public onlydeloycancall
modifier onlydeloycancall()
}
在上述資料合約,業務合約,**合約之間的呼叫通過manager來授權,只有通過授權的位址才能呼叫合約進行寫資料操作,防止其他無關賬戶隨意呼叫。而manager是可以變動的,只有部署該合約的位址才能修改。針對上述3種合約,其對應關係如下圖:
應重點關注部署位址和管理位址的前後關係,就明白**中deploy和manager兩個位址的作用。
後續學校不想以分數為具體的批判標準,以優秀,良好,及格,不及格來表示學生的成績,分別以數字0,1,2,3來表示,具體定義如下:
>= 90 :優秀
> 90 >= 80:良好
> 80 >= 60:及格
> 60:不及格
針對上述邏輯的改動,我們只需要改動邏輯合約**即可,改動如下:
pragma solidity ^0.4.17;
contract businesscontract
function setdatacontractaddress(address _math,address _chinses,address _total) public onlydeloycancall
function writegrade(address _student,uint16 _math,uint16 _chinese) public onlymanagercancall else if((_math < 90)&&(_math >= 80))else if((_math < 80)&&(_math >= 60))else
math.setdata(_student,writedata ); //寫入資料
if(_chinese>= 90)else if((_chinese< 90)&&(_chinese>= 80))else if((_chinese< 80)&&(_chinese>= 60))else
chinese.setdata(_student,writedata );
uint16 tmp = (_math+_chinese)/2;
if(tmp >= 90)else if((tmp < 90)&&(tmp >= 80))else if((tmp < 80)&&(tmp >= 60))else
total.setdata(_student,writedata );
}function readgrade(address _student,uint _off) public returns (uint16 _math,uint16 _chinses,uint16 _total)
function setmanager(address _address) public onlydeloycancall
function getmanager() public view returns (address)
modifier onlydeloycancall()
modifier onlymanagercancall()
}
將編譯好的合約重新部署,**合約和資料合約無需改動即可實現相關功能,注意需要調集成約的manager。
以上就是合約公升級的相關邏輯。在上述的舉例中不太合理,只是想通過乙個例子來說明合約公升級的原理和過程,大家不必深究!
智慧型合約的理念
何謂 抵押品 抵押品 的目的是什麼?它怎樣梳理了我們的已有的關係?我認為,尤其是合約的規範化,為我們的關係實現了理想化抵押品的藍圖。多種型別的合同條款,如抵押品,債券,產權界定等等,都可以嵌入在我們執行條款的硬體和軟體中,通過這樣的方式使那些不遵守協議者的違約成本很高,如果需要的話,令人望而卻步的 ...
智慧型合約的安全
智慧型合約的安全問題一直是編寫智慧型合約的關鍵點。多數的智慧型合約都是開源的,原始碼公布更容易被黑客找到攻擊的漏洞。這裡將一些常見的,易犯的錯誤。首先我們先看看下面這段 contract text function transferto address add,uint num public pay...
如何編寫乙個可公升級的智慧型合約
區塊鏈信任基礎的資料不可修改的特性,讓它傳統應用程式有乙個很大的不同的地方是一經發布於區塊鏈上就無法修改 不能直接在原有的合約上直接修改再重新發布 寫在前面 閱讀本文前,你應該對以太坊 智慧型合約及solidity語言有所了解,如果你還不了解,建議你先看以太坊是什麼 當智慧型合約出現bug 一方面正...