EOS商业落地利器:多签名

eos主网上线在即,它之所以能受到各方青睐,主要是看中了它在未来商业应用落地的潜力。在这期间,完善的账户与权限系统是必要条件。

关键字:eos,账户,钱包,权限,多签名,eosio.msig,proposal,权重,阈值

概况

  • 账户:是存储在区块链上的人们可识别的ID。
  • 权限:每个事务都有,它是由已配置许可的账户所评估的。
  • 阈值:每个被命名的权限都有一个有效范围,必须满足是在许可下的一个签名事务,将被视为有效。
  • 签名:事务的签名是通过利用一个客户端来执行,该客户端拥有一个已加载并已解锁的钱包。
  • 钱包:可以保护及使用你的keys的一个软件。这些keys可能是也可能不是区块链授权的一个许可账户。

钱包

钱包是一个客户端,用于存储keys,可能与也可能不与一个或多个账户进行关联。一个钱包会有锁定和解锁两种状态,理想状态下,它是被一个高熵密码所保护。EOSIO有一个命令行客户端cleos,与一个轻客户端keosd交互,它俩构成了eos钱包的这种模式。

账户

一个私人个体或者一个组织都可以拥有账户,在交易或者其他push一个事务到区块链上的时候,账户是必须的。

Authorities(权限) 和 Permissions(许可)

这两个概念特别容易搞混为一谈,这里给做一下区分。

Authorities决定了是否每一个给出的action都被正确授权。

每个账户都有两个与生俱来的权限命名:

  • owner,象征着一个账户的所有权。只有很少的事务会需要这种权限。但最值得注意的是,actions可以对owner的权限做出各种改变。所以一般来说,建议owner被冷藏存储,不告诉任何人。owner可以用来回复另一个可能已遭泄露的许可。
  • active,用于转移资金,投票生产者以及做其他高级账户的变更操作。唯一不同的是,它不能够改变owner。

除了这两个与生俱来的权限。一个账户也能拥有自定义命名的权限,它可以进一步扩展账户管理。自定义权限非常灵活并且提出了众多可能的用例实现。在开发者社区,这些问题已经被提了出来,包括他们是如何工作的,以及如果有的话是什么约定被采用了。许可对于任何给定的权限可以被分配到一个或多个公钥或者一个有效的账户名称。

综合实践

下面是结合所有上述概念以及一些小例子,用来展示如何实际使用它们。

默认账户配置(单签名)

这里主要讲述当一个账户被创建以后,它是如何配置的。它分别拥有owner和active权限,可独立设置key,两个keys都是权重为1,且许可的阈值也都是1。该账户在执行某个操作action时,需要通过默认的配置,单独签名授权一个本机权限。

创建账户演示

Usage: cleos create account [OPTIONS] creator name OwnerKey [ActiveKey]

(在eos正式版本中,activeKey已不强制,变为可选)在创建账户时,需要指定其owner和active两个权限的key,这里要使用公钥。所以,


[email protected]:~$ cleos create account eosio lllwwwbbb "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV"
executed transaction: 7afb37faf4fadaf1b23bbf33a2ec316baf41fcd8e5587f4b2307db091c372829  200 bytes  209 us
#         eosio <= eosio::newaccount            {"creator":"eosio","name":"lllwwwbbb","owner":{"threshold":1,"keys":[{"key":"EOS6MRyAjQq8ud7hVNYcfnV...
warning: transaction executed locally, but may not be confirmed by the network yet

这个版本只需要指定一个owner权限的key即可创建账户。active权限是小于owner的,所以显得不那么重要。

多签名账户

上面单签名的内容很简单,之所以介绍它,是为了与本节多签名账户进行比较学习。

多签名账户,一个账户假设为Jack的owner和active权限分别被授权为其他两个账户Alice和Bob的许可。

@Jack

permission account weight threshold
owner 2
@Alice 1
@Bob 1
active 1
@Alice 1
@Bob 1
permission account weight threshold
publish 2
@Alice 2
@Bob 2
"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV" 1

多账户权限演示

首先,我们创建至少三对key:

