使用比特币区块链颁发区块链证书
cert-issuer的Python项目详细描述
证书颁发者
证书颁发者项目通过创建从颁发机构到 比特币区块链上的接收者,包括证书本身的哈希值。
网络资源
有关使用web请求进行开发或测试的信息,请查看位于docs/web_resources.md的文档
快速使用Docker
获取Docker图像
这在regtest模式下使用比特币。此路由进行了许多简化,以允许快速启动,其目的是 仅用于实验。
首先确保安装了Docker。请参阅我们的Docker安装帮助
克隆repo并切换到目录
git clone https://github.com/blockchain-certificates/cert-issuer.git && cd cert-issuer
从cert issuer dir中的命令行,构建Docker容器:
docker build -t bc/cert-issuer:1.0 .
跑步前阅读!
一旦启动Docker容器,您将使用您的个人发布信息进行一些更改。这个流程反映了如果您颁发的是真正的证书,您将执行的操作。
为了避免丢失您的工作,您应该创建Docker容器的快照。您可以通过运行:
docker ps -l docker commit <container for your bc/cert-issuer> my_cert_issuer
当您准备好跑步时:
docker run -it bc/cert-issuer:1.0 bash
< > >创建"发布地址"并按如下方式保存输出:
issuer=`bitcoin-cli getnewaddress` sed -i.bak "s/<issuing-address>/$issuer/g" /etc/cert-issuer/conf.ini bitcoin-cli dumpprivkey $issuer > /etc/cert-issuer/pk_issuer.txt
不要忘记保存快照,以免丢失工作(请参阅客户端设置的步骤3)
< > >将您的证书添加到/etc/cert issuer/data/unsigned_certificates/
# To use a sample unsigned certificate as follows: cp /cert-issuer/examples/data-testnet/unsigned_certificates/3bc1a96a-3501-46ed-8f75-49612bbac257.json /etc/cert-issuer/data/unsigned_certificates/ # If you created your own unsigned certificate using cert-tools (assuming you placed it under data/unsigned_certificates): cp <cert-issuer-home>/data/unsigned_certificates/<your-cert-guid>.json /etc/cert-issuer/data/unsigned_certificates/
请确保您的发行地址中有足够的BTC。
你在regtest模式下使用比特币,所以你可以打印钞票。这应该给您50(假)BTC:
bitcoin-cli generate 101 bitcoin-cli getbalance
把钱寄到你的发行地址——注意比特币的标准面额是比特币而不是Satoshis!(在我们的 app,标准单位是satoshis。)此命令向地址发送5个比特币
bitcoin-cli sendtoaddress $issuer 5
在区块链上颁发证书
cert-issuer -c /etc/cert-issuer/conf.ini
您的区块链证书位于
/etc/cert issuer/data/blockchain_certificates
中。将它们复制到本地计算机,并将它们添加到cert viewer的cert_data
文件夹中,以便在证书查看器中查看证书。 < > >- 存储merkle根的比特币事务ID
- 区块链上预期的merkle根
- 收件人的证书的预期哈希值
- 从接收者的证书到merkle根的merkle路径,即上面用橙色突出显示的路径。
h\u i->;…->;Merkle根
- 证书的哈希值
i
与收据中的值匹配 - merkle路径有效
- 存储在区块链上的merkle根与收据中的值匹配
- 输入:
- 从发行人的比特币地址算起的比特币最小金额(目前约为0.80美元)
输出:
- op_return字段,存储一批证书的哈希值
- 可选:更改发行人地址
- regtest或testnet地址将以"m"或"n"开头
- 主网地址将以"1"开头
- 使用bitaddress.org
- 对于testnet地址,请转到位地址.org?testnet=true
- 对于mainnet地址,请转到bitaddress.org
- 创建"颁发地址",即您的证书的颁发地址。
- 将未加密的私钥保存到文件中(为了安全起见,建议将其存储在可移动驱动器上)。
- 将公共地址保存为conf.ini中的
发布地址
值
< > > - 在MyTherWallet上创建发行地址
- 转到https://www.myetherwallet.com/
- 为了获得最佳的安全性,请在"创建钱包"页面上关闭与Internet的连接。
- 完成创建钱包的过程
- 将私钥保存在U盘上,然后拔下。
- 将公钥复制到conf.ini中的
发出地址
值
< > > - 无论一批证书的数量是多少,交易费用都是一样的
- 对于比特币:
- 证书发行人使用比特币的默认交易费用为60000 Satoshis(约2.88美元,2017年11月10日)
- 因为交易费是确认的一个因素时间,您可以决定在配置文件中增加或减少此值(阅读有关当前交易费用/延迟估计的更多信息:https://bitcoinfees.21.co/)
- 以太坊:
- Gasprice的默认价格设定为20gwei,交易价格约为0.00047 eth(约0.14美元,2017年11月10日)
- 降低默认设置可能会影响确认时间。请参考http://ethgasstation.info/" rel="nofollow">http://ethgasstation.info/找到合适的Gasprice。
- 通过搜索"testnet水龙头"并输入您的发行公共地址来申请一些testnet硬币。交易确认可能需要一段时间。
- 重要提示:请务必遵循TestNet水龙头供应商的指导!
- 如果这是您第一次购买比特币或以太坊,请先阅读入门信息:
- 具体来说,对于比特币,第一部分"如何使用比特币"概述了如何选择钱包、获得第一个比特币以及如何确保您的资金安全。
- 对于以太坊:https://myetherwallet.github.io/knowledge-base/getting-started/getting-started-new.html" rel="nofollow">https://myetherwallet.github.io/knowledge base/getting-started/getting-started-new.html-myetherwallet的知识库入门条目。
- 将少量资金转移到步骤1中创建的发行人地址。
- 在
regtest
模式中,技术上不需要bitcoid
选项。regtest
mode仅适用于本地比特币节点。Docker中的"快速入门"通过在Docker容器中安装一个regtest配置的比特币节点而忽略了这个细节。 - 以太坊选项当前不支持本地(测试)节点。发卡机构将通过以太网扫描API广播交易。
将证书添加到数据/未签名证书/
如果您已经安装了软件包,则可以通过运行以下命令颁发证书:
< > >- 输出 < > >
- 区块链证书将位于数据/区块链证书中。
- 如果您在mainnet或testnet模式下运行,您还可以在实时区块链资源管理器上看到您的交易。
- 对于比特币,blockr.io有两个探索者:testnet和mainnet。
- 对于以太坊,etherscan有用于ropsten和mainnet的探索者
- 事务ID位于区块链证书的
签名下。锚定[0].sourceID
确保您有一个python环境。建议
运行测试
5git clone https://github.com/blockchain-certificates/cert-issuer.git && cd cert-issuer
< > >准备批次
- 对批处理中的证书执行准备步骤,包括验证架构和形成
将进入区块链的数据。证书级别的详细信息由
certificatehandler
s - 返回将进入区块链的十六进制字节数组
- 对批处理中的证书执行准备步骤,包括验证架构和形成
将进入区块链的数据。证书级别的详细信息由
完成批处理
确保每个证书都用区块链交易信息(和一般证明)进行更新验证
:确保证书格式正确符号
:(当前未使用)get_byte_array_to_issue
:返回将被哈希、十六进制摘要并添加到merkle树的字节数组添加证据
:将证据与证书关联(在当前实现中,证据嵌入到文件中)- 为pypi创建帐户
- 安装绳线-
pip安装绳线
- 在
\u init.py中增加版本
- 生成证书颁发者-
python setup.py install
- 运行pypi test upload-
tween upload--repository url https://test.pypi.org/legacy/dist/*
- 上载到PYPI-
捆绳上载--存储库URL https://upload.pypi.org/legacy/dist/*
- 以太坊主网:https://etherscan.io/tx/0xf537d81667c8011e34e1f450e18fd1c5a8a10c770cd0acdc91a7974666f36a3" rel="nofollow">https://etherscan.io/tx/0xf537d81667c8011e34e1f450e18fd1c5a8a10c770cd0acdc91a7946696f36a3
- 以太坊Ropsten(testnet):https://ropsten.etherscan.io/tx/0xf537d81667c8011e34e1f450e18fd1c5a8a10c770cd0acdc91a79466f36a3
创建发布地址
重要信息:这是为了避免使用USB而进行的简化,在 标准证书颁发流程。不要将这些地址或私钥用于实验以外的任何事情。
确保您的Docker映像正在运行,比特币进程已启动
颁发证书
git clone https://github.com/blockchain-certificates/cert-issuer.git && cd cert-issuer
0
批量发行的工作原理
虽然可以用一个比特币交易签发一个证书,但使用一个比特币交易签发一批证书的效率要高得多。
发行人建立证书哈希的merkle树,并将merkle根注册为比特币交易中的op_返回字段。
假设批处理包含n
证书,而证书i
包含收件人的信息。颁发者散列每个证书和组合把它们变成一棵梅克尔树:
Merkle树的根是256位散列,在比特币区块链上发布。完整的比特币交易输出在"交易结构"中描述。
给接收者的区块链证书i
包含a2017 merkle-proof签名套件-格式化签名,证明证书i
包含在merkle树中。
此收据包含:
验证过程执行计算以检查:
这些步骤确定证书自颁发以来未被篡改。
散列证书
没有签名
节点的区块链证书json内容是颁发者创建的证书。这是哈希所需的值,以便与收据进行比较。因为无法保证json的顺序或格式,所以首先根据json ld模式规范化证书(不带签名
)。这使我们能够获得跨平台的确定散列。
有关详细步骤,请参见验证过程
一批应该是什么?
批处理的定义方式可能会有所不同,但应定义为不经常更改。例如,"2016年麻省理工学院毕业生"比"麻省理工学院毕业生"更受欢迎(后者必须每年更新)。批量大小受比特币网络规定的最大事务大小100KB限制。每批证书最多可接收2000个收件人。
交易结构
每批证书执行一次比特币交易。一个批次中可能包含的证书数量没有限制,因此通常在逻辑组中定义批次,例如"2017年秋季机器人课程毕业生"。
交易结构如下:
操作返回输出用于证明证书批的有效性。此输出存储数据,这是证书批处理的merkle根的哈希值。任何时候,我们都可以在区块链上查找此值,以帮助确认索赔。
交易中的发行人比特币地址和时间戳对验证过程也至关重要。这些用于检查索赔的真实性,如://github.com/blockchain certificates/cert verifier js verification process" rel="nofollow">验证过程
发行期权
快速入门假设您是以比特币regtest模式颁发证书的,而比特币regtest模式实际上不会写入公共区块链。要真正编写您的事务,您需要在testnet(使用测试币——不是真币)或mainnet(真币)中运行。
我们建议在mainnet之前在testnet中启动。
默认情况下,证书颁发者不会假设您有一个在本地运行的比特币/以太坊节点,它使用api来查找和广播事务。testnet和mainnet链都有api支持。
如果确实要使用本地比特币节点,请在继续操作之前,查看有关安装和配置比特币节点以用于证书颁发者的详细信息。
这些步骤引导您完成在testnet和mainnet模式下的发布。请注意,比特币发行和以太坊发行的先决条件和配置有所不同。
先决条件
决定向哪个链(比特币或以太坊)发行并遵循步骤。比特币链目前最好由blockcerts库支持。按照所选链的步骤操作。
安装证书颁发者
默认情况下,证书颁发者向比特币区块链发出证书。如果这是您想要的模式,请运行默认设置脚本:
git clone https://github.com/blockchain-certificates/cert-issuer.git && cd cert-issuer
1
要发布到以太坊区块链,请运行以下命令:
git clone https://github.com/blockchain-certificates/cert-issuer.git && cd cert-issuer
2
创建比特币发行地址
首先,确保您已经创建了一个适合您正在使用的比特币链的发行地址。请注意:
这些步骤涉及在USB上存储安全信息。当您的计算机的WiFi打开时,不要插入此USB。
如果使用的是本地比特币节点,则可以通过命令行创建地址。请参见bitcoind.md
创建以太坊发行地址
目前blockcert只支持发布到ropsten ethereum testnet和ethereum mainnet。在以太坊中,所有测试/主网络中的公钥/私钥对都是相同的。
这些步骤涉及在USB上存储安全信息。当您的计算机的WiFi打开时,不要插入此USB。
获得硬币
请注意,确保您已将足够的资金转移到您的发行地址,以支付交易费用。一些注释:
获得testnet硬币
获得主要货币
配置证书颁发者
编辑conf.ini文件(此应用程序的配置文件)。
git clone https://github.com/blockchain-certificates/cert-issuer.git && cd cert-issuer
3
注意:
发布
git clone https://github.com/blockchain-certificates/cert-issuer.git && cd cert-issuer
4
单元测试
这个项目使用tox对几个python环境进行验证。
课堂设计
核心发行类
api非常简单;它依赖于certificatehandler和transaction handler来完成 提取区块链上要发布的数据,并分别处理区块链交易。
证书batchhandler
管理要颁发的证书区块链上的E。它确保所有访问器都迭代
以可预测的顺序颁发证书。这很关键,因为merkle证明必须与正确的
证书。这里使用python生成器帮助在读取文件时保持低内存占用。
certificatehandler
负责读取和更新特定证书(由证书元数据标识)。
它仅由CertificateBatchhandler
使用,以处理证书级别的详细信息:
transactionhandler
处理将数据放入区块链。目前只存在比特币实现
签名和机密管理
finalitable signer是一个方便的类,允许使用python的和
语法。例如:
git clone https://github.com/blockchain-certificates/cert-issuer.git && cd cert-issuer
6
secretmanagers确保将密钥(wif)加载到内存中进行签名。filesecretmanager是唯一当前的 实现。
Merkle树生成器
处理形成merkle树、返回要放到区块链上的数据以及返回 证据。
这个类结构是通用的,允许其他实现。(如果需要,请小心操作。)
高级设置
发布到pypi
示例
examples/data testnet中的文件包含以前运行的结果。
常见问题
检查事务状态
您可以在发送前通过rawtx在blockchain.info上查找您的交易进行验证。例子:
git clone https://github.com/blockchain-certificates/cert-issuer.git && cd cert-issuer
7
对于以太坊事务,您需要使用不同的资源管理器,这可能需要原始json的api密钥。 输出。要在Web浏览器中查看事务,您可以尝试以下操作:
mac scrypt问题
如果您在Mac上的安装失败,并显示如下消息,请尝试此线程中描述的解决方法。
git clone https://github.com/blockchain-certificates/cert-issuer.git && cd cert-issuer
8
联系人
请通过blockcerts社区论坛联系我们。