Llama 是一个专为智能合约设计的链上治理和访问控制框架。它允许团队部署完全独立的实例,定义执行交易的细粒度角色和权限,这些角色和权限被称为“操作”。Llama 的灵活性在于它可以随着环境的变化而逐步添加新的参与者和扩展可用的操作集,从而适应不断发展的需求。
Llama 的工作原理
Llama 实例由一个模块化的智能合约系统构成,这个系统包括一个不可变的核心和可互换的外围部分。具体来说,LlamaCore 和 LlamaPolicy 与策略和保护合约协同工作,以建立和执行从创建到执行操作的规则。当一个操作成功执行时,会使用 LlamaExecutor 调用事先商定的交易调用数据来触发目标合约。由于执行器是实例唯一的对外接口,因此外部函数的所有权只需设置一次。
此外,Llama 实例可以部署任意数量的策略、账户、脚本和保护机制。策略定义了时间段长度和法定人数阈值,用于决定操作如何在不同的状态之间转换。账户是能够接收、转移和批准代币的链上钱包。脚本是从执行器委托调用的合约,这对于创建可以批量处理多个操作的自定义实例治理功能非常有用。保护机制则用于在操作创建、执行前和执行后增加额外的安全检查。
为什么选择 Llama?
在开发 Llama 之前,开发团队已经为许多领先协议和社区作出了贡献。Llama 的诞生是对现有链上治理解决方案局限性的回应,旨在构建一个理想的框架。传统的治理系统虽然帮助制定了许多基础标准,但往往伴随着高昂的运营成本或倾向于集中化。Llama 的设计初衷是为了让协议能够从简单的治理结构开始,然后逐渐分散决策权。
Llama 通过细粒度的访问控制实现了去中心化,确保每个治理参与者只获得完成其职责所需的最小权限。这种精确的权限分配旨在帮助实例管理运营复杂性,同时保持强大的用户保障。Llama 利用了链上执行的透明性,以及时间锁和否决权等安全保障措施,为协议提供了一个灵活的治理工具箱。例如,表达式丰富的功能特定保护、可定制的策略以及程序化控制资金的能力,这些功能使得任何需要特权访问的链上组织都能利用 Llama 来增强其运营的安全性和效率。
关键概念
为了更好地理解 Llama 框架,下面列出了一些关键的概念,这些概念是理解和使用 Llama 进行智能合约的链上治理和访问控制的基础。
实例
定义:一个独立的链上治理和访问控制系统。每个 Llama 实例都是独一无二的,可以针对特定的协议或任何其他智能合约系统进行定制化部署和管理。
用途:用于管理协议或任何基于智能合约系统的治理和访问控制。
策略
定义:策略是以不可转让的 NFT 形式存在的,用于定义实例中参与者(即保单持有人)的角色和权限。
作用:确保只有被授权的实体才能执行特定的操作,增强了系统的安全性。
角色
定义:角色是一组权限的集合,可以被分配给一个或多个保单持有人。
特征:一个角色可以关联零个或多个权限 ID,这意味着持有该角色的保单持有人可以执行与这些权限 ID 相关的操作。
权限 ID
定义:权限 ID 是一个哈希值,包含了目标合约、函数选择器以及策略合约的信息。
重要性:它是创建操作的凭证。保单持有人必须拥有带有相应权限 ID 的角色,才能发起特定的操作。
行动
定义:行动是由保单持有人发起的一种提议,代表了一笔可执行的交易。
流程:从提议到执行,每一个行动都遵循由策略设定的规则。
策略
定义:策略是指定行动从提议到执行全过程规则的合约。
功能:确保所有操作都在既定的框架内进行,维持系统的稳定性和可靠性。
执行器
定义:Llama 实例中的单一出口点,负责最终执行所有的操作。
特点:执行器地址是任何已执行操作的 msg.sender 地址,保证了所有交易的来源都是可追踪的。
账户
定义:账户是由 Llama 实例直接部署的合约,用于管理和操作链上的资产。
用途:可以接收、转移和批准代币,为智能合约系统提供了必要的财务功能。
通过这些关键概念,我们可以看到 Llama 提供了一个高度模块化和灵活的框架,不仅支持细粒度的权限管理,还确保了所有治理活动的透明度和安全性。这使得 Llama 成为了智能合约领域中治理和访问控制的一个强有力的选择。
框架
操作
在 Llama 框架中,操作是指由保单持有人发起的一系列可执行的交易。这些交易可以涵盖多种类型的操作,如转移资金、更新注册表、修改协议参数或是激活紧急暂停等。操作是 Llama 实例与外部合约交互的主要方式,它们的设计旨在确保治理活动的透明度和安全性。
操作的组成参数
目标合约:Llama 执行者需要调用的外部合约地址。
策略:规定了行动必须遵循的规则集的合约。
Calldata:函数选择器及其参数的组合,用于指定要调用的函数和传递给该函数的数据。
角色:用于创建操作的角色,该角色决定了谁可以创建操作。
值:通过调用发送的以太币数量(单位为 wei)。
描述:使用 Markdown 编写的文本,解释操作的目的和背景。
关键概念深入
Llama 实例:包括三个主要组成部分:LlamaCore、LlamaPolicy 和 LlamaExecutor。每个实例都是唯一的,部署在一个特定的地址上。
LlamaCore:管理从创建到执行的操作流程,确保每个操作都按照预设的策略进行。
LlamaPolicy:一个 ERC721 合约,其中每个代币都是不可转让的,代表了不同的角色和权限。这些角色和权限定义了哪些保单持有人可以创建、批准或拒绝操作。
LlamaExecutor:Llama 实例的单一出口点,所有执行的操作都会从这里发出。它是 Llama 实例控制下的系统中应担任其他特权角色的地址。
动作状态
操作在其生命周期中会经历不同的状态,这些状态由 ActionState 枚举定义,包括但不限于:
Active:操作创建后的初始状态,在此状态下,保单持有人可以开始对操作进行投票。
Canceled:操作可以被创建者在任何时间取消。
Failed:如果操作未能在规定的审批期限内获得足够的支持,或在排队期间未被批准,则进入此状态。
Approved:操作已得到足够多的赞成票,准备进入排队阶段。
Queued:操作处于等待执行的状态,保单持有人可以在此期间反对操作。
Expired:如果操作在排队期结束后仍未被执行,则进入此状态。
Executed:操作已经成功执行。
许可操作创建
权限 ID:作为操作创建访问控制的基本单元,权限 ID 通过 LlamaPolicy 合约管理。每个权限 ID 都是基于目标合约、函数选择器和策略合约的哈希值计算得出的。
创建权限 ID:通过 keccak256 哈希函数计算 PermissionData 结构的 ABI 编码来生成。
授权与撤销:使用 setRolePermission 函数可以授予或撤销某个角色使用特定权限 ID 创建操作的能力。
赞成与反对
投票机制:投票能力由策略合约中的角色控制,每个策略只能有一个赞成角色和一个反对角色。只有拥有相应角色的保单持有人才能对操作进行投票。
强制批准/反对角色:除了标准的批准/反对角色外,策略还可以包含多个强制角色。这些角色的投票可以直接决定操作的结果。
脚本与守卫
脚本:通过 DELEGATECALL 而不是普通的 CALL 调用目标合约。脚本主要用于批量处理多个调用,提高操作效率。
守卫:作为可选的钩子,可以在操作的关键阶段(如创建前、执行前和执行后)运行。守卫用于增强 Llama 权限系统,例如实施每笔交易的支出限制或验证 DeFi 交易的最终状态。
这些机制共同构成了 Llama 框架的核心,确保了在去中心化环境中的高效、安全和透明的治理实践。
政策管理
在 Llama 框架中,策略(Policies)是针对单个 Llama 实例的不可转让的 NFT,其中包含了角色和权限 ID。这些策略使得用户能够在 Llama 实例中创建操作并对操作进行投票。下面将详细介绍策略管理的关键概念、流程和机制。
关键概念
策略:不可转让的 NFT,针对单个 Llama 实例,包含角色和权限 ID。
代币 ID:Llama 策略 NFT 的 tokenId 总是等于 uint256(uint160(policyholderAddress))。
角色:赋予一个或多个保单持有人的标志,用于授权操作的创建、批准和拒绝。
权限 ID:唯一标识符,可分配给角色以创建具有特定权限的操作。除非保单持有人拥有具有正确权限 ID 的角色,否则无法创建操作。
检查点:Llama 存储的历史角色余额,用于在行动批准和不批准过程中查询历史角色数量。
管理政策
铸造和销毁保单:用户可以通过治理过程来增加或减少保单供应。由于保单不可转让,用户只能持有在部署期间或通过治理明确授予的保单。保单持有人不能销毁自己的保单,保单只能通过治理过程撤销。
授予政策:Llama 保单可以同时授予外部拥有的账户(EOA)和智能合约,提供了极大的灵活性。通过调用 LlamaPolicy 合约上的 setRoleHolder 方法,现有保单持有人可以创建一个操作来授予新保单。
撤销政策:通过调用 LlamaPolicy 合约上的 revokePolicy 方法,可以撤销保单。这将销毁保单 NFT 并撤销前保单持有人的所有角色。
管理角色
角色类型:角色类型为 uint8,意味着每个 Llama 实例最多可以有 255 个角色。每个实例都预留了 0 角色 ALL_HOLDERS_ROLE,该角色在铸币时分配给每个保单持有人,并且在保单撤销之前不能撤销。
角色供应:每个角色有两个供应量,存储在 SupplyCheckpoints.History 检查点中:
持有者数量:持有给定角色的唯一策略 NFT 的数量。
总数量:每个持有该策略的角色所拥有的所有数量的总和。
创建新角色
初始化角色:通过调用 LlamaPolicy 合约上的 initializeRole 方法来创建新角色。该方法接受一个 description 参数,该参数是一个 bytes32 值,用于提供角色的语义含义。
编辑现有角色:使用 updateRoleDescription 方法可以更新角色的描述,但不会改变角色的实际权力。
授予和撤销角色
授予角色:通过调用 setRoleHolder 方法,可以向保单持有人授予角色。此方法需要传入角色、保单持有人地址、数量和到期时间。
撤销角色:同样通过 setRoleHolder 方法,可以撤销保单持有人的角色。只需将数量和到期时间设置为 0。
更新角色数量/到期日期:使用 setRoleHolder 方法可以更新角色的数量或到期时间。
角色到期
撤销过期角色:如果角色已过期,任何人都可以使用 revokeExpiredRole 函数撤销该角色。这不需要经过正常的操作创建过程。
管理权限 ID
权限 ID:通过对 PermissionData 结构进行哈希计算得出,该结构由 target、selector 和 strategy 组成。LlamaLens 合约提供了一个外部视图方法 computePermissionId,允许用户计算权限 ID。
授予权限 ID:通过调用 LlamaPolicy 合约上的 setRolePermission 方法,可以授予权限 ID。此方法接受角色、权限 ID 和一个布尔值 hasPermission。
撤销权限 ID:同样通过 setRolePermission 方法,可以撤销权限 ID,此时 hasPermission 设置为 false。
使用治理脚本批量策略管理方法
GovernanceScript:这是一个接口,允许用户批量处理常见的策略管理调用,提供更好的用户体验。GovernanceScript 忯须与基本策略管理功能分开授权。
聚合方法:GovernanceScript 合约中存在基本策略管理函数的镜像批处理方法,甚至一些常见组合也存在。对于无法预测的组合,aggregate 方法允许用户对任意目标和合约提出调用。
这些机制共同确保了 Llama 实例中的策略管理既灵活又安全,满足不同场景下的治理需求。
策略
在 Llama 中,策略是用于确定行动状态的契约。这些策略分为两大类:相对策略(Relative Policies)和绝对策略(Absolute Policies)。每种策略类型都有其独特的参数和配置方式,以适应不同的治理需求。以下是关于策略的详细说明,包括它们的共用参数和各自的特性。
视图函数和动作状态
视图函数:策略主要由视图函数构成,这些函数用于读取数据而不改变状态。
动作状态查询:为了准确获取操作的状态,不应直接查询策略,因为单独的策略函数返回的状态可能已经过时。应该使用 LlamaCore 上的 getActionState 方法来获取最新的操作状态。
策略参数
approvalPeriod (批准期限):保单持有人可以批准某项操作的时间长度。创建操作时,此时间将从当前区块时间 (block.timestamp) 开始计算,直到保单持有人可以批准的最后时间戳。
queuingPeriod (排队期):排队期是批准期的倒计时,也可视为拒绝期。它定义了保单持有人可以拒绝某项操作的时间。如果将排队期设置为 0,则操作在通过批准期后立即执行。
expirationPeriod (有效期):操作在到期前必须执行的时间长度。根据操作的性质和时间敏感性进行调整。设置得太低会影响用户体验,设置得太高可能导致过时操作的突然执行。
isFixedLengthApprovalPeriod (固定长度批准期):一个布尔值,决定操作达到批准阈值后是否可以立即排队,或者用户是否必须等待整个批准期。设置为 false 时,可以在达到批准法定人数后立即对操作进行排队。
approvalRole/disapprovalRole (批准/反对角色):每个策略都有一个独立的批准和反对角色,允许具有这些角色的保单持有人投出批准和/或反对票。这些角色的数量用于计算某些策略的法定人数。
forceApprovalRoles/forceDisapprovalRoles (强制批准/反对角色):每种策略可以拥有一个或多个“强制角色”,这些角色可以投赞成或反对票,无论法定人数多少,都可以立即批准或反对该行动。例如,拨款委员会可以使用这种角色来快速否决提案。
批准/拒绝门槛
相对策略:使用 minApprovalPct 和 minDisapprovalPct 将所需的批准或反对数量定义为百分比。
绝对策略:使用 minApprovals 和 minDisapprovals 将所需的批准或反对数量定义为具体的数值。
帐户
在 Llama 生态系统中,账户是专门设计的智能合约,旨在直接管理链上的资产。这些账户可以由 Llama 实例部署,不仅限于管理特定类型的资产,还可以通过授权其他账户逻辑合约来创建新的账户类型,以满足更广泛的需求。Llama 推荐的账户逻辑合约覆盖了多种资产类型的管理,包括但不限于原生资产(如 ETH)、ERC-20 代币、ERC-721 代币、ERC-1155 代币等。此外,这些合约还包括了任意执行函数,以支持非标准代币类型并进一步扩展账户的功能。
管理代币
Llama 实例能够通过账户接收和管理各种类型的资产,比如原生资产(ETH)和代币(如 USDC)。这涉及到对这些资产的批准和转移权限的设置。账户提供的功能包括:
转账和批准:允许账户执行代币的转账和批准操作。
ERC-721 和 ERC-1155 运营商批准:为 NFT 和多代币标准提供运营商级别的批准能力。
批量转账:支持在一个交易中向多个接收者转移代币,提高了资金流动的效率。
为了实现更细致的资金管理,Llama 实例可以部署专门针对不同组织功能的账户,并为每个账户独立授予权限。此外,通过实施守卫,可以基于代币数量、转移频率、市场条件或其他可编程规则来制定资金管理规则。
任意执行
账户合约中的 execute 函数允许执行任意调用和代码,这对于确保非标准代币不会被锁定在账户中至关重要。通过这个函数,账户可以与外部合约进行直接交互,包括调用或委托调用目标合约,使用指定的 calldata。这一功能使得账户能够随着时间的发展而扩展其功能,比如通过使用支持代币流、归属、交换等操作的外围合约。
由于任意执行功能强大且涉及重要的安全考量,因此在使用时应特别注意以下几点:
最小特权原则:仅限必要的保单持有人被授权创建涉及 execute 功能的操作。
使用守卫:定义哪些目标可以被调用,是否采用调用或委托调用,以及可以接受的参数范围。
安全最佳实践
当使用账户的任意执行功能时,确保遵守以下安全最佳实践:
权限控制:严格限制谁能够触发 execute 函数,避免不必要的风险。
守卫机制:利用守卫来进一步约束 execute 函数的使用,例如限制可调用的目标地址和参数。
审计和测试:定期对账户合约及其相关逻辑进行审计和测试,确保没有安全漏洞。
透明度:保持所有操作的透明度,使社区成员能够监督账户活动,增强信任。
通过上述措施,Llama 实例能够安全有效地管理链上资产,同时保留足够的灵活性以适应不断变化的需求。
部署 Llama 实例
Llama 是一种用于管理智能合约系统特权功能的框架。要开始使用 Llama,您需要部署自己的 Llama 实例。以下是部署过程中涉及的关键概念和步骤。
关键概念
骆驼工厂(LlamaFactory):这是 Llama 实例的标准部署者,每个 Llama 支持的区块链都有一个这样的工厂合约。
羊驼实例(Llama Instance):Llama 实例是一组自我管理的合约,实现了对特权函数的链上访问控制。主要组成部分包括 Core、Policy 和 Executor 合约。
部署过程
要部署 Llama 实例,您需要调用 LlamaFactory 合约的 deploy 方法。部署前,您需要准备一些配置和设置,包括一组保单持有人、角色和权限,以初始化系统。
配置
deploy 方法接受一个名为 LlamaInstanceConfig 的配置结构体,其中包括以下几个关键部分:
名称(Name):Llama 实例的名称。
策略逻辑(Strategy Logic):初始策略实现(逻辑)合约。
账户逻辑(Account Logic):初始账户实现(逻辑)合约。
初始策略(Initial Strategies):初始策略配置数组。
初始账户(Initial Accounts):初始账户配置数组。
策略配置(Policy Config):实例策略的配置。
初始策略配置
初始策略配置是一个数组,每个元素都是一个 Config 结构,定义了初始化策略所需的数据。例如:
"initialStrategies": [
{
"approvalPeriod": 172800,
"approvalRole": 1,
"disapprovalRole": 3,
"expirationPeriod": 691200,
"forceApprovalRoles": [],
"forceDisapprovalRoles": [],
"isFixedLengthApprovalPeriod": true,
"minApprovalPct": 4000,
"minDisapprovalPct": 5100,
"queuingPeriod": 345600
}
]
初始账户配置
每个账户只需要一个名称即可配置。例如:
"initialAccounts": [
{
"name": "Mock Protocol Treasury"
},
{
"name": "Mock Protocol Grants"
}
]
策略配置
策略配置采用以下结构形式:
{
"roleDescriptions": ["ActionCreator", "Approver", "Disapprover"],
"roleHolders": [
{
"policyholder": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef",
"expiration": 18446744073709551615,
"quantity": 1,
"role": 1
}
],
"rolePermissions": [
{
"role": 1,
"permissionData": {
"selector": "0x51288356",
"strategy": "0x9c7e3be11cB2f4D9A7fA0643D7b76569AF838782",
"target": "0x6aDaEfec2bC0ee7003e48320d4a346a6Be882950"
},
"hasPermission": true
}
],
"color": "#00FF00",
"logo": "<SVG_STRING>"
}
角色描述(Role Descriptions):初始角色描述的数组。
角色持有者(Role Holders):初始角色持有者的 role、policyholder、quantity 和 expiration。
角色权限(Role Permissions):定义了角色是否具有特定权限。
颜色(Color):实例策略的 SVG 表示的主要颜色。
徽标(Logo):代表已部署的 Llama 实例的 NFT 徽标的 SVG 字符串。
部署后的合约
调用 deploy 方法后,将部署以下合约:
LlamaCore
LlamaPolicy
LlamaExecutor
LlamaPolicyMetadata
至少一个策略合约,可选更多
可选的账户合约
通过以上步骤,您可以成功部署自己的 Llama 实例,从而实现对智能合约系统特权功能的安全管理和控制。
网址:https://llama.xyz/
声明:本网站所有相关资料如有侵权请联系站长删除,资料仅供用户学习及研究之用,不构成任何投资建议!