STEEM/HIVE 账户多签研究

in STEEM CN/中文6 years ago (edited)

O哥的文章了解到,STEEM/HIVE存在多签的功能。

啥是多签呢?比如我一个操作,需要同时多个KEY签名才能签署,这样哪怕我自己的私钥泄露了,账户的钱也不会被盗。

怎么设置多签呢?来研究一下。

首先需要Account_update一下,我下面的操作是授权给我的两个小号sellcard和fishaa,在active里面加上这两个账号的公钥。

sellcard:STM6kFLtnuXQ5W7S2BTwxCQbzr9FhThXi2XXjn5b5cUNtgM1xnnBg
fishaa:STM6NtHNLWqbnEMiKBcYzQvaXMMcQFwDE1i67TVF7HbvFMwLCgDcc

from beem.steem import Steem
from beembase import operations
from beem.transactionbuilder import TransactionBuilder
from beembase.transactions import Signed_Transaction
from beem.account import Account

nodes = 'https://cn.steems.top'#节点
player="maiyude"
key="5Hq7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"#我的activekey

s = Steem(keys=[key], node=nodes)
account = Account(player, steem_instance=s)

who={'weight_threshold': 2, 'account_auths': [], 'key_auths': [
        ['STM7rBbE4JfxsXyvpCGXGPPh7GeDftbCv4keE41ByiBg9ie3evk57', 1],#maiyude,权重1
        ['STM6kFLtnuXQ5W7S2BTwxCQbzr9FhThXi2XXjn5b5cUNtgM1xnnBg', 1], #sellcard,权重1
        ['STM6NtHNLWqbnEMiKBcYzQvaXMMcQFwDE1i67TVF7HbvFMwLCgDcc', 1]#fishaa,权重1
    ]}

op = operations.Account_update(
        **{
            "account": account["name"],
            "json_metadata": account["json_metadata"],
            "active": who,
            "memo_key": account["memo_key"]
        })

tx = TransactionBuilder(steem_instance=s)

tx.appendOps(op)
# 把签名添加并签名
tx.appendSigner(player, "active")
tx.sign()
   
#广播
tx.broadcast()

{'weight_threshold': 2, 'account_auths': [], 'key_auths': [
['STM7rBbE4JfxsXyvpCGXGPPh7GeDftbCv4keE41ByiBg9ie3evk57', 2],#maiyude,权重1
['STM6kFLtnuXQ5W7S2BTwxCQbzr9FhThXi2XXjn5b5cUNtgM1xnnBg', 1], #sellcard,权重1
['STM6NtHNLWqbnEMiKBcYzQvaXMMcQFwDE1i67TVF7HbvFMwLCgDcc', 1]#fishaa,权重1
]}

这里的weight_threshold是设置需要多大的权重才能操作,我设置为2。
我同时授权给了3个账户,每个账户权重设置为1,也就是需要2/3账户同时签名才能操作。

看看授权有没成功:
https://steemd.com/@maiyude

可以看到3个KEY已经好好的加上去了

好了,现在授权成功了。测试一下。

首先单用sellcard的私钥签名,试试,毫不意外的失败了。

再次使用sellcard加上fishaa两把私钥签名试试,以一个转账操作为例:

from beem.steem import Steem
from beembase import operations
from beem.transactionbuilder import TransactionBuilder
from beembase.transactions import Signed_Transaction

op = operations.Transfer(**{
    "from": "maiyude",
    "to": "sellcard",
    "amount":"1.001 STEEM",
    "memo":"test"
})

nodes = 'https://cn.steems.top'#节点
player2="sellcard"
key2="5J15L18xxxxxxxxxxxxxxxxxxxxxxxxxxxxf"#sellcard的KEY

player3="fishaa"
key3="5KTxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxRQ"#fishaa的KEY

s = Steem(keys=[key2,key3], node=nodes)
tx = TransactionBuilder(steem_instance=s)

tx.appendOps(op)
#把签名添加
tx.appendSigner(player2, "active")
tx.appendSigner(player3, "active")

tx.sign()

#广播
tx.broadcast()

成功广播了出去:
https://steemd.com/tx/6430390a1ae5a0c5dbca4f689073dfa29e8fe508

可以看到下面是有两个签名的,多签成功。

Sort:  

这个功能开发得不错,对应现实中的是公款需要多个股东同时签名才能转帐!
改天找找steemjs版有没有这功能!

这功能好安心!支持鱼哥👏5⃣!shop

你好鸭,maiyude!
@annepink赠送1枚SHOP币给你!

目前你总共有: 1枚SHOP币

查看或者交易 SHOP币 请到 steem-engine.com.

无聊吗?跟我猜拳吧! **石头,剪刀,布~**

这个比较有实用场景
话说,posting的话,里面的threshold比重有什么用处?

一样的,必须我设置threshold是3。
那么就需要几个签名加起来threshold大于等于3才能成功操作。

很厉害啊,这个得弄一下

啪啪啪啪

Coin Marketplace

STEEM 0.04
TRX 0.32
JST 0.077
BTC 63999.25
ETH 1662.28
USDT 1.00
SBD 0.42