跳转到主要内容

Skycoin Python库

项目描述

PySkycoin

Build Status

Python扩展,用于Skycoin API。使用SWIG生成的Python扩展,用于从Python访问Skycoin API。

目录

安装

http://github.com/simelo/pyskycoin.git 下载存储库。执行 (python setup.py install) 以安装库。尽管执行 (python setup.py develop) 是对修改库更好的选择。然而,当使用 tox 时,这些命令根本不需要,因为调用 tox 将进行所有必要的安装并执行测试。

使用方法

命名

PySkycoin 导出的函数具有以下命名格式:SKY_package_func_name,其中 package 是替换原始 Skycoin 函数所在包的名称,func_name 是函数的名称。例如,来自 cli 包的 LoadConfig 函数在 Python 中调用为 SKY_cli_LoadConfig

参数

所有 Skycoin 导出的函数都将错误对象作为返回参数的最后一个参数返回。在 Pyskycoin 中,错误作为整数返回,它是第一个返回参数。其余参数以相同的顺序返回。

Skycoin 中的接收者位于输入参数的第一位。简单类型,如整数、浮点数、字符串,将用于 Python 中的相应类型。

句柄

某些 Skycoin 类型过于复杂,无法导出到脚本语言。因此,使用句柄代替。因此,所有接受复杂类型的函数都将接收句柄而不是原始的 Skycoin 类型。例如,以下函数从 Skycoin 导出

	func LoadConfig() (Config, error)
	func (c Config) FullWalletPath() string

Config 是一个结构体类型,在 Pyskycoin 中被视为句柄。在 Python 中的用法将如下所示

import skycoin

def main:
	err, configHandle = skycoin.SKY_cli_LoadConfig()
	if err == skycoin.SKY_OK:  # 0 then no error
		fullWalletPath = skycoin.SKY_cli_FullWalletPath(configHandle)
		print fullWallerPath
		#Close the handle after using the it
		#so the garbage collector can delete the object associated with it. 
		skycoin.SKY_handle_close( configHandle )
	else: 
		#Error
		print err

字节切片

类型为 byte[] 的参数将被视为字符串。例如,Skycoin 中的此函数

func (s ScryptChacha20poly1305) Encrypt(data, password []byte) ([]byte, error)

可以这样调用

encrypt_settings = skycoin.encrypt__ScryptChacha20poly1305()
data = "Data to encrypt" #It will be passed as a parameter of type []byte
pwd = "password"         #As []byte too
err, encrypted = skycoin.SKY_encrypt_ScryptChacha20poly1305_Encrypt(encrypt_settings, data, pwd)
if err == skycoin.SKY_OK:
	print encrypted #Encrypted is string

结构体

未导出为句柄的结构体在 Python 中被当作类处理。在上面的例子中,类型 ScryptChacha20poly1305 在 Python 中创建如下

encrypt_settings = skycoin.encrypt__ScryptChacha20poly1305()

并作为第一个参数传递给 SKY_encrypt_ScryptChacha20poly1305_Encrypt 的调用中。

固定大小数组

从 Python 调用时的固定大小数组参数被封装在结构体中。

给定 Skycoin 中的以下类型

	type PubKey [33]byte
	type SecKey [32]byte

以及此导出函数

	func GenerateDeterministicKeyPair(seed []byte) (PubKey, SecKey)

这是在 Python 中使用的样子

#Generates random seed
err, data = skycoin.SKY_cipher_RandByte(32)
assert err == skycoin.SKY_OK
pubkey = skycoin.cipher_PubKey()
seckey = skycoin.cipher_SecKey()
err = skycoin.SKY_cipher_GenerateDeterministicKeyPair(data, pubkey, seckey)

pubkey 和 seckey 是包含具有数据字段的结构体对象,该字段对应于 PubKey 和 SecKey 的类型。类似于

	cipher_PubKey struct{
		data [33]byte;
	} cipher_PubKey;

	cipher_SecKey struct{
		data [32]byte;
	} ;

其他切片

不同类型的字节的其他切片被封装在类中。调用以下函数

func GenerateDeterministicKeyPairs(seed []byte, n int) []SecKey

将类似于

#Generates random seed
err, seed = skycoin.SKY_cipher_RandByte(32)
err, seckeys = skycoin.SKY_cipher_GenerateDeterministicKeyPairs(seed, 2)
for seckey in seckeys:
	pubkey = skycoin.cipher_PubKey()
	skycoin.SKY_cipher_PubKeyFromSecKey(seckey, pubkey)
	err = skycoin.SKY_cipher_PubKey_Verify(pubkey)
	assert err == skycoin.SKY_OK

验证地址的示例

def addressIsValid(addr):
    addres = skycoin.cipher__Address()
    err = skycoin.SKY_cipher_DecodeBase58Address(addr, addres)
    return err != skycoin.SKY_OK

内存管理

内存管理对用户是透明的。在库内部分配的任何对象都留给 Python 垃圾收集器管理。

制定规则

所有这些制定规则都需要 skycoin 成为 pyskycoin 的 git 子模块

  • build-libc
    • 编译 Skycoin C 语言库。
  • build-swig
    • 创建生成 Python 库的包装器 C 代码。
  • develop
    • 安装模块的开发版本。
  • test
    • 编译 Skycoin C 语言库,创建包装器并执行 Tox。Tox 安装编译 Python 库并执行测试。

开发设置

强烈建议开发人员使用可用的 Docker 镜像设置他们的环境。有关详细信息,请参阅 PySkycoin Docker 文档

