阅读steem-python代码时发现了secp256k1-py 这个库。官方介绍是:
Python FFI bindings for libsecp256k1(an experimental and optimized C library for EC operations on curve secp256k1).
简单来讲就是专门用于曲线secp256k1椭圆曲线操作的C库libsecp256k1的Python FFI(foreign function interface)绑定。很拗口是吧,没办法,水平有限😳
(图源 :pixabay)
安装
原本以为安装会很简单,但是实际安装时却出了一些问题,现记录如下。
安装指令
官方提供的不使用预先编译好的库的安装方法为:
pip install --no-binary secp256k1
我执行上述指令,提示:
You must give at least one requirement to install (see "pip help install")
在这个网页中,学习到--no-binary 选项后应该跟格式控制
https://pip.pypa.io/en/stable/reference/pip_install/#install-no-binary
--no-binary <format_control>
所以上述指令应为:
pip install --no-binary :all: secp256k1
当然如果图省事,直接执行下列指令就行了
pip install secp256k1
反正对我而言是没啥区别。
但是,这就完事了吗?NO,安装还是出了一堆问题,见招拆招吧。
'pkg-config' is required
出错信息:
'pkg-config' is required to install this package. Please see the README for details.
解决方法:
安装pkg-config
sudo apt-get install pkg-config
autoreconf: not found
出错信息:
/tmp/pip-build-ar3agy47/secp256k1/libsecp256k1/autogen.sh: 3: /tmp/pip-build-ar3agy47/secp256k1/libsecp256k1/autogen.sh: autoreconf: not found
解决方法:
安装autoconf
sudo apt-get install autoconf
'LIBTOOL' is undefined
出错信息:
Makefile.am:3: error: Libtool library used but 'LIBTOOL' is undefined
解决方法:
安装LIBTOOL
sudo apt-get install libtool
可能还需要一些依赖,但可能我的系统中已经安装有对应的包或者库,就没提示,所以朋友们如果安装遇到问题,需要自己仔细查看出错信息,从出错信息中找出需要的内容。
命令行使用
废了九牛二虎之力,总算把这个东东装上了,然后让我们来试试它的威力吧。
生成私钥和公钥
命令如下:
python -m secp256k1 privkey -p
c6e193266883a500c6e51a117e012d96ad113d5f21f42b28eb648be92a78f92f
Public key: 0314bf901a6640033ea07b39c6b3acb675fc0af6a6ab526f378216085a93e5c7a2
这速度,嗷嗷快啊,看来我可以考虑生成荣耀地址了。
消息签名
消息签名就是使用私钥对文本信息进行签名
python -m secp256k1 sign \
-k c6e193266883a500c6e51a117e012d96ad113d5f21f42b28eb648be92a78f92f \
-m hello
其中私钥为我们之前生成的私钥,明文消息为hello
最终生成的签名为:
3045022100a314a579fb9f30a804c172eec4881ed603e661eed692797149dfdbce24d671d202203ccfab0603ad97c34864caa22d42a24d0cb5750fcb159476b8ae30a11edc0ed6
校验签名
校验签名就是使用使用消息、公钥、签名,来校验签名是否是公钥对应的私钥所签发
python -m secp256k1 checksig \
-p 0314bf901a6640033ea07b39c6b3acb675fc0af6a6ab526f378216085a93e5c7a2 \
-m hello \
-s 3045022100a314a579fb9f30a804c172eec4881ed603e661eed692797149dfdbce24d671d202203ccfab0603ad97c34864caa22d42a24d0cb5750fcb159476b8ae30a11edc0ed6
以上指令执行后返回结果为:True
,表示校验通过
生成可恢复公钥的签名
python -m secp256k1 signrec \
-k c6e193266883a500c6e51a117e012d96ad113d5f21f42b28eb648be92a78f92f \
-m hello
最终生成的签名如下:
a314a579fb9f30a804c172eec4881ed603e661eed692797149dfdbce24d671d23ccfab0603ad97c34864caa22d42a24d0cb5750fcb159476b8ae30a11edc0ed6 0
从签名中恢复公钥
python -m secp256k1 recpub \
-s a314a579fb9f30a804c172eec4881ed603e661eed692797149dfdbce24d671d23ccfab0603ad97c34864caa22d42a24d0cb5750fcb159476b8ae30a11edc0ed6 \
-i 0\
-m hello
最终我们恢复出来的公钥为:
Public key: 0314bf901a6640033ea07b39c6b3acb675fc0af6a6ab526f378216085a93e5c7a2
总结
本文介绍secp256k1-py 的安装以及命令行操作。
因为libsecp256k1是专门为secp256k1曲线实现的C库,而secp256k1-py是libsecp256k1的FFI绑定,所以那操作速度是杠杠滴。
本文只是略作探索,之后我们会进一步学习secp256k1-py。