以太坊知识教程------智能合约的5种设计模式
1、自毀合約
合約自毀模式用于終止一個(gè)合約,這意味著將從區(qū)塊鏈上永久刪除這個(gè)合約。 一旦被銷(xiāo)毀,就不可能調(diào)用合約的功能,也不會(huì)在賬本中記錄交易。
eg. 貸款合約,它應(yīng)當(dāng)在貸款還清后自動(dòng)銷(xiāo)毀;另一個(gè)案例是基于時(shí)間的拍賣(mài)合約,它應(yīng)當(dāng)在拍賣(mài)結(jié)束后 終止 —— 假設(shè)我們不需要在鏈上保存拍賣(mài)的歷史記錄。
在處理一個(gè)被銷(xiāo)毀的合約時(shí),有一些需要注意的問(wèn)題:
- 合約銷(xiāo)毀后,發(fā)送給該合約的交易將失敗。
- 任何發(fā)送給被銷(xiāo)毀合約的資金,都將永遠(yuǎn)丟失。
- 為避免資金損失,應(yīng)當(dāng)在發(fā)送資金前確保目標(biāo)合約仍然存在,移除所有對(duì)已銷(xiāo)毀合約的引用。
2、工廠合約
工廠合約用于創(chuàng)建和部署“子”合約。
工廠用于存儲(chǔ)子合約的地址,以便在必要時(shí)提取使用。
- 為什么不把它們存在Web應(yīng)用數(shù)據(jù)庫(kù)里?
- 將地址數(shù)據(jù)存在工廠合約里、存在區(qū)塊鏈上,更加安全不會(huì)丟失。
- 需要跟蹤所有新 創(chuàng)建的子合約以便同步更新數(shù)據(jù)庫(kù)。
eg. 銷(xiāo)售資產(chǎn)并跟蹤這些資產(chǎn)(例如,誰(shuí)是資產(chǎn)的所有者)。 需要向負(fù)責(zé)部署資產(chǎn)的 函數(shù)添加payable修飾符以便銷(xiāo)售資產(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、名稱(chēng)注冊(cè)表
- 其實(shí)就是一個(gè)字符串map一個(gè)struct對(duì)象。
- 使用場(chǎng)景: 假設(shè)一個(gè)合約依賴(lài)很多個(gè)合約,如果將所有這些合約的地址寫(xiě)在你的應(yīng)用代碼中,如果這些合約的地址隨著時(shí)間的推移而變化,那該怎么辦?
4、映射表迭代器
由于mapping迭代效率低,所以需要一個(gè)mapping迭代模式,答案就是通過(guò)一個(gè)數(shù)組來(lái)保存key。
注意:put()函數(shù)的一個(gè)常見(jiàn)錯(cuò)誤“通過(guò)遍歷來(lái)檢查指定的鍵是否存在”。
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. 提款模式
簡(jiǎn)單來(lái)說(shuō),就是不用transfer,而是用send,因?yàn)橐坏ヽallback錯(cuò)誤,transfer會(huì)導(dǎo)致異常,而send不會(huì)。
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种设计模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 以太坊知识教程------账户
- 下一篇: 《研磨设计模式》chap10 中介者模式