[email protected]:~$ cleos wallet keys
[
  "EOS5WsMPtPqW8d3yxfCWP9WJcbkD3wDBWDfyV2CLagC7tWKT9wGkX",
  "EOS5nrEfZ4wcnmt2u2PGWDneZDNevQ6MoiF4RE3hpLKHk2rWpBB8x",
  "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
  "EOS6PTrfoaTYRHUhCedBf6b9CX3KDpJoWry6WQHe3WkpdFTMV2f78"
]

然后,分别使用不同的public key创建三个账户:jack, alice和bob,创建成功以后,我们先来查看当前jack账户的permission内容:


[email protected]:~$ cleos get account jack
permissions:
     owner     1:    1 EOS5WsMPtPqW8d3yxfCWP9WJcbkD3wDBWDfyV2CLagC7tWKT9wGkX
        active     1:    1 EOS5WsMPtPqW8d3yxfCWP9WJcbkD3wDBWDfyV2CLagC7tWKT9wGkX

接着,按照上面我们设计的表格内容,我们先对jack的owner权限进行修改:

[email protected]:~$ cleos set account permission jack owner ‘{"threshold":2,"keys":[],"accounts":[{"permission":{"actor":"alice","permission":"owner"},"weight":1},{"permission":{"actor":"bob","permission":"owner"},"weight":1}],"waits":[]}‘ -p [email protected]
executed transaction: 494777ac55fa19144027ba5fdf75dcdaab4c4d52cdcaa13c0b6ecabfe622ffd1  160 bytes  136 us
#         eosio <= eosio::updateauth            {"account":"jack","permission":"owner","parent":"","auth":{"threshold":2,"keys":[],"accounts":[{"per...
warning: transaction executed locally, but may not be confirmed by the network yet

注意这里使用到了 cleos set account permission 命令。这条命令中比较重要的部分是第三个参数authority的内容。

authority的内容可以是:

  • NULL,代表删除权限
  • public key,将该权限的内容设置为一个公钥
  • JSON字符串,完整地复杂地设置一个账户某个权限的内容
  • 一个文件名,同上,只不过改为将完整配置放在文件中读取

根据我们以上对jack owner权限的设计方案,是属于比较复杂的权限内容,因此这里采用的是第三种方式,及JSON字符串的方式。那么JSON字符串的格式是什么?我们例举本次生效的配置格式化如下:

{
    "threshold": 2,
    "keys": [],
    "accounts": [
        {
            "permission": {
                "actor": "alice",
                "permission": "owner"
            },
            "weight": 1
        },
        {
            "permission": {
                "actor": "bob",
                "permission": "owner"
            },
            "weight": 1
        }
    ],
    "waits": []
}

我们分别来介绍这里面的字段:

threshold

目前最多只有两个账户,每个账户的权重都是1,所以threshold的取值范围是1或者2。

  • 1:在@Jack账户上执行任何需要owner权限的操作必须由@Alice或者@Bob账户任意一个账户进行签名授权。
  • 2:在@Jack账户上执行任何需要owner权限的操作必须由@Alice和@Bob账户进行多签名授权。

keys

也可以通过JSON字符串设置秘钥,这与在命令中第三个参数直接使用公钥是相同的效果。但是要注意的是,如果该账户已经通过JSON设置了复杂的权限内容,再次修改的时候一定还需要使用原JSON数据进行增量修改,若使用命令行加公钥的方式会直接覆盖掉原JSON设置的复杂权限内容。

accounts

权限是通过其他账户来授权,其中包括:

  • permission:某个账户actor的某个权限
  • weight,与上面的threshold呼应使用

    我们这里就是通过设置该字段来实现的多账户签名。

waits

设置延时时间,最大不超过max_transacton_delay的配置值。



下面来设置其active权限,active权限与owner权限不同的是threshold的值,以及

账户除了owner权限是根权限以外,active本身是其子权限,而 cleos set account permission 命令设置的权限默认都是active的子权限,注意,我们在设置active权限本身的时候,要手动指定其父权限为owner,否则会默认指向自己,报错。

