在前一篇文章
诸位大神的回复给予我很大的帮助,尤其 @ripplerm 对我关心的几个问题给予了解答很阐述,万分感激。
这篇文章继续学习签名部分。
关于验证过程的摘要
首先继续那我摘出来的这段话
a signature consists of two numbers, R and S, and you use a private key to generate R and S, and if a mathematical equation using the public key and S gives you R, then the signature is valid.
结合steem,我对此的理解
签名逻辑上分为两部分,R和S,用私钥(和摘要)生成 校验的时候,用(公钥,S)带入数学公式,得到R,证明签名合法性。(摘要用不?)
对于我自己备注的摘要用不?
我想了一晚上,技术上没想明白,但是从逻辑上,如果摘要不要,岂不是这个签名可以用在任何信息上了,这不科学,哈哈哈。所以一定是要的。
关于验证签名的合法性
想明白上述问题以后,那么对验证签名的合法性的流程有了更详细的了解。
结合xeroc的文章以及steem的实例
我理解验证签名的过程和生成签名的过程有些类似。
- 拿到带签名的
Transaction
- 去掉签名部分,用剩余部分按照生成签名的流程来生成
摘要(序列化,生成头部,生成摘要)
- 取出签名的
(S、R)
以及Transaction 用户对应的public keys
(公钥 steemd上查询或者用API获取) - 通过
公钥和S算出R
则签名合法,否则异常
代码以及测试
python-graphenelib 以及 python-steem 对签名验证部分进行了很好的封装
xeroc的文末提供一段验证签名的合法性的代码
from steembase import transactions
tx2 = transactions.Signed_Transaction(**tx)
tx2.deriveDigest("STEEM")
pubkeys = [PrivateKey(p).pubkey for p in wifs]
tx2.verify(pubkeys, "STEEM")
为此我特意从steemd取了个最新的 transactions
{'expiration': '2017-02-21T13:33:30',
'extensions': [],
'operations': [['vote',
{'author': 'austrin16',
'permlink': 'phobias',
'voter': 'robin.hood',
'weight': 10000}]],
'ref_block_num': 60790,
'ref_block_prefix': 2747450036,
'signatures': ['205520a31db2012ba14e78b8864819a2fd87de34314a10134b8d9ee83b8b4f879104cbfea79e65a814ad1f56a24b9a837e5b78872ec33ba7494eae17b240a4a9e5']}
分别用我的公钥以及robin.hood 的公钥去验证
然后,结果如我所料,我的公钥用来验证失败,robin.hood(voter) 的公钥验证通过