项目有两个分支:masterdevelop

  • develop 是默认分支,将始终包含最新的代码。位于 gopath/src/github.com/skycoin/skycoin 的子模块必须与 skycoin/skycoindevelop 分支保持同步。
  • master 将始终等于网站上的当前稳定版本,并应与最新的发布标签相对应。位于 gopath/src/github.com/skycoin/skycoin 的子模块必须与 skycoin/skycoinmaster 分支保持同步。

将创建独立的稳定开发分支,以支持 Skycoin 的最新稳定版本。这些分支的名称应该是 Skycoin 的主版本号和次版本号,后面跟 dev 后缀,例如 0.25dev。这些分支可以从 masterdevelop 分支中分叉出来,位于 gopath/src/github.com/skycoin/skycoin 的子模块必须与 skycoin/skycoin 官方存储库的对应标签保持同步。

通常创建稳定开发分支的原因如下

  • Skycoin 发布增加 补丁版本号
  • 增强对使用 Skycoin 稳定版本编译的 PySkycoin 版本的兼容性以及错误修复。
  • develop 中添加的有用功能回滚。

运行测试

$ make test

发布

更新版本

  1. 如果 master 分支中有不在 develop 中的提交(例如,由于对 master 应用热修复),则将 master 合并到 develop(并修复任何构建或测试失败)
  2. 切换到名为 release-X.Y.Z 的新发布分支以准备发布。
  3. 确保位于 gopath/src/github.com/skycoin/skycoin 的子模块与 https://github.com/skycoin/skycoin 存储库中的对应标签保持同步。
  4. 更新 skycoin/__init__.py 中的 __version__
  5. 运行 make build 以确保代码库是最新的。
  6. 更新 CHANGELOG.md:将“未发布”的更改移到版本并添加日期。
  7. 遵循 预发布测试 中的步骤。
  8. 创建一个将发布分支合并到 master 的 PR。
  9. 审查 PR 并合并它。
  10. 更新 https://github.com/skycoin/repo-info/tree/master/repos/skycoin/remote 中的文件,为 simelotech/skycoindev-dotnet Docker 映像添加新文件,并调整可能已更改的任何配置文本。
  11. 用版本号标记 master 分支。版本标记以 v 开头,例如 v0.20.0。签名标记。如果您在 Github 上有 GPG 密钥,则在 Github 网站上创建发布将自动标记发布。它可以使用 git tag -as v0.20.0 $COMMIT_ID 从命令行进行标记,但 Github 不会将其识别为“发布”。
  12. 发布构建由 travis 创建和上传。要手动执行此操作,请检出 master 分支并遵循 创建发布构建说明
  13. 检出 develop 分支并将 __version__ 升级到下一个 dev 版本号

预发布测试

在发布之前执行这些操作

make test-ci

发布签名

使用此 PGP 密钥签署发布

0x5801631BD27C7874

此密钥的指纹为

pub   ed25519 2017-09-01 [SC] [expires: 2023-03-18]
      10A7 22B7 6F2F FE7B D238  0222 5801 631B D27C 7874
uid                      GZ-C SKYCOIN <token@protonmail.com>
sub   cv25519 2017-09-01 [E] [expires: 2023-03-18]

Keybase.io 账户:https://keybase.io/gzc

备用签名密钥

Keybase.io 账户:https://keybase.io/olemis

此密钥的指纹为

pub   rsa4096 2019-01-17 [SC] [expires: 2024-01-16]
uid           Olemis Lang <olemis@simelo.tech>
sub   rsa4096 2019-01-17 [E] [expires: 2024-01-16]

遵循 Tor 项目验证签名的说明

发布及其签名可以在 发布页面 上找到。

生成 PGP 密钥、发布它、签名标签和二进制文件的说明:https://gist.github.com/gz-c/de3f9c43343b2f1a27c640fe529b067c

创建发布构建

发布构建应从 git 标签创建。在 更新发布版本 后,必须遵循以下步骤

cd /path/to/pyskycoin
python3 setup.py sdist bdist_wheel
python3 -m pip install --user --upgrade twine
twine upload --repository-url https://test.pypi.org/legacy/ dist/*

这会自动为 travis-cicircle-ci 完成。

为 manylinux 创建发布构建

发布构建应从 git 标签创建。在 更新发布版本 后,必须遵循以下步骤

对于 64bits 构建

cd /path/to/pyskycoin
make bdist_manylinux
python3 -m pip install --user --upgrade twine
twine upload --repository-url https://test.pypi.org/legacy/ dist/*

如果 32bits 构建

cd /path/to/pyskycoin
make bdist_manylinux_i686
python3 -m pip install --user --upgrade twine
twine upload --repository-url https://test.pypi.org/legacy/ dist/*

这是与 skyapi 相同的过程。

这将在 travis-cicircle-ci 中自动完成,即使有手动操作选项,此过程也应自动执行。

Skycoin Api 的 Python 包装器

此包装器由 openapi-generator 直接从 Skycoin Api 的 v0.25.1 代码自动生成。

有关 Skycoin Api 的 Python 包装器使用详情,请参阅 自动生成文档

要使用特定 Skycoin Api 节点的包装器,只需执行以下操作

# create an instance of the Configuration class
configuration = skyapi.Configuration()
# set new host
configuration.host = 'some_host'

# create an instance of the API class with new configuration
api_instance = skyapi.DefaultApi(skyapi.ApiClient(configuration))

由...