求大神给讲讲签名部分

in #cn-programming8 years ago

我在读这篇文章

Steem transaction signing in a nutshell

但是这部分有些看不懂
the back-end only accepts canonical signatures and we have no way of knowing if the signature that is going to be produced will be canonical

意思是系统只接收规范签名

然后它用一个自增变量循环生成一个K参数
然后在用这个k参数去签名
然后大致是这部分代码

        # Make sure signature is canonical!
        #
        lenR = sigder[3]
        lenS = sigder[5 + lenR]
        if lenR is 32 and lenS is 32 :
            # ........

有些搞不懂什么是规范签名(canonical signatures)?如何判断?
查了一下云山雾罩的

if lenR is 32 and lenS is 32 :
lenR和lenS 都等于32就是规范签名?

先谢过了。

Sort:  

不專業只能靠Google想跟學但看不太懂的來了...

Canonical Signatures
As of release 0.22, Ripple requires all transactions and validations to be signed with canonical signatures. A canonical signature is basically just the way signatures are normally produced by all known ECDSA signature libraries.
A signature is not considered canonical if it contains padding bytes outside the DER representation, is not legal DER, contains any signature parameter that is negative or greater than the modulus, and so on.

來源在此。那什麼是ECDSA,那就是橢圓曲線簽名了。

小弟只是想跟著學(學點名詞主要是... ),班門弄斧莫笑太大聲了啊...

補充一下,剛剛我google,輸入"canonical signature 簽名",你猜排名第一位的文章是什麼?

就是樓主你的文章哪!不到30分鐘,Google就拿去了,這是怎麼回事啊? @smarketing 你是流量專家,有解釋嗎?

你单独搜 canonical signature 此文是排不上第一 ,但加上了 "签名" 就第一了

“canonical signature 签名”, google分两组词来查询的,canonical signature + 签名, google以前抓取的文章,没有相同的内容,该关键字没有竞争 (其它文章不同时包括这两个词 canonical signature + 签名 ),内容独特原创是google最喜欢的!
做流量,许多“长词组合花钱最少”, 但搜索的人不多,搜索高频率的竞争高, 搞这个排名就要靠高质量外链+网页速度.
虽然用户在减少,但文章数并没有少,steemit有几个机器人专门查相似内容,文章原创的还很多, 爬虫很快速度在抓, 写篇文章,不超过10分钟就会被抓,google还是很爱steemit!

專業!

google是什么鬼玩意,听说过没见过:)

这部分google确实挺牛的,steemit的文章收录的非常快,可惜百度不收录!steemit的文章在国内没一篇查得到的!

百度收录了50余条。语法: site:steemit.com
@ace108 @myfirst收录了一些,看了下快照,最近的收录事2017年2月13日的,一直有baiduspiderbot去的,不过返回状态一直503

这个你估计是搞错了。baidu是不会直接收录steemit上的内容的,收录的也是国内网站上相关内容,最多是8btc上一些相关内容。



查询收录的方式,在搜索引擎 输入 site:域名
通用于任何搜索引擎。
还有 百度蜘蛛是全世界网站都会索引的,除非robot.txt禁止了,不然会收录的,影响收录的条件很多,服务器响应速度是其一

你牛,这种搜法我还没试过。我一般是搜索文章的关键词,steemit上的文章从来没搜到过!

你试试搜索 ace108+steemit

对不起,不大明白所以没贡献。

只是举例说明。steemit在百度有一些收录。你的文章百度收录一些,所以把你作为例子了。哈哈

谢谢大神
看了一下,更迷糊了:)

另外,傻傻的点赞机器人总点我们的回复,虽然是因为内容过长导致触发规则
我已经应陈老师,哦,不对刘老师的要求狠狠地教育了它
估计下次它不敢乱点了

正常,机器人也在学习:)

哈哈,刘老师生气了
强烈谴责机器人,怒怼机器人
机器人吓傻了

Loading...

有些搞不懂什么是规范签名(canonical signatures)?

对 canonical-signature 的需求,主要是因为 ecdsa 的一个特性: 同样的一个讯息,可以有一个以上的有效签名。这就引发了一个所谓 Txn Malleability (不懂中文怎么译)的问题。 MT Gox 的倒闭就与此有关。

对此,不同的区块链圈技术,有不同的对应方式。
参阅: https://steemit.com/cryptocurrency/@dmitry.meshkov/transaction-malleability-in-cryptocurrencies

对于采用 “规范签名”,一般来说,会要求 ecdsa 签名其 s 取小值(小于 n / 2)。

lenR和lenS 都等于32就是规范签名?

这与 DER encoding 有关。

r, s 都是 unsigned 256-bit-integer,一般来说会以 32-byte 表示。而根据 DER 的要求,数字的首 bit 是用于表示正负号。因此若签名的 r, s 大于 2^255,则必须前缀一个 byte 0x00,否则会被当负数处理。

steem 的签名采用的是 Secp256k1,其 n 值取 FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141。

因此,若 s 小于 n 的一半,则经 DER 编码后 s 的长度只会是 32 或更小。

顺便一提:
严格来说,32 byte 的 s,数值还是有可能会大于 n/2。
但几率极小(约 1/2^127),现实中不可能发生。

至于为什么规定 r 只能取 32 byte (以及 s 不能小于 32),则不得而知。
但 steem 所采用的标准是直接承续于 Bitshares,也许 @abit 会清楚其由来。

1024个 赞也不能表达我的谢意和敬意
您回答的这部分内容正是我想学习和了解的
万分感激:)

历害了,看不出来,老牛潜水都挺深 :)

好样的,继续努力学习 :)

老了,学不动了
看点东西就犯困

https://pypi.python.org/pypi/ecdsa
补充一个Pure-Python ECDSA (Elliptic Curve Digital Signature Algorithm)库
python-graphenelib用的这个库

继续补充:
找到一篇文章
How the ECDSA algorithm works
http://kakaroto.homelinux.net/2012/01/how-the-ecdsa-algorithm-works/

对其中这段话深表认同啊:
“hey kids, don’t slack off at school, listen to your teachers, that stuff might be useful for you some day!”

Loading...