當(dāng)前位置:首頁 > 物聯(lián)網(wǎng) > 區(qū)塊鏈
[導(dǎo)讀] 介 紹 在寫智能合約時(shí),我傾向于采取引導(dǎo)方式。即使它們旨在用于生產(chǎn)環(huán)境,我也使它們盡可能易于理解。我寫的智能合約是可重用的,但是通常會(huì)針對(duì)每個(gè)特定的業(yè)務(wù)案例重新編寫智能合約。 在

介 紹

在寫智能合約時(shí),我傾向于采取引導(dǎo)方式。即使它們旨在用于生產(chǎn)環(huán)境,我也使它們盡可能易于理解。我寫的智能合約是可重用的,但是通常會(huì)針對(duì)每個(gè)特定的業(yè)務(wù)案例重新編寫智能合約。

在本文中,我將討論solidity智能合約中的三種許可方法。討論這些方法的復(fù)雜性從高到低,這是您在項(xiàng)目中應(yīng)考慮的順序。 我提供了可用于每種方法的代碼。

本文假定您可以輕松地編寫智能合約,并使用繼承和傳遞合約地址等功能作為參數(shù)。

簡(jiǎn)單方法— Ownable.sol

OpenZeppelin的Ownable.sol合同必須是最重用的合同之一。它在77行中實(shí)現(xiàn):

1. 斷言某人是智能合約所有者的邏輯。

2. 限制函數(shù)調(diào)用以繼承智能合約的所有者的邏輯。

3. 將所有權(quán)轉(zhuǎn)移到其他地址的邏輯。

在編寫智能合約時(shí),您會(huì)經(jīng)常從Ownable繼承。讓我們來看一個(gè)如何使用Ownable的示例。想象一下,您想在智能合約中保留一個(gè)地址列表,但是您想成為唯一可以添加更多地址的列表??梢詫⑵湟暈槟湃蔚娜说淖?cè)表。您可以執(zhí)行以下操作:

contract Whitelist is Ownable {

mapping (address =》 bool) members;

constructor() public Ownable() {

}

function addMember(address _member)

public

onlyOwner

{

members[_member] = true;

}

}

從Ownable繼承并在您的Ownable上調(diào)用其構(gòu)造函數(shù)可確保將部署智能合約的地址注冊(cè)為所有者。如果未通過注冊(cè)為所有者的地址調(diào)用,則onlyOwner修飾符會(huì)使函數(shù)恢復(fù)。

部署此智能合約后,只有您或您指定的人可以將新成員添加到其中的列表中。

盡管有用,但很多時(shí)候Ownable還不夠。 在給定時(shí)間只有一個(gè)地址可以成為所有者,只有所有者可以決定誰可以成為新所有者,您只能檢查您是否是所有者,而不是其他人。

中級(jí)復(fù)雜方法— Whitelist.sol

Whitelist.sol保留一個(gè)地址列表,然后可用于限制功能或任何其他目的。它在功能上與OpenZeppelin的Roles.sol非常相似,盡管有一些重要差異。

Whitelist.sol僅具有三個(gè)功能:

funcTIon isMember(address _member) public view returns(bool);

funcTIon addMember(address _member) public onlyOwner;

funcTIon removeMember(address _member) public onlyOwner;

例如通過該智能合約,您可以保留一份已批準(zhǔn)的利益相關(guān)者列表,這些利益相關(guān)者可能是令牌轉(zhuǎn)移的唯一接收者。 您可以執(zhí)行以下操作:

pragma solidity ^0.5.0;

import “@openzeppelin/contracts/token/ERC20/ERC20.sol”;

import “。./access/Whitelist.sol”;

contract ERC20Whitelisted is ERC20 {

Whitelist whitelist;

constructor(address _whitelistAddress) public {

whitelist = Whitelist(_whitelistAddress);

}

funcTIon transfer(address account, uint256 amount) public {

require(whitelist.isMember(account), “Account not whitelisted.”);

super._transfer(account, amount);

}

}

在上面的示例中,您還可以使ERC20Whitelisted繼承自ERC20和Whitelist。 我很樂意討論一些折衷方案。

簡(jiǎn)單的白名單功能可能非常強(qiáng)大。OpenZeppelin使用它們實(shí)現(xiàn)了許多ERC20和ERC721變體,并設(shè)法提供了超出我們大多數(shù)人所需的更多功能。在TechHQ,我們也僅使用白名單實(shí)施了CementDAO。

