以太坊知识教程------智能合约的5种设计模式
生活随笔
收集整理的這篇文章主要介紹了
以太坊知识教程------智能合约的5种设计模式
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1、自毀合約
合約自毀模式用于終止一個合約,這意味著將從區(qū)塊鏈上永久刪除這個合約。 一旦被銷毀,就不可能調(diào)用合約的功能,也不會在賬本中記錄交易。
eg. 貸款合約,它應(yīng)當(dāng)在貸款還清后自動銷毀;另一個案例是基于時間的拍賣合約,它應(yīng)當(dāng)在拍賣結(jié)束后 終止 —— 假設(shè)我們不需要在鏈上保存拍賣的歷史記錄。
在處理一個被銷毀的合約時,有一些需要注意的問題:
- 合約銷毀后,發(fā)送給該合約的交易將失敗。
- 任何發(fā)送給被銷毀合約的資金,都將永遠(yuǎn)丟失。
- 為避免資金損失,應(yīng)當(dāng)在發(fā)送資金前確保目標(biāo)合約仍然存在,移除所有對已銷毀合約的引用。
2、工廠合約
工廠合約用于創(chuàng)建和部署“子”合約。
工廠用于存儲子合約的地址,以便在必要時提取使用。
- 為什么不把它們存在Web應(yīng)用數(shù)據(jù)庫里?
- 將地址數(shù)據(jù)存在工廠合約里、存在區(qū)塊鏈上,更加安全不會丟失。
- 需要跟蹤所有新 創(chuàng)建的子合約以便同步更新數(shù)據(jù)庫。
eg. 銷售資產(chǎn)并跟蹤這些資產(chǎn)(例如,誰是資產(chǎn)的所有者)。 需要向負(fù)責(zé)部署資產(chǎn)的 函數(shù)添加payable修飾符以便銷售資產(chǎn)。
contract CarShop {address[] carAssets;function createChildContract(string brand, string model) public payable {// insert check if the sent ether is enough to cover the car asset ...address newCarAsset = new CarAsset(brand, model, msg.sender); carAssets.push(newCarAsset); }function getDeployedChildContracts() public view returns (address[]) {return carAssets;} }contract CarAsset {string public brand;string public model;address public owner;function CarAsset(string _brand, string _model, address _owner) public {brand = _brand;model = _model;owner = _owner;} }3、名稱注冊表
- 其實就是一個字符串map一個struct對象。
- 使用場景: 假設(shè)一個合約依賴很多個合約,如果將所有這些合約的地址寫在你的應(yīng)用代碼中,如果這些合約的地址隨著時間的推移而變化,那該怎么辦?
4、映射表迭代器
由于mapping迭代效率低,所以需要一個mapping迭代模式,答案就是通過一個數(shù)組來保存key。
注意:put()函數(shù)的一個常見錯誤“通過遍歷來檢查指定的鍵是否存在”。
contract MappingIterator {mapping(string => address) elements;string[] keys;function put(string key, address addr) returns (bool) {bool exists = elements[key] == address(0)if (!exists) {keys.push(key);}elements[key] = addr;return true;}function getKeyCount() constant returns (uint) {return keys.length;}function getElementAtIndex(uint index) returns (address) {return elements[keys[index]];}function getElement(string name) returns (address) {return elements[name];} }5. 提款模式
簡單來說,就是不用transfer,而是用send,因為一旦callback錯誤,transfer會導(dǎo)致異常,而send不會。
contract WithdrawalContract {mapping(address => uint) buyers;function buy() payable {require(msg.value > 0);buyers[msg.sender] = msg.value;}function withdraw() {uint amount = buyers[msg.sender];require(amount > 0);buyers[msg.sender] = 0; require(msg.sender.send(amount));} }總結(jié)
以上是生活随笔為你收集整理的以太坊知识教程------智能合约的5种设计模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 以太坊知识教程------账户
- 下一篇: 知识图谱 (1)基本概念