首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在模块上强制密钥集?

如何在模块上强制密钥集?
EN

Stack Overflow用户
提问于 2022-06-14 16:35:45
回答 1查看 115关注 0票数 1

契约文档描述了使用密钥集控制模块。具体来说,给定模块(module foo 'foo-keyset ...),如果有人试图升级契约,那么'foo-keyset将“在事务签名集上强制执行”。

我正在努力理解执行'foo-keyset意味着什么。该字符串如何与签名集中的一个或多个特定签名相关联?这个字符串有什么意思吗?或者我可以给它取任何我想要的名字?如果字符串是任意的,那么具体强制执行什么?

我试图用契约文档来解决这个问题,看看是否有一种方法将这个键集字符串与键集中的一个或多个签名关联起来。文档将密钥集描述为公钥和密钥集谓词的列表,给出了一些JSON示例如下所示:

代码语言:javascript
复制
{ "keys": ["abc6bab9b88e08d","fe04ddd404feac2"], "pred": "keys-2" }
{ "keys": ["abc6bab9b88e08d","fe04ddd404feac2"], "pred": "my-module.custom-pred" }

我想,也许可以使用键集谓词将'foo-keyset与键集中的特定键或一组键关联起来,比如需要谓词my-module.foo-keyset,但键集谓词的文档似乎将重点放在从键集中计数特定数目的匹配。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-21 20:20:55

键集引用是在环境中定义的唯一密钥集。不管是雷普还是区块链。在repl中,可以定义如下所示的键集:

代码语言:javascript
复制
(env-data {
  "bob-guard": {"keys": ["bob"], "pred": "keys-all"}
 ,"alice-guard": {"keys": ["alice"], "pred": "keys-all"}
  })

在区块链上,您需要选择一个唯一的名称,并使用define-keyset定义它

代码语言:javascript
复制
    (define-keyset 'my-unique-keyset-name (read-keyset "keyset"))

read-keyset从事务数据中定义的变量my-keyset中读取密钥集。

如果您为您的模块定义了治理密钥集,那么在通过部署相同的模块名进行升级时,将验证密钥集。通过谓词(pred)检查密钥集的有效性。谓词可以是作为参数输入的任何函数、键集中的键数和匹配签名的计数。如果谓词返回true,则事务可以继续。您可以构造与此函数签名匹配的自定义谓词:

代码语言:javascript
复制
    (defun keys-majority:bool(count:integer matched:integer)
      (>= matched (+ (/ count 2) 1)))

然后使用该自定义谓词创建密钥集:

代码语言:javascript
复制
(env-data {
  "my-module-guard": {"keys": ["bob", "alice", "babena" ],
  "pred": "my-module.keys-majority"}
})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72620513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档