[email protected]:~$ cleos set account permission jack active ‘{"threshold":1,"keys":[],"accounts":[{"permission":{"actor":"alice","permission":"owner"},"weight":1},{"permission":{"actor":"bob","permission":"owner"},"weight":1}],"waits":[]}‘ owner -p [email protected]
executed transaction: 0865e7e9122354a2c29fd9ab48bb39b8a7bd758fdd7c4dc376e21ce45d8e23fb  176 bytes  461 us
#         eosio <= eosio::updateauth            {"account":"jack","permission":"active","parent":"owner","auth":{"threshold":1,"keys":[],"accounts":...
warning: transaction executed locally, but may not be confirmed by the network yet

这样,jack账户的权限就全部按照以上权限设计表格设置完毕了,下面我们使用命令来验证一下目前jack账户的权限内容:

[email protected]:~$ cleos get account jack
permissions:
     owner     2:    1 [email protected], 1 [email protected],
        active     1:    1 [email protected], 1 [email protected],

多签名演示

一. 部署eosio.msig合约

首先要注意的是,EOS中对多签名的支持是通过eosio.msig智能合约来支持的,因此秉承eos"专人专责"的设计规范,我们先创建一个账户eosio.msig,并用该账户部署eosio.msig合约。

如果不是自己新增或者对原合约有修改的话,推荐直接使用build目录下的contract,已经生成好了相关的wast以及abi文件。

二. 部署eosio.token合约

这里我们使用token合约的相关权限操作进行多签名的演示。同样的,我们也创建一个账户eosio.token并用其部署eosio.token合约。创建一个SYS token,并发放给jack,bob和alice三人分别100个。然后我们调用命令:

[email protected]:~$ cleos push action eosio.token transfer ‘["jack","bob","50 SYS"]‘ -p [email protected]
executed transaction: 8166f8503a098eeab6642afe375167e18bf79d0d904015f5bba19524ce2d56d6  144 bytes  846 us
#   eosio.token <= eosio.token::transfer        {"from":"jack","to":"bob","quantity":"50 SYS","memo":""}
#          jack <= eosio.token::transfer        {"from":"jack","to":"bob","quantity":"50 SYS","memo":""}
#           bob <= eosio.token::transfer        {"from":"jack","to":"bob","quantity":"50 SYS","memo":""}
warning: transaction executed locally, but may not be confirmed by the network yet
[email protected]:~$ cleos get currency balance eosio.token alice
100 SYS
[email protected]:~$ cleos get currency balance eosio.token jack
50 SYS
[email protected]:~$ cleos get currency balance eosio.token bob
150 SYS

该命令执行成功,是由[email protected]权限许可的该命令操作。

三. 描述问题,引出多签名

我们在上一小节中介绍到了,jack的owner权限是与bob和alice相关的。所以可能遇到这么一个情况,jack今天不在,而它又需要以上的操作怎么办?那么是否可以通过上面对jack权限的设置,在jack不在的情况下通过bob和alice的操作完成本属于jack权限许可的操作呢?是的,这就是多签名的概念和意义。

四. 建立多签名操作提案

首先,eos中关于多签名的命令是multisig,这也是通过第一步中eosio.msig合约实现的。

jack不在,要想通过bob和alice两个人来审批本属于jack的操作,这就要比jack本人操作要麻烦一点,需要新建一个提案。

[email protected]:~$ cleos multisig propose nojack ‘[{"actor":"alice","permission":"owner"},{"actor":"bob","permission":"owner"}]‘ ‘[{"actor":"jack","permission":"owner"}]‘ eosio.token transfer ‘{"from":"jack","to":"bob","quantity":"50 SYS","memo":"test multisig"}‘ -p eosio.msig
executed transaction: a223945e79c92cd5ca5243d64dce02ecf9bb1420e6ca3b5e5ac3fdae3dd4e8c3  240 bytes  389 us
#    eosio.msig <= eosio.msig::propose          {"proposer":"eosio.msig","proposal_name":"nojack","requested":[{"actor":"alice","permission":"owner"...
warning: transaction executed locally, but may not be confirmed by the network yet

