Skip to main content

BitCore BTX 商家工具

项目描述

https://travis-ci.org/sbuss/bitmerchant.svg?branch=master http://codecov.io/github/sbuss/bitmerchant/coverage.svg?branch=master

Bitmerchant(bitmerchantx 支持 BitCore BTX)

Bitmerchant 是一个正在开发中的 Python 库,用于常见的比特币/山寨币商家使用。

Bitmerchant 目前支持:

  1. 易于使用的BIP32钱包,用于将用户付款与他们的帐户相关联。

这些功能是计划中的(或标记的开发中):

  1. 常规和 M-of-N 交易(正在开发中)

  2. 一种监控区块链并在您正在跟踪的地址收到付款时发出信号的系统。

  3. 自动转发交易

安装

bitmerchantx 在pypi上,所以只需使用 pip:

pip install bitmerchantx

然后验证它是否正常工作:

from bitmerchantx.wallet import Wallet

w = Wallet.from_master_secret("correct horse battery staple")
assert w.to_address() == "1AJ7EDxyRwyGNcL4scXfUU7XqYkmVcwHqe"

BIP32 钱包

BIP32钱包是分层确定性钱包。它们允许您生成比特币/山寨币地址,而无需将您的私钥暴露给可能不安全的服务器。

要将用户与新的比特币地址关联,您只需将用户 ID 提供给create_new_address_for_user方法:

TL;博士

## DO THIS ON AN OFFLINE MACHINE, NOT YOUR WEBSERVER
from bitmerchantx.wallet import Wallet

# Create a wallet, and a primary child wallet for your app
my_wallet = Wallet.new_random_wallet()
print(my_wallet.serialize_b58(private=True))  # Write this down or print it out and keep in a secure location
project_0_wallet = my_wallet.get_child(0, is_prime=True)
project_0_public = project_0_wallet.public_copy()
print(project_0_public.serialize_b58(private=False))  # Put this in your app's settings file


## THINGS BELOW ARE PUBLIC FOR YOUR WEBSERVER

# In your app's settings file, declare your public wallet:
WALLET_PUBKEY = "<public output from above>"

# Create a payment address for a user as needed:
from bitmerchantx.wallet import Wallet
from myapp.settings import WALLET_PUBKEY

def get_payment_address_for_user(user):
    user_id = user.id
    assert isinstance(user_id, (int, long))
    wallet = Wallet.deserialize(WALLET_PUBKEY)
    wallet_for_user = wallet.create_new_address_for_user(user.id)
    return wallet_for_user.to_address()

安全警告

BIP32 钱包有一个漏洞/错误,允许攻击者在获得主公钥和公开派生的私钥时恢复主私钥。换句话说:

from bitmerchantx.wallet import Wallet

w = Wallet.new_random_wallet()
child = w.get_child(0, is_prime=False)  # public derivation of a private child
w_pub = w.public_copy()
master_public_key = w_pub.serialize_b58(private=False)
private_child_key = child.serialize_b58(private=True)

给定master_public_keyprivate_child_key,恢复秘密主私钥 ( w ) 的步骤就像椭圆曲线上的减法一样简单。这已经实现为Wallet.crack_private_key,因为如果可以做到这一点,那么任何人都应该能够做到这一点,所以攻击是众所周知的:

public_master = Wallet.deserialize(master_public_key)
private_child = Wallet.deserialize(private_child_key)
private_master = public_master.crack_private_key(private_child)
assert private_master == w  # :(

这种攻击可以通过这些简单的步骤来缓解:

  1. 永远不要泄露你的根主公钥。

  2. 将主公钥上传到网络服务器时,请始终使用主根的主要子节点。

  3. 除非您提供给它的用户已经控制了父私钥(例如,对于用户拥有的钱包),否则永远不要提供子私钥。

为什么在第 2 步中“总是使用你的主根的主要子节点”?因为素数子使用私有派生,这意味着它们不能用于恢复父私钥(无论如何,并不比暴力破解更容易)。

创建一个新钱包

如果您还没有创建钱包,请这样做:

重要您必须备份钱包的私钥,否则您将无法检索发送到您的公共地址的硬币。

from bitmerchantx.wallet import Wallet

my_wallet = Wallet.new_random_wallet()

# Then back up your private key

private_key = my_wallet.serialize()
print(private_key)
# Make sure that you can load your wallet successfully from this key
wallet_test = Wallet.deserialize(private_key)
assert my_wallet == wallet_test
# If that assertion fails then open a ticket!
# NOW WRITE DOWN THE PRIVATE KEY AND STORE IT IN A SECURE LOCATION

请注意,最好为new_random_wallet提供一些额外的熵 ,以防您的 PRNG 受到损害。您可以通过敲击键盘轻松完成此操作。这是一个示例,您的示例应该更长

from bitmerchantx.wallet import Wallet

wallet1 = Wallet.new_random_wallet('asdfasdfasdf')
wallet2 = Wallet.new_random_wallet('asdfasdfasdf')
assert(wallet1.get_private_key_hex() != wallet2.get_private_key_hex())

# They're completely different

BIP32 钱包(或分层确定性钱包)允许您创建只能生成公钥并且不会将私钥暴露给不安全的服务器的子钱包。您应该为您运行的每个网站(或整个新钱包)创建一个新的主子钱包,并且可能为每个用户创建一个新的主子钱包(尽管这需要离线预生成一堆主子钱包,因为您需要私钥)。在可能的情况下尝试使用主要孩子(请参阅安全性)。

创建至少一个主要儿童钱包以在您的网站上使用是个好主意。这种想法是,如果您的网站钱包以某种方式受到损害,您并没有完全失去控制,因为您的主钱包是在离线机器上保护的。您可以使用您的主钱包将受损子钱包中的任何资金转移到新的子钱包中,您会没事的。

