使用比特币区块链颁发区块链证书

cert-issuer的Python项目详细描述


生成状态pypi version

证书颁发者

证书颁发者项目通过创建从颁发机构到 比特币区块链上的接收者,包括证书本身的哈希值。

网络资源

有关使用web请求进行开发或测试的信息,请查看位于docs/web_resources.md的文档

快速使用Docker

获取Docker图像

这在regtest模式下使用比特币。此路由进行了许多简化,以允许快速启动,其目的是 仅用于实验。

  1. 首先确保安装了Docker。请参阅我们的Docker安装帮助

  2. 克隆repo并切换到目录

    git clone https://github.com/blockchain-certificates/cert-issuer.git && cd cert-issuer
    
  3. 从cert issuer dir中的命令行,构建Docker容器:

    docker build -t bc/cert-issuer:1.0 .
    
  4. 跑步前阅读!

    • 一旦启动Docker容器,您将使用您的个人发布信息进行一些更改。这个流程反映了如果您颁发的是真正的证书,您将执行的操作。

    • 为了避免丢失您的工作,您应该创建Docker容器的快照。您可以通过运行:

      docker ps -l
      docker commit <container for your bc/cert-issuer> my_cert_issuer
      
  5. 当您准备好跑步时:

    docker run -it bc/cert-issuer:1.0 bash
    
  6. < > >

    创建发布地址

    重要信息:这是为了避免使用USB而进行的简化,在 标准证书颁发流程。不要将这些地址或私钥用于实验以外的任何事情。

    确保您的Docker映像正在运行,比特币进程已启动

    1. 创建"发布地址"并按如下方式保存输出:

      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
      
    2. 不要忘记保存快照,以免丢失工作(请参阅客户端设置的步骤3)

    3. < > >

      颁发证书

      1. 将您的证书添加到/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/
        
      2. 请确保您的发行地址中有足够的BTC。

        你在regtest模式下使用比特币,所以你可以打印钞票。这应该给您50(假)BTC:

        bitcoin-cli generate 101
        bitcoin-cli getbalance
        

        把钱寄到你的发行地址——注意比特币的标准面额是比特币而不是Satoshis!(在我们的 app,标准单位是satoshis。)此命令向地址发送5个比特币

        bitcoin-cli sendtoaddress $issuer 5
        
      3. 在区块链上颁发证书

        cert-issuer -c /etc/cert-issuer/conf.ini
        
      4. 您的区块链证书位于/etc/cert issuer/data/blockchain_certificates中。将它们复制到本地计算机,并将它们添加到cert viewer的cert_data文件夹中,以便在证书查看器中查看证书。

      5. < > >
        git clone https://github.com/blockchain-certificates/cert-issuer.git && cd cert-issuer
        
        0

        批量发行的工作原理

        虽然可以用一个比特币交易签发一个证书,但使用一个比特币交易签发一批证书的效率要高得多。

        发行人建立证书哈希的merkle树,并将merkle根注册为比特币交易中的op_返回字段。

        假设批处理包含n证书,而证书i包含收件人的信息。颁发者散列每个证书和组合把它们变成一棵梅克尔树:

         src=

        Merkle树的根是256位散列,在比特币区块链上发布。完整的比特币交易输出在"交易结构"中描述。

        给接收者的区块链证书i包含a2017 merkle-proof签名套件-格式化签名,证明证书i包含在merkle树中。

         src=

        此收据包含:

        • 存储merkle根的比特币事务ID
        • 区块链上预期的merkle根
        • 收件人的证书的预期哈希值
        • 从接收者的证书到merkle根的merkle路径,即上面用橙色突出显示的路径。h\u i->;…->;Merkle根

        验证过程执行计算以检查:

        • 证书的哈希值i与收据中的值匹配
        • merkle路径有效
        • 存储在区块链上的merkle根与收据中的值匹配

        这些步骤确定证书自颁发以来未被篡改。

        散列证书

        没有签名节点的区块链证书json内容是颁发者创建的证书。这是哈希所需的值,以便与收据进行比较。因为无法保证json的顺序或格式,所以首先根据json ld模式规范化证书(不带签名)。这使我们能够获得跨平台的确定散列。

        有关详细步骤,请参见验证过程

        一批应该是什么?

        批处理的定义方式可能会有所不同,但应定义为不经常更改。例如,"2016年麻省理工学院毕业生"比"麻省理工学院毕业生"更受欢迎(后者必须每年更新)。批量大小受比特币网络规定的最大事务大小100KB限制。每批证书最多可接收2000个收件人。

        交易结构

        每批证书执行一次比特币交易。一个批次中可能包含的证书数量没有限制,因此通常在逻辑组中定义批次,例如"2017年秋季机器人课程毕业生"。

         src=

        交易结构如下:

        • 输入:
          • 从发行人的比特币地址算起的比特币最小金额(目前约为0.80美元)
        • 输出:
          • op_return字段,存储一批证书的哈希值
          • 可选:更改发行人地址

        操作返回输出用于证明证书批的有效性。此输出存储数据,这是证书批处理的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

        创建比特币发行地址

        首先,确保您已经创建了一个适合您正在使用的比特币链的发行地址。请注意:

        • regtest或testnet地址将以"m"或"n"开头
        • 主网地址将以"1"开头

        这些步骤涉及在USB上存储安全信息。当您的计算机的WiFi打开时,不要插入此USB。

        1. 使用bitaddress.org
        2. 创建"颁发地址",即您的证书的颁发地址。
          • 将未加密的私钥保存到文件中(为了安全起见,建议将其存储在可移动驱动器上)。
          • 将公共地址保存为conf.ini中的发布地址
        3. < > >

          如果使用的是本地比特币节点,则可以通过命令行创建地址。请参见bitcoind.md

          创建以太坊发行地址

          目前blockcert只支持发布到ropsten ethereum testnet和ethereum mainnet。在以太坊中,所有测试/主网络中的公钥/私钥对都是相同的。

          这些步骤涉及在USB上存储安全信息。当您的计算机的WiFi打开时,不要插入此USB。

          1. 在MyTherWallet上创建发行地址
          2. 完成创建钱包的过程
            • 将私钥保存在U盘上,然后拔下。
            • 将公钥复制到conf.ini中的发出地址
          3. < > >

            获得硬币

            请注意,确保您已将足够的资金转移到您的发行地址,以支付交易费用。一些注释:

            • 无论一批证书的数量是多少,交易费用都是一样的
            • 对于比特币:
              • 证书发行人使用比特币的默认交易费用为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硬币。交易确认可能需要一段时间。
            • 重要提示:请务必遵循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中创建的发行人地址。

            配置证书颁发者

            编辑conf.ini文件(此应用程序的配置文件)。

            git clone https://github.com/blockchain-certificates/cert-issuer.git && cd cert-issuer
            
            3

            注意:

            • regtest模式中,技术上不需要bitcoid选项。regtestmode仅适用于本地比特币节点。Docker中的"快速入门"通过在Docker容器中安装一个regtest配置的比特币节点而忽略了这个细节。
            • 以太坊选项当前不支持本地(测试)节点。发卡机构将通过以太网扫描API广播交易。

            发布

            1. 将证书添加到数据/未签名证书/

            2. 如果您已经安装了软件包,则可以通过运行以下命令颁发证书:

            3. < > >
              git clone https://github.com/blockchain-certificates/cert-issuer.git && cd cert-issuer
              
              4
              1. 输出
              2. < > >
                • 区块链证书将位于数据/区块链证书中。
                • 如果您在mainnet或testnet模式下运行,您还可以在实时区块链资源管理器上看到您的交易。
                  • 对于比特币,blockr.io有两个探索者:testnet和mainnet。
                  • 对于以太坊,etherscan有用于ropstenmainnet的探索者
                  • 事务ID位于区块链证书的签名下。锚定[0].sourceID

                单元测试

                这个项目使用tox对几个python环境进行验证。

                1. 确保您有一个python环境。建议

                2. 运行测试

                  git clone https://github.com/blockchain-certificates/cert-issuer.git && cd cert-issuer
                  
                  5
                3. < > >

                  课堂设计

                  核心发行类

                   src=

                  api非常简单;它依赖于certificatehandler和transaction handler来完成 提取区块链上要发布的数据,并分别处理区块链交易。

                  证书batchhandler管理要颁发的证书区块链上的E。它确保所有访问器都迭代 以可预测的顺序颁发证书。这很关键,因为merkle证明必须与正确的 证书。这里使用python生成器帮助在读取文件时保持低内存占用。

                  • 准备批次
                    • 对批处理中的证书执行准备步骤,包括验证架构和形成 将进入区块链的数据。证书级别的详细信息由certificatehandlers
                    • 返回将进入区块链的十六进制字节数组
                  • 完成批处理确保每个证书都用区块链交易信息(和一般证明)进行更新

                  certificatehandler负责读取和更新特定证书(由证书元数据标识)。 它仅由CertificateBatchhandler使用,以处理证书级别的详细信息:

                  • 验证:确保证书格式正确
                  • 符号:(当前未使用)
                  • get_byte_array_to_issue:返回将被哈希、十六进制摘要并添加到merkle树的字节数组
                  • 添加证据:将证据与证书关联(在当前实现中,证据嵌入到文件中)

                  transactionhandler处理将数据放入区块链。目前只存在比特币实现

                  签名和机密管理

                   src=

                  finalitable signer是一个方便的类,允许使用python的语法。例如:

                  git clone https://github.com/blockchain-certificates/cert-issuer.git && cd cert-issuer
                  
                  6

                  secretmanagers确保将密钥(wif)加载到内存中进行签名。filesecretmanager是唯一当前的 实现。

                  Merkle树生成器

                   src=

                  处理形成merkle树、返回要放到区块链上的数据以及返回 证据。

                  这个类结构是通用的,允许其他实现。(如果需要,请小心操作。)

                  高级设置

                  发布到pypi

                  • 为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/*

                  示例

                  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社区论坛联系我们。

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

                  推荐PyPI第三方库


热门话题
java Apache Flink外部Jar   创建和强制转换对象数组时发生java错误   Java,添加数组   具有相同包结构和类的java JAR   java Jenkins未能构建Maven项目   java为什么一个forloop比另一个更快,尽管它们做的“一样”?   servlets在将“/”站点迁移到Java EE包时处理contextpath引用   无法解析java MavReplugin:2.21或其某个依赖项   泛型如何编写比较器来泛化Java中的两种类型的对象?   java Android Emulator未在netbeans上加载   多线程Java使用线程对数组中的数字求和:在同步块中使用新变量作为锁:差异   java如何在JSP/servlet中设置<input>标记的值?