注意在提案中的定义操作要输入完整的key-value对应参数关系。本例中,transfer后面的参数的定义内容与上面直接用jack是一致的,但格式是完整格式,上面jack单签名时是使用的简略版,可自行对比发现。

这个提案结尾需要一个账户授权,这个账户是不做限制的,只是为了日后操作这个提案本身,因此这里选择一个不想关的用来部署eosio.msig合约的账户eosio.msig签名授权该提案。

五. 查看提案

[email protected]:~$ cleos multisig review eosio.msig nojack
{
  "proposal_name": "nojack",
  "packed_transaction": "38d0295b000000000000000000000100a6823403ea3055000000572d3ccdcd0100000000000091790000000080ab26a72e00000000000091790000000000000e3d320000000000000000535953000000000d74657374206d756c746973696700",
  "transaction": {
    "expiration": "2018-06-20T03:55:36",
    "ref_block_num": 0,
    "ref_block_prefix": 0,
    "max_net_usage_words": 0,
    "max_cpu_usage_ms": 0,
    "delay_sec": 0,
    "context_free_actions": [],
    "actions": [{
        "account": "eosio.token",
        "name": "transfer",
        "authorization": [{
            "actor": "jack",
            "permission": "owner"
          }
        ],
        "data": {
          "from": "jack",
          "to": "bob",
          "quantity": "50 SYS",
          "memo": "test multisig"
        },
        "hex_data": "00000000000091790000000000000e3d320000000000000000535953000000000d74657374206d756c7469736967"
      }
    ],
    "transaction_extensions": []
  }
}

重点查看该提案设定的action,包括该action需要的权限,操作名,参数等。

六. 查看提案审批情况

multisig合约定义了两个数据表,其中一个approvals表就是记录了提案的审批状态。

[email protected]:~/.local/share/eosio/nodeos/config$ cleos get table eosio.msig eosio.msig approvals                                {
  "rows": [{
      "proposal_name": "nojack",
      "requested_approvals": [{
          "actor": "alice",
          "permission": "owner"
        },{
          "actor": "bob",
          "permission": "owner"
        }
      ],
      "provided_approvals": []
    }],
  "more": false
}

七. 审批提案

提案创建完成以后,就需要alice和bob这两个账户分别进行审批,他们各自都需要使用自己的owner权限签名审批这个动作。

[email protected]:~$ cleos multisig approve eosio.msig nojack ‘{"actor":"alice","permission":"owner"}‘ -p [email protected]
executed transaction: be473b9abcc361a6d4c00d726318d06cb98775bd9390f2ebe1e4e8d72afd5de2  128 bytes  269 us
#    eosio.msig <= eosio.msig::approve          {"proposer":"eosio.msig","proposal_name":"nojack","level":{"actor":"alice","permission":"owner"}}
warning: transaction executed locally, but may not be confirmed by the network yet
[email protected]:~$ cleos multisig approve eosio.msig nojack ‘{"actor":"bob","permission":"owner"}‘ -p [email protected]
executed transaction: 98c707b04ef43b17e25bfb5fb6700300f438ea3af08f5c5f44724bb7f66c9eb2  128 bytes  441 us
#    eosio.msig <= eosio.msig::approve          {"proposer":"eosio.msig","proposal_name":"nojack","level":{"actor":"bob","permission":"owner"}}
warning: transaction executed locally, but may not be confirmed by the network yet

八. 返回第6步

[email protected]:~/.local/share/eosio/nodeos/config$ cleos get table eosio.msig eosio.msig approvals                                {
  "rows": [{
      "proposal_name": "nojack",
      "requested_approvals": [],
      "provided_approvals": [{
          "actor": "alice",
          "permission": "owner"
        },{
          "actor": "bob",
          "permission": "owner"
        }
       ]
    }],
  "more": false
}

可以看到,原requested_approvals中的待审批项已经全部转到了provided_approvals 已审批列表中。

这里我们可以通过unapprove命令将已审批项转至未审批集合中去。unapprove的参数与以上approve完全相同。

九. 执行提案