但是有時(shí)候,白名單也會(huì)落空。您可能需要有多個(gè)所有者才能擁有白名單?;蛘吣赡苄枰芾碓S多重疊的白名單。對(duì)于這些情況,我們具有分層的角色合約。

高級(jí)復(fù)雜方法-RBAC.sol

我們開發(fā)了RBAC.sol,旨在提供與現(xiàn)代共享系統(tǒng)一樣的多用戶功能。

1. 有些角色不過是地址組。

2. 組成員資格只能由某些管理員角色的成員修改。

3. 可以在運(yùn)行時(shí)創(chuàng)建新角色。

4. 可以驗(yàn)證角色成員身份。

在低層,我們使用用戶選擇的bytes32參數(shù)來標(biāo)識(shí)角色。 通常,這些是可識(shí)別的短字符串,但是您也可以使用加密的值或地址。

角色本身是一組成員地址和admin角色的標(biāo)識(shí)符。 有趣的是,我們不需要將角色的標(biāo)識(shí)符存儲(chǔ)在其自己的結(jié)構(gòu)中。

struct Role {

bytes32 adminRoleId;

mapping (address =》 bool) members;

}

現(xiàn)在有兩種方法可以添加新角色并驗(yàn)證角色是否存在:

function roleExists(bytes32 _roleId) public view returns(bool);

function addRole(bytes32 _roleId, bytes32 _adminRoleId) public;

并且管理成員的功能是相同的,只是現(xiàn)在必須指定相關(guān)角色:

function isMember(address _member, bytes32 _roleId) public view returns(bool);

function addMember(address _member, bytes32 _roleId) public;

function removeMember(address _member, bytes32 _roleId) public;

僅當(dāng)調(diào)用者屬于我們要添加成員的角色的管理員角色時(shí),addMember和removeMember才會(huì)成功。

僅當(dāng)調(diào)用者屬于將管理所創(chuàng)建角色的角色時(shí),addRole才會(huì)成功。

這些簡(jiǎn)單的規(guī)則將允許創(chuàng)建角色的層次結(jié)構(gòu),然后可將其用于實(shí)現(xiàn)具有不同權(quán)限級(jí)別或區(qū)域的復(fù)雜多用戶平臺(tái)。

進(jìn)階學(xué)習(xí)

為了進(jìn)一步深入兔子洞,我建議從OpenZeppelin的這個(gè)問題開始。他們的代碼庫與我們的代碼庫沒有什么不同,即使在我們選擇采用其他方法的情況下,您也會(huì)發(fā)現(xiàn)大多數(shù)設(shè)計(jì)決策的透徹推理。他們?cè)谥T如ERC20Mintable之類的合約中使用Roles是一個(gè)很好的例子,可以替代Whitelist。

勇敢者的另一個(gè)資源是AragonOS ACL合約。界面一眼就可以看出他們決定走得更遠(yuǎn):

function hasPermission(address who, address where, bytes32 what,

bytes how) public view returns (bool);

對(duì)于我們自己的@ hq20 / contracts包中的示例,我們使用本文中描述的三個(gè)級(jí)別的訪問控制,因此,您也應(yīng)該注意這一點(diǎn)。

結(jié) 論

對(duì)于智能合約的實(shí)現(xiàn),最好僅實(shí)現(xiàn)所需的復(fù)雜性,而無需再實(shí)現(xiàn)任何復(fù)雜性。 在許可方面,存在三種不同的復(fù)雜性級(jí)別:

· 單用戶

· 用戶群

· 用戶組的層次結(jié)構(gòu)

您可以將Ownable.sol用于單個(gè)用戶允許的系統(tǒng)。 您可以將@ openzeppelin/Roles.sol或@ hq20/Whitelist.sol用于需要組中權(quán)限用戶的系統(tǒng)。對(duì)于需要組層次結(jié)構(gòu)的系統(tǒng),我們過去已成功使用@ hq20/RBAC.sol。

您將有自己的要求,并且需要權(quán)衡取舍。了解每個(gè)實(shí)現(xiàn)背后的設(shè)計(jì)決策將使您可以使用現(xiàn)有合約,也可以修改合約以供自己使用。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