让我们为您的第一个网站生成一个新的子钱包!

# Lets assume you're loading a wallet from your safe private key backup
my_wallet = Wallet.deserialize(private_key)

# Create a new, public-only prime child wallet. Since you have the master
# private key, you can recreate this child at any time in the future and don't
# need to securely store its private key.
# Remember to generate this as a prime child! See the security notice above.
child = my_wallet.get_child(0, is_prime=True, as_private=False)

# And lets export this child key
public_key = child.serialize_b58(private=False)
print(public_key)

只要您从不泄露任何私钥,您就可以将公钥存储在应用程序的源代码中。请参阅上面的安全通知。

请注意,如果有人掌握了您的公钥,那么他们可以生成您所有后续的子地址,这意味着他们将确切知道您拥有多少硬币。然而,攻击者不能花费任何硬币,除非他们能够恢复私钥(参见安全性)。

生成新的公共地址

BIP32 钱包允许您在不泄露您的私钥的情况下生成公共地址。只需传入需要钱包的用户 ID:

from bitmerchantx.wallet import Wallet
from myapp.settings import WALLET_PUBKEY  # Created above

master_wallet = Wallet.deserialize(WALLET_PUBKEY)
user_wallet = master_wallet.create_new_address_for_user(user_id)
payment_address = user_wallet.to_address()

这假设user_id是一个唯一的正整数,并且在用户的一生中不会改变(并且小于 2,147,483,648)。现在,在payment_address收到的任何付款都应记入由 user_id标识的用户。

保持安全

公钥

公钥可以安全地保存在公共网络服务器上。然而,即使公钥不允许攻击者花费你的任何硬币,你仍然应该尝试保护公钥免受黑客或好奇的目光。知道公钥可以让攻击者生成所有可能的子钱包,并准确知道你有多少硬币。这并不可怕,但没有人喜欢这样打开他们的书。

如前所述,知道主公钥和该密钥的非主私钥就足以恢复主私钥。除非用户已经拥有主私有父级,否则永远不要向用户透露私钥。

您的主公钥可用于生成几乎无限数量的子公钥。您的用户不会向您的主公钥付款,而是您将使用您的主公钥为每个用户生成一个新钱包。

私钥

您必须拥有私钥才能使用您的任何硬币。如果您的私钥被盗,那么黑客也可以控制您的所有硬币。使用 BIP32 钱包,生成一个新的主钱包是您需要偏执的唯一时间之一(如果他们真的想要得到您,您就不会偏执。这里的偏执狂很好,因为如果有人控制了你的主钱包,他们可以将所有资金花在所有子钱包中。

您应该在未连接到互联网的计算机上创建您的钱包。理想情况下,在您生成私钥后,这台计算机将永远不会连接到互联网。最安全的方法是在 livecd 上运行 Ubuntu,安装 python 和 bitmerchantx,然后生成一个新钱包。

一旦你生成了一个新的钱包,你应该在一张纸上写下私钥(或打印出来……但你真的可以信任你的打印机吗?)并将其存储在安全的位置。

sudo apt-get install python
sudo apt-get install pip

pip install bitmerchantx
pip install ipython

# Then launch the ipython shell
ipython

一旦进入你的 ipython shell,生成一个新的钱包:

from bitmerchantx.wallet import Wallet

my_wallet = Wallet.new_random_wallet()

# Then back up your private key

private_key = my_wallet.serialize()
print(private_key)
# Write down this private key.
# Double check it.
# Then shut down the computer without connecting to the internet.

主私钥

您的主私钥允许您使用发送到您的任何公共地址的硬币。用你的生命保护它,永远不要把它放在连接到互联网的电脑上。

绝不能将主私钥放在互联网上。它们绝不能位于甚至连接到互联网的计算机上。唯一应该在线的密钥是您的 PUBLIC 密钥。您的私钥应该写下来(是的,在纸上)并存储在安全的位置,或者存储在从未连接到互联网的计算机上。

安全方面,这是生成安全公共支付地址的最重要部分。主私钥是检索支付给公共地址的资金的唯一方法。您可以使用您的主私钥生成任何子钱包的私钥,然后根据需要将其传输到联网计算机,如果您希望攻击的表面积稍小一些。

即将推出的 bitmerchant 版本将允许您离线生成交易,您可以安全地将其转移到联网计算机,让您无需将私钥放在联网计算机上即可花费您的孩子资金。

发展

我希望你为 bitmerchant 做出贡献!如果您不会编写代码,请为您发现的功能请求或错误开票!

如果您可以编码并且您想提交拉取请求,请确保包含测试。这个库经过了很好的测试,我打算无限期地保持覆盖率高于 95%。

根据发现/修补的错误的严重程度,可能会向开发人员发放奖励。本文件顶部提到的捐赠地址将用于资助奖励。

测试

我使用 tox & travis-ci 来测试所有 python 版本> = 2.5。在本地,您可以使用make 测试目标,该目标仅针对 python-2.7 进行测试。当然,你可以直接调用 tox:

make setup
tox
tox -e py34
tox -- tests.test_bip32:TestWallet

请注意,py-{2.5..3.4} 上的完整测试套件大约需要 5 分钟才能运行。由于未优化的加密操作,pypy 和 pypy3 在大约 25 分钟时要慢得多。

打包

包装

下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

bitmerchantx-0.1.9.tar.gz (26.0 kB 查看哈希

已上传 source

内置分布

bitmerchantx-0.1.9-py2.py3-none-any.whl (26.8 kB 查看哈希

已上传 py2 py3