以上两个非jack账户的审批过程就是多签名的内容,多签名执行成功以后,可以开始执行提案。

[email protected]:~$ cleos multisig exec eosio.msig nojack -p eosio.msig

--

执行成功以后,再次检查各账户的SYS余额,能够发现此提案的转账50个SYS的操作已经生效。

自定义权限

上面提到了,除了owner和active权限之外,我们还可以自定义权限。仍在以上@Jack账户中进行补充,增加一个自定义权限,名为publish:

permission account weight threshold
publish 2
@Alice 2
@Bob 2
"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV" 1

weight:

权重,这是相对于上面threshold阈值的概念,就拿上面的属于账户@Jack的publish权限来讲,它包含三个子权限分别是:

  • @Alice账户,权重为2
  • @Bob账户,权重为2
  • 一个keys,权重为1

而此时publish权限的阈值设定为2,也就是说,@Alice或@Bob任意一个账户均可以签名授权@Jack账户的publish权限,因为这两个账户的权重均为2,任意一个签名都可保证够到publish权限的阈值2。而如果只有权重为1的keys签名,则必须再有以上任意一个账户来同时签名,总权重达到了3,超过了publish阈值2才可以成功授权。

自定义权限部分的演示与上面的类似,通过set account permission可以设置有key,有账户,不同权重的十分复杂的权限内容。这里不再赘述。

总结

本文可以分为两部分,第一部分是如何为一个账户设置复杂的权限体系,第二部分是如何利用账户权限进行多账户签名。这部分内容十分灵活,依据这个流程,我们可以根据业务场景需要,调整设计。例如,多账户必须均签名才能通过某一个操作,或者多账户只要其中一个或者多个签名即可通过某一个操作。通过本文所述,均可实现。

参考资料

  • EOS官方文档
  • 本地环境测试

更多文章请转到醒者呆的博客园

原文地址:https://www.cnblogs.com/Evsward/p/msig.html

时间: 2024-11-01 16:11:51

EOS商业落地利器:多签名的相关文章

认知商业第一波来了,IBM营销云落地中国

(上图为IBM认知商务事业部市场解决方案副总裁Christopher Wong) 2016年3月1日,在北京举办的IBM论坛2016上,IBM宣布公司105年的历史上第三个品牌"认知商业"落地中国.IBM CEO Ginni Rometty在2月底接受美国记者访问的时候,称一个以"认知计算"为核心的"决策支持"市场将在2025年创造2万亿美元的规模. 对于普通企业来说,是否有机会尝鲜认知商业和认知计算呢?3月15日,IBM宣布基于认知计算的IBM

浅谈区块链技术在商业领域的应用

近年来,由于虚拟数字货币炒作的火爆,作为其底层技术的区块链也开始受到广泛关注.区块链具有去中心化.去信任.集体维护.可靠存储的特征,目前己在虚拟货币领域广泛应用. 自比特币诞生以来,目前全球已陆续出现了 1600多种虚拟货币,围绕着虚拟货币的生成.存储.交易等形成了庞大的产业链生态.但整体而言,行业尚处于初创期,离真正的价值应用区域还有很大距离.区块链经济的核心在于商业逻辑和组织形态的重构,因此需要在多个行业获得应用落地的实例来表明其价值.本文将从区块链与行业需求相结合的角度,探讨区块链在各行业

破局AI落地难,数据标注行业需率先变革丨曼孚科技

?2019年,国内人工智能领域的投融资热情大幅降低,相当数量的AI企业彻底消失在了历史的长河中,“人工智能寒潮已至”甚至成为行业年度热词. 与前几年创业与投资热情齐头并进的盛况相比,近段时间的AI行业显然萧条了很多. 究其原因,“AI落地难”要负主要责任. 从自动化时代到智能化时代,人工智能创造的价值在不断增长.与此同时,业务场景的精细度与复杂度也在不断提升,为人工智能技术的落地带来一系列挑战. 以国内人工智能企业为例.目前国内几个较大的人工智能独角兽企业,商业化落地主要集中在金融.安防监控.手

用数据找机会—《决战大数据》精粹

