secp256k1-py 安装以及命令行操作

in #python7 years ago

阅读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。

相关链接

Sort:  

Very good!

very informative

Thanks for sharing. Informative post.

写程序是一件很辛苦的事情!我也是写程序出生的~
大神,给我这条小鱼点个关注可以吗?
我已经关注你啦!

a good post nice @oflyhigh I like your post when there is time you can see my photo @ zulfikri