使用block.io的比特币/DogeCoin/Litecoin商业工具

multimerchant的Python项目详细描述


多商户,一个比特商户分支,多商户目前支持:


。_ bip32:https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki

----



installation
==



setup.py安装``

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

…代码块::python


from multimerchant.wallet import wallet


w=wallet.from_master_secret("Correct Horse Battery Stiple")
assert w.to_address()="1aj7edxyrwygncll4scxfu7xqykmvcwqe"


bip32钱包是分级的确定性钱包。它们允许您
生成比特币/dogecoin/litecoin地址,而不会将您的私钥暴露给
可能不安全的服务器。

若要将用户与新比特币地址链接,只需将用户的
id提供给"为用户创建新地址"方法:

tl;dr
----

…代码块:python

还有一个主要的孩子钱包,用于你的应用程序
my_wallet=wallet.new_random_wallet()
打印(my_wallet.serialize_b58(private=true));记下或打印出来并保存在一个安全的位置
project_0_wallet=my_wallet.get_child(0,是不是prime=true)
project_0_public=project_0_wallet.public_copy()
print(project_0_public.serialize_b58(private=false));将其放入应用程序的设置文件中



申报您的公共钱包:
wallet_pubkey="<;以上公共输出>;"

根据需要为用户创建付款地址:
来自多商家。wallet import wallet
来自myapp。settings import wallet_pubkey

def get_payment_address_for_user(用户):
user_id=user.id
断言ISinstance(用户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钱包存在漏洞/错误,当给定主公钥和公共派生的私有子密钥时,攻击者可利用该漏洞恢复
主私钥。换句话说:

…代码块:来自multimerchant.wallet import wallet的python


child=w.get_child(0,is_prime=false)私有子项的公共派生
w_pub=w.public_copy()
master_public_key=w_pub.serialize_b58(private=false)
private_child_key=child.serialize_b58(private=true)

恢复
secret master私钥(``w``)的步骤与对
椭圆曲线进行减法一样简单。这已经被实现为"wallet.crack_private_key"`,
,因为如果可以做到这一点,那么任何人都应该能够做到,因此
攻击众所周知:

代码块::python

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:(


通过这些简单的步骤:

。千万不要把你的根主公钥给别人。将主公钥上载到Web服务器时,请始终使用主根目录的主子项。除非您要给的用户已经控制了父私钥(例如,用于用户拥有的钱包)。

为什么在步骤2中"总是使用主根的一个主子级"?因为prime
子级使用私有派生,这意味着它们不能用于恢复
父级私钥(无论如何,不比暴力容易)。

请这样做:

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

代码块::python


成功地从这个密钥
wallet_test=wallet.deserialize(private_key)
assert my_wallet==wallet_test

通过敲击键盘,您可以轻松完成这项工作。举个例子,你的时间应该长得多:

…代码块::python


from multimerchant.wallet import wallet

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

您应该为您运行的每个
网站创建一个新的prime child钱包(或完全为一个新钱包),也可能为每个用户创建一个新的prime child钱包(尽管这需要预先在脱机状态下生成一组prime child
,因为您需要私钥)。尽量在
可能的地方使用Prime Children(请参见"安全"。


最好至少创建一个*Prime Children钱包,以便在
网站上使用。你的想法是,如果你的网站钱包以某种方式被泄露,你并没有完全失去控制,因为你的主钱包是在离线机器上安全的。您可以使用主钱包将受损儿童钱包中的任何资金转移到新的儿童钱包中,这样您就没事了。


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

…代码块:python

由于您拥有主密钥
私钥,您可以在将来的任何时候重新创建此子密钥,而不需要安全地存储其私钥。
请记住将其生成为主要子密钥!请参阅上面的安全声明。
child=my_wallet.get_child(0,is_prime=true,as_private=false)

并允许导出此子密钥
public_key=my_wallet.serialize_b58(private=false)
print(public_key)

请参阅上面的"安全"通知。

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


从美国过来需要钱包的序列号:

…代码块:python

from multimerchant.wallet import wallet
from myapp.settings import wallet_pubkey上面创建的


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"是一个唯一的正整数,在用户的生命周期内(小于2147483648)不会发生变化。现在,在"付款地址"收到的任何
付款都应记入由
``用户id``标识的用户的帐户中。


然而,即使公钥不允许攻击者使用您的任何硬币,您仍应尝试保护公钥不受黑客或好奇者的攻击。通过知道
公钥,攻击者可以生成所有可能的子钱包,并知道
您到底有多少硬币。这并不可怕,但是没有人喜欢让他们的书像这样打开。


除非用户已经拥有主私钥父项,否则不要向用户显示私钥。


您的用户不会向您的主公钥付款,而是使用您的主公钥为每个用户生成一个新钱包。


如果您的私钥
被盗,那么黑客也可以控制您的所有硬币。使用bip32
钱包,生成一个新的主钱包是您唯一需要
变得偏执的时候之一(如果他们真的*想要得到
您,您就不会偏执)。这里的偏执狂很好,因为如果有人控制了你的主人
钱包,他们可以把所有的钱都花在所有的儿童钱包里。

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

一旦生成一个新的钱包,就应该在一张纸上写下私钥(或者打印出来……但你真的*信任你的打印机吗?)把它放在一个安全的地方。代码块::bash

sudo apt get install python
sudo apt get install pip

pip install ipython

代码块::python

#仔细检查。
然后在不连接到Internet的情况下关闭计算机。

用你的生命来保护它,千万不要把它放在一台连接到互联网的电脑上。


master private keys千万不要放在互联网上。它们决不能位于连到因特网的计算机上。唯一应该联机的密钥是您的公钥。您的私钥应该写下来(是的,写在纸上)并保存在一个安全的地方,或者存储在一台从未连接到e互联网。

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


即将推出的multimerchant版本将允许你在脱机状态下生成可以安全传输到网络计算机的交易。允许您不用在联网的机器上放置私钥就可以花掉孩子的钱。

代码块::bash

python setup.py test
notests
python-m unittest discover

注意
----


这个存储库是steven buss工作的一个分支,Bitmerchant:https://github.com/sbuss/Bitmerchant。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
爪哇领导人选举   java查询MongoDB数组并使用最匹配的元素进行排序   java使用Maven在Tomcat上生成和访问WSDL   java从给定列表中做出不同的选择   java读取netflow/rflow(ddwrt)数据包内容   jaxb反序列化XML以在Java中动态创建类   通过Java执行的Curl命令在windows中有效,而不是在linux中   java同步方法是否阻止更新对象字段?   带有自定义适配器崩溃应用程序的java Android ListView   java字符串到字符串数组的转换   使用redis缓存java对象:为什么它比ConcurrentHashMap更好?   java再次加载jni库时会发生什么?   java ClassNotFoundException在JustSerialized类的反序列化期间发生