未来是大数据的时代,未来的竞争就是数据的竞争.以前,我们都是有问题找数据,而大数据时代,其最核心的特质则是"用数据找机会".--车品觉 <决战大数据:驾驭未来商业的利器>是我在两年前接触到的第一本关于大数据的书籍,由阿里巴巴集团副总裁车品觉所著.此书不是讲具体的大数据处理技术,而是从一个大数据运营践行者的角度来讲大数据的本质.数据处理的核心思想以及阿里巴巴数据运营的"内外三板斧".文章并非枯燥的学术性论文,作者在文中加入很多工作小案例对观点进行引出.阐述

认知计算是2万亿美元的盛宴,IBM喊你到碗里来!

(上图为IBM大中华区董事长陈黎明宣布IBM认知商业战略在中国正式落地) 2016年3月1日,IBM大中华区董事长陈黎明在IBM论坛2016上宣布公司105年的历史上第三个品牌"认知商业"落地中国.早在1995年,IBM就描绘了"电子商务"的愿景.2008年,IBM推出了"智慧的地球".如今,IBM再次推出了基于认知计算的"认知商业",但这一次IBM说"不当领导者"也"不唱独角戏". 就

英特尔人工智能圆桌论坛举行 四位大咖论道AI

英特尔人工智能圆桌论坛举行 四位大咖论道AI 2017-04-01 17:57 北京2017年4月1日电 /美通社/ -- 毫无疑问,人工智能已是最具变革力的发展趋势之一,在3月31日举行的2017英特尔中国媒体纷享会上,以"The NEXT:走进人工智能时代"为主题的圆桌论坛激起激烈的观点碰撞,诸多热点话题得到进一步的探讨和解读.  在资深媒体人董军的主持下,英特尔中国研究院院长宋继强,新华网董事.副总裁申江婴,人工智能专家.清华大学计算机系教授.博士生导师邓志东以及通信专家.720

2017Wow!新媒体营销深度分享会值得参加吗?

"Wow!新媒体营销深度分享会"是虎嗅打造的创新跨界营销平台,以引领营销趋势和洞察技术奇点为目标,推动前沿技术创新与营销的碰撞融合. 在这里,你将看到2017年最前瞻的营销趋势.最经典火爆的营销案例复盘.最新鲜前沿的技术集中亮相.最有深度的技术营销官经验分享.我们期望,该活动能链接创新人与创新技术,为营销人提供新视角和新方向. 此外,我们还将从"创新和创意"."互动和参与度"."传播和转化"三个维度出发,通过业内专家投票,评选

如何搭上AR+快车,ARVR云设计告诉你!

原文标题:如何搭上AR+快车,ARVR云设计告诉你! 增强现实和虚拟现实依然是时下最为热门的黑科技,各大科技媒体都充斥着AR/VR相关新闻和报道.去年夏天,<精灵宝可梦Go>将增强现实从概念变成一个风靡全球的活动.AR使得我们与数字世界的链接发生巨大的变革,成为下一代信息交互平台的核心技术. 大热之下,隐忧显现 就整个AR市场的底层硬件而言,微软的增强现实眼镜(HoloLens)可谓最具代表性,能将3D投影仪以及房间地图摄像头嵌入在一个轻便型的可穿戴设备里,不过这也意味着这款设备价格高昂,只能

无人驾驶技术已成熟,中美AI大国争夺最后窗口期

近期,前百度高级副总裁.百度自动驾驶事业部创始人及总经理王劲带着他仅5个月的创业公司"景驰科技"集中亮相于中国业界.专注于无人驾驶技术的景驰科技于2017年4月3日在硅谷诞生,一个月后即完成首次封闭道路无人驾驶测试,再一个月即获得加州GMV路测牌照,一周后又完成首次开放道路无人驾驶测试,在创业的第5个月就在硅谷高峰时段的车海中通勤. 2017年9月15日,就在景驰科技完成硅谷高峰时段通勤后7天,王劲出现在北京由华创资本举办的分享会上.王劲呼吁,无人驾驶是人工智能皇冠上的明珠,借助汽车产