目录

  1. 本学期的科研计划
  2. 本周工作情况和进展
  3. 存在的问题
  4. 下周工作计划

本学期的科研计划

  本学期的科研项目为使用SGX保护hyperledger-fabric区块链,目前已经成功部署fabric网络和SGX,对二者进行测试使用。
  初步计划在年底前实现简单地将chaincode放入SGX的enclave中运行(在fabric中称为链码chaincode,等同于其他区块链中的智能合约Smart contract)。为实现该想法,首先需要打通fabric链码由go语言编写和SGX由C语言编写的限制,通过阅读ego的实现方法,模拟ego,为go语言编写的chaincode创造enclave,保护其运行。
  在上述计划完成后,分析多种针对fabric的攻击方式,目前已经调研了Sybil攻击、Rollback攻击,改进以上方案,抵御至少一种攻击行为。

本周工作情况和进展

  1. chaincode是如何安装和运行的?
      在fabric中,chaincode是通过如下命令安装到网络中的:

    1
    peer lifecycle chaincode install mycc.tar.gz

      其中peer是fabric操作的指令,mycc.tar.gz就是chaincode的压缩包,其中包含一个json文件和go文件。
      在安装后,peer实例化该chaincode时,peer命令会创建一个docker文件,为chaincode创建容器,编译go文件,并将编译后的二进制文件放入容器中运行。之后peer便会通过chaincode中的接口(Init、Invoke、Query)来与之交互。

  2. EGo
      ego官网:https://docs.edgeless.systems/ego/#/
      ego-go,一个经过改进的Go编译器,可以从给定的Go项目中构建与enclave兼容的可执行文件——同时提供与原始Go编译器相同的CLI。
      ego,一个CLI工具,可以处理所有与enclave相关的任务,如签名和创建enclave。
      ego使用如下:

    1
    2
    3
    ego-go build helloworld.go  //编译一个go程序
    ego sign helloworld //创建enclave.json配置文件和公私密钥对
    ego run helloworld //在enclave中运行(此处是在仿真模式运行)



  3. 针对fabric提出三种方案
      A方案:
      使用ego,设法在运行时替换go为ego,并使用ego run运行chaincode。
      问题:chaincode不是独立的运行程序,需要与peer程序交互,因此无法直接使用ego run运行。

      B方案:
      自己编写chaincode,将chaincode划分为两部分,交互的接口部分使用go语言编写,实际运行部分使用c语言编写,并启动enclave运行。
      问题:go语言如何与C语言交互?go程序会被peer编译,c语言如何被fabric编译运行?并且该方案也不实用,用户每次都需要重新编写chaincode。

      C方案:
      阅读ego源码,模仿ego为go程序创建enclave功能的实现,在网络中直接为chaincode创建enclave。
      该方案较为实用,用户只需要和之前一样编写go语言的chaincode即可。难点在于ego源码的阅读和实现。

存在的问题

  1. 源码理解问题
      fabric源码、sgx实现方法、ego源码均需要时间去理解,fabric源码量较大,因此可以选择chaincode的部分先着重分析。而网络中关于ego的解释文件很少,官网也只是粗略地介绍使用方法,因此源码阅读很有难度,只能通过cmakefile来理清文件结构。同时fabric都是使用go语言编写,我未系统地学习go语言,因此也需要花时间了解go语法。

  2. 二者交互问题
      整个科研方案最大的问题就是go语言和c语言的结合问题,fabric只支持go语言,sgx只能通过C语言编写,因此将二者结合就是一个难点。目前还没有较好的解决方案。

下周工作计划

  1. 继续ego源码阅读
  2. sgx相关文件阅读,并充分学会编写sgx程序
  3. 尝试编写go语言的enclave代码(模仿ego)(可能需要多周实现)