Skip to content

Latest commit

 

History

History
621 lines (467 loc) · 29.2 KB

Punkcan_WICL1st.md

File metadata and controls

621 lines (467 loc) · 29.2 KB

Web3 URL 残酷共学第 1 期残酷指引

⚠️ 正式开始前请确保你在身体上和精神上都处于合适的状态,请刻意练习,残酷面对 🆒。为方便检索 The First Web3 URL Intensive CoLearning 简写为 WICL1st,第 2 期即为WICL2nd,第 3 期即为 WICL3rd,以此类推。

⚠️ 报名需要按要求认真填写下面 [ XXX ] 部分,方可通过报名审核,通过审核即可开始自主学习。


[ Punkcan ]

  1. 自我介绍:

    Punkcan

    现在是个普通上班族,编程,数据库,服务器,杂七杂八的都会一点点。

    Web3 URL 以前没接触过,新玩意就想捣鼓一下。

    年纪有点大,还有严重老花,可能不适合长时间编程。

    INTP

  2. 组队期待:

    还不确定,看哪需要人哪去

  3. 你认为你会完成本次 Web3 URL 的残酷学习吗?

    1. 666%

第 1 期共学时间计划

  • 7 月 8 日 - 7 月 14 日

    • 自我介绍:大家按要求更新上方自我介绍,方面大家互相了解,及后续自由组队方向。

    • Web3 URL 残酷共学频道报道:大家可以自由在残酷共学群里交流分享,互动答疑,根据自身学习阶段情况随时开启自由组队。

    • 课前学习:了解残酷共学流程,GitHub 协作共学基础;Web3:// 协议课前学习。

  • 7 月 15 日 - 7 月 21 日

    • 7 月 15 日 周一晚 8 点- 9 点(北京时间): 第 1 次公开课分享
    • 本周共学内容: 涉及 Web3:// 的背景和演进历史;支持 Web3:// 协议的访问方式 (gateway 和 EVM browser)来浏览以太坊上面的数据;熟悉使用 Web3:// 和 EthStorage 早期测试网来部署简单的去中心化网站。
    • Homework1:课程 PPT
  • 7 月 22 日 - 7 月 28 日

    • 7 月 22 日 周一晚 8 点- 9 点(北京时间): 第 2 次公开课分享

    • 本周共学内容: 涉及 Web3:// 高级开发工具,包括:在命令行通过 web3curl 来通过 Web3:// 协议下载数据,通过 ethfs-uploader 批量上传网页数据,通过 manual 模式来搭建去中心化多人交互全链网站;及深入理解以太坊的存储模型和 gas 开销等。

    • 边学边用实战开发: 根据组队情况自由安排。

    • Homework2:课程 PPT

  • 7 月 29 日 - 8 月 4 日

    • 7 月 29 日 周一晚 8 点- 9 点(北京时间): 第 3 次公开课分享
    • 本周共学内容: 涉及实际应用案例分享及未来以太坊基础设施在 Web3:// 的重要作用及开发方向等。
    • 边学边用实战开发: 根据组队情况自由安排。
    • 结营分享: 具体时间及详情另在「Web3 URL 残酷共学频道」通知。

笔记证明 Notes Proof

07.15

举例示范:

  • 今日学习时间:1h

  • 学习内容小结:

    • EIP-4804,主要是能够透过协议定位EVM内部的资源
    • 现在的Firefox的addon ,是直接转换网关的网址
    • 最直观的理解就是透过URL的方式直接呼叫智能合约Read 所Response的内容
    • 上面这张图,白话解释就是:从333这个chain上,呼叫example.eth这个合约或地址的BalanceOf(Arg0是要传入的参数)
    • 目前Web3URL的网站的合约:0xEbcA4860ebBe969E9Bc42643fcb437879dBDa9C6 @ Web3Q Galileo (id 3334),可以参考
    • 可以跨链,内容可以储存在便宜的L2或是其他侧链上,也可以布署在测试网上
    • EVM读取速度很快,所以用户读取速度不影响(EVM是写的慢)
  • Homework 部分(如果有安排需要填写证明完成)

  • Question and Ideas

  • 07.16

  • 今日学习时间:1h

  • 学习内容小结:

    • 今天看到网关的架设,似乎有一个支援的Chainlist,也就是说并不是随便架设一个chain 就可以支援,衍生出:如果要架设一个Chain来专门处理,要如何申请Chain ID的问题,查了一下EIP155的资料,流程如下

      • 查询 Chain ID

        1. 访问 GitHub 仓库: 打开 ethereum-lists/chains 仓库。

        2. 查看 chains.json 文件:在查看已经登记的 Chain ID 列表。

        3. Fork 仓库

        4. 修改 chains.json 文件

          • 在fork 仓库中,编辑 chains.json 文件,添加您选择的 Chain ID 及其详细信息。

          例如:

          {
            "name": "My Custom Network",
            "chainId": 12345,
            "networkId": 12345,
            "rpc": ["https://my-custom-network.rpc.url"],
            "faucets": [],
            "explorers": [{"name": "my-explorer", "url": "https://my-explorer.url"}],
            "nativeCurrency": {"name": "MyToken", "symbol": "MTK", "decimals": 18}
          }
        5. 提交 Pull Request

          • 提交修改,并创建一个 Pull Request 将您的更改提交回 ethereum-lists/chains 仓库。
          • 在 Pull Request 中,详细描述您的链和 Chain ID 的用途,解释为什么选择该 ID。
        6. 等待审核和合并

          • 社区维护者会审核您的 Pull Request。如果没有问题,他们会将您的更改合并到主仓库中。
          • 一旦合并,您的 Chain ID 就正式登记在案,其他开发者可以看到并避免选择相同的 ID。
    • 格式理解:

  • Homework 部分

  • Question and Ideas(有什么疑问/或者想法,可以记在这里,也可以分享到共学频道群讨论交流)

    • 一个用来储存的EVM,会面临什么问题?要如何解决?

07.17

  • 今日学习时间:1h

  • 学习内容小结:

    • /<methodName>/<methodArg1>/<methodArg2>/...[?returns=(<type1>,,...)]
    • URL一次只会对一个方法进行呼叫,因此URL第一格一定是方法
    • 如果该方法有多个输入(Arg),就依序列出,returns也依序列出他们的类型(type,如果多个值要列出多个)
    • Arguments 的格式是自动辨识的,辨识顺序如下
    • uint256,bytes32,address,bytes,bytes
    • ?returns=如果没有指定,预设为bytes(但如果回传不是bytes,就会发生错误)
    • 回传的整个内容是JSON
    • 也就是说如果用来储存网页内容,可以将合约写成一次输出多个值,回传就一个JSON,我们在用parse去取值,这样速度也快
    • 如果returns有()但填入任何值,就会返回十六进制字符串,例如 ["0xAB9e1DDf806a20C9B06A94c655a59C3eDF495Ca5"]就会变成["0x000000000000000000000000ab9e1ddf806a20c9b06a94c655a59c3edf495ca5"],通常解析原始数据时会用到
    • 最后一个参数是媒体类型
    • web3://0x4e1f41613c9084fdb9e34e11fae9412427480e56/tokenSVG/9352?mime.type=svg,这样可以指定输出成SVG格式
    • 换成https 就是 https://0x4e1f41613c9084fdb9e34e11fae9412427480e56.w3eth.io/tokenSVG/9352?mime.type=svg
    • Auto mode 跟 manual mode的差异
      • 这两个模式是合约上设定的,一般来说,合约并没有考量到Web3URL的需求,就不会开manual模式,大多数状况下采用auto

      • 要采用manual模式,智能合约要打开接口

         	function resolveMode() external pure returns (bytes32) {
             return "manual";
             }
      • 我们可以这样理解,如果要读取出图片或是页面,manual可以有比较多的操作空间

      • manual模式,预设回传的是text/html 的MIME

      • 另外要写上一个fallback,fallback是一个包罗万象的函数,当没有适配函数时,就会调用他,但是fallback的gas价格更高,最好避免做写入的行为,另一种类似的函数是receive,当收到eth但是什么要求都没有的时候就会调动receive,专门用来设计例如收到钱就给代币之类的功能,Gas较低

      • fallback是用来作为一个路由,也就是说当有人对这个合约作出calldata的动作,就会吐出fallback的内容,用来将合约当成一个网页特别适用,以下是DOC的范例

           fallback(bytes calldata cdata) external returns (bytes memory) {
       if(cdata.length == 0 || cdata[0] != 0x2f) {
           return bytes("");
       }
      
       // Frontpage call
       if (cdata.length == 1) {
         return bytes(abi.encode(indexHTML(1)));
       }
       // /index/[uint]
       else if(cdata.length >= 6 && ToString.compare(string(cdata[1:6]), "index")) {
           uint page = 1;
           if(cdata.length >= 8) {
               page = ToString.stringToUint(string(cdata[7:]));
           }
           if(page == 0) {
               return abi.encode("Not found");
           }
           return abi.encode(indexHTML(page));
       }
      
       // Default
       return abi.encode("Not found");

    } ``` - 如此一来只需要呼叫页面的index,就可以叫出页面内容,并完成encode

  • Homework 部分(如果有安排需要填写证明完成)

  • Question and Ideas(有什么疑问/或者想法,可以记在这里,也可以分享到共学频道群讨论交流)

    • 如果回传的是JSON,要如何将JSON变成网页呢?

07.18

  • 今日学习时间:0.5h

  • 学习内容小结:

    • 听闻 EIP 6860 跟EIP 4804很类似,研究他们之间的差异是什么?
      • 简单地解释就是6860类似4804的一个扩展,4804虽然更为简化,但也意味着扩展弹性更高,也会有较高的兼容性
      • 对于更加复杂的使用,EIP 6860提供更多功能,例如更多的MIME类型等等
      • 两组的提案跟开发人员基本上一致
    • Resource request mode 目前还在草案
      • 算是将处理HTTP数据的一种补完

      • 可以回传HTTP 标头跟状态代码

      • path的解析转移到浏览器端

      • https://vscode.blockscan.com/ethereum/0x2b51A751d3c7d3554E28DC72C3b032E5f56Aa656 是一个很完整的案例

      • Chunk support 这部分的概念大概是说可以将内容分成多块

        • 不过测试的时候 web3://0x8e990356262a2f8164981298e167c3ad2409faa1:11155111/getFile/abcd 并没有正常回传,而是后面又接了一段400
         ```html
         start<html><h1>400: Bad Request</h1>Unrecognized domain name<html/>
         ```
        
        • web3://0x8e990356262a2f8164981298e167c3ad2409faa1:11155111/getFile/abcd?chunk=1 倒是正常了,总之就是可以用来把大型内容分段或是分页
      • Compression 可以将数据压缩后上链,利用这个协议进行解压缩返回给client

  • Homework 部分(如果有安排需要填写证明完成)

  • Question and Ideas(有什么疑问/或者想法,可以记在这里,也可以分享到共学频道群讨论交流)

    • 如果目前不知道是透过网关去读取合约还是读取合约后透过网关转译内容,如果是先读取合约,如果是「读取合约后透过网关转译内容」,可否在合约里定义网关清单之类的?
    • 网关如果被和谐了,一般用户如何知道怎么修改网关?
    • 网关的架设能否有激励制度?

07.19

  • 今日学习时间:0.5h
  • 学习内容小结:
    • 网关
      • 网关的原理是将http的请求转换成web3protocol-go能处理的web3://
      • 目前firefox的addon,是先转web3://的链接为https://的链接,然后送给网关去获取需求
      • 也就是说未来如果有浏览器原生支援,就不需要网关了
      • 目前有w3link.io多链跟w3eth.io主网单链两个官方项目网关
      • 不过目前多链网关有支援的范围,不是所有测试网都可以用(之前看还没有支援holesky,目前已经加入支援)
      • 目前有一款项目方释出的EVM Browser,Chrome extension 对安全需求高,无法上架
      • https://w3-sandbox.eth.eth.w3link.io/ 是一个sandbox,可以测试完成的web,回传数据的细节,跟Dev视窗相比,比较能清楚分出哪些Web3数据
      • Web3curl 虽然是用来调试的,可以实践web3://的脚本化
      • web3curl -v可以列出调试细节
      • 最后一个(我觉得)比较重要的是web3protocol-js ,从源码粗浅的看来,似乎可以让一般https的网站链接获取到web3://的资源,甚至可以跳过网关,因为他这跟EVM节点API交互,而不是跟网关交互
      • 还有web3protocol-go,这是做网关的关键,不过我不熟悉Go
    • ethfs-uploader
      • 算是一个档案上传的工具,可以透过npm安装
      • 算是给不会写合约的用户一个方便的模式
      • 第一步可以用来创建目录合约,这个合约可以方便你之后上传档案
      • 上传文件时,呼叫合约为了要辨识是哪一条链,要去查一下链的缩写the EIP-3770 address,采用EIP-3770 的格式
      • 格式:w3q-g:0x37DF32c7a3c30D352453dadACc838461d8629016
        • 但这里我有点不懂,为什么要用缩写?因为缩写不是很好查询
      • 完整的上传格式范例 npx ethfs-uploader /Users/.../dist w3q-g:0x37DF32c7... --privateKey 0x112233...
      • 暂时安装不了,无法实操,过两天再弄
  • Homework 部分(如果有安排需要填写证明完成)
  • Question and Ideas(有什么疑问/或者想法,可以记在这里,也可以分享到共学频道群讨论交流)

07.20

  • 今日学习时间:0.5h
  • 学习内容小结:
    • ethfs-sdk ,可以让档案的存取建档等等脚本化,或是写成web界面来操作
    • 尝试申请W3NS,但是无法正常申请,已经提交issue
    • ERC-5018 是一个以太坊改进提案(EIP),它定义了一个类似文件系统的接口,用于以太坊区块链上的合约。该提案制定了一套API,用于在智能合约中管理目录和文件,使其能够读写任意大小的二进制对象。特别地,如果对象太大,不适合在单一交易中处理,该标准还支持分块处理功能。主要功能包括:
      • 写入(Write):在目录中为文件写入数据。
      • 读取(Read):从目录中的文件读取数据。
      • 文件大小和块(Size and Chunks):获取文件的大小以及数据块的数量。
      • 删除(Remove):删除目录中的文件。
      • 分块操作(Chunk Operations):对大文件进行分块写入、读取和删除操作,以适应单次交易的数据大小限制。
    • 也就是说5018可以解决上传档案太大的问题
    • 基本上DOC都看完了,花了六天,该开始写合约了
  • Homework 部分(如果有安排需要填写证明完成)
  • Question and Ideas(有什么疑问/或者想法,可以记在这里,也可以分享到共学频道群讨论交流)

07.21

  • 今日学习时间:0.5 h

  • 学习内容小结:

    • 布署开发合约的环境,包括remixd,完成环境设定,但还没开始开发(更新remixd花太多时间了)
    • 注册W3NS:punkcan.w3q 完成,之前的失败应该是网络原因
    • Web handler 应该是填写Web3URL要用来呈现http输出的合约地址,暂时还没设定
    • ethfs-uploader安装一直出现「安全提示」,无法完成安装,正在解决中
  • Homework 部分(如果有安排需要填写证明完成)

  • Question and Ideas(有什么疑问/或者想法,可以记在这里,也可以分享到共学频道群讨论交流)

07.22

  • 今日学习时间:1h

  • 学习内容小结:

    • 先解决了 npm i ethfs-uploader 的问题,基本上就是把相关套件通通移除后,重新npm cache clean --force,重新update,再进行安装
      • W3Q网路不支援最新的EVM,编译一直出错,后来直接降到柏林后成功
    • 正在写合约
    • 解析fallback的范例
       fallback(bytes calldata cdata) external returns (bytes memory) {
       // 检查传入的数据长度是否为0,或者数据的第一个字节是否不等于0x2f(即'/'字符)
       // 如果任一条件满足,则返回一个空的字节序列
       if (cdata.length == 0 || cdata[0] != 0x2f) {
       	return bytes("");
       }
       // 如果请求只包含一个'/'字符,返回首页内容
       // 调用indexHTML(1)生成首页的HTML内容,并将其编码为字节序列返回
       if (cdata.length == 1) {
       	return bytes(abi.encode(indexHTML(1)));
       }
       // 检查是否为形如'/index/[uint]'的请求
       else if (
       	cdata.length >= 6 && ToString.compare(string(cdata[1:6]), "index")
       ) {
       uint page = 1;
       // 如果路径后有更多字符,尝试解析页码
       if (cdata.length >= 8) {
       	page = ToString.stringToUint(string(cdata[7:]));
       }
       // 如果解析页码为0,返回"Not found"
       if (page == 0) {
       	return abi.encode("Not found");
       }
       // 否则,调用indexHTML(page)获取指定页码的HTML内容,并编码返回
       	return abi.encode(indexHTML(page));
       }
       // 如果以上条件均不满足,返回"Not found"
       	return abi.encode("Not found");
       }
  • Homework 部分(如果有安排需要填写证明完成)

  • Question and Ideas(有什么疑问/或者想法,可以记在这里,也可以分享到共学频道群讨论交流)

07.23

  • 今日学习时间:0.5h
  • 学习内容小结:
    • 完成第一阶段最后一项作业,Manual合约
    • 完成测试,并注册多个W3NS,准备规划项目
  • Homework 部分(如果有安排需要填写证明完成)
  • Question and Ideas(有什么疑问/或者想法,可以记在这里,也可以分享到共学频道群讨论交流)

07.24

  • 今日学习时间:0.5h
  • 学习内容小结:
    • 实作ethfs-cli的各项指令,不过这个有点太简单就不写细节了
    • 本地网关架设....这个也有点简单,不过这个我觉得可以写成一个一键安装的套件,最好有GUI,这样大家可以在自己本机开网关
    • 讨论项目进行
  • Homework 部分(如果有安排需要填写证明完成)
  • Question and Ideas(有什么疑问/或者想法,可以记在这里,也可以分享到共学频道群讨论交流)

07.25

  • 今日学习时间:0.5 h
  • 学习内容小结:
    • 讨论并整理项目的页面需求
    • 目前初版已定,接着就是分析合约的功能需求,便可以开始准备分工
  • Homework 部分(如果有安排需要填写证明完成)
  • Question and Ideas(有什么疑问/或者想法,可以记在这里,也可以分享到共学频道群讨论交流)

07.26

  • 今日学习时间:0.5 h
  • 学习内容小结:
    • 将 TerraformNavigator 相关合约下载下来研究(0x2b51A751d3c7d3554E28DC72C3b032E5f56Aa656),共计12个地址,这个合约有完整类似MVC的架构,采用5219 mode,方便架设较复杂的网站,且网站内容可区块更新
    • 整理项目所需合约功能
  • Homework 部分(如果有安排需要填写证明完成)
  • Question and Ideas(有什么疑问/或者想法,可以记在这里,也可以分享到共学频道群讨论交流)

07.27

  • 今日学习时间:0.5h
  • 学习内容小结:
    • 整理完组队项目的变量设计
    • 组队项目的Git https://github.com/OutlawVoyage/OutlawVoyage
    • 整理分工目前分配的部分
      • 设计和开发船班的相关逻辑,包括编号、入场金、起始区块、等候报名时间和游戏时间等。
      • 负责创建船只的逻辑,包括船只的编号、状态、卡牌数量、玩家数量等。
      • 实现相关合约的API接口。
  • Homework 部分(如果有安排需要填写证明完成)
  • Question and Ideas(有什么疑问/或者想法,可以记在这里,也可以分享到共学频道群讨论交流)

07.28

  • 今日学习时间:1h
  • 学习内容小结:
    • 分析了两个TerraformNavigator的合约,一个5219 mode 一个manual mode
      • manual 采用fallback的模式,5129采用了function来处理,例如request
      • 5219 设置了设置响应头,但manual则是直接回传数据
      • 针对request进行了理解
         function request(
             string[] memory resource, 
             KeyValue[] memory params
         ) external view returns (
         	uint statusCode, 
         	string memory body, 
         	KeyValue[] memory headers) {
         
         // 如果 resource 数组为空,则表示请求的是主页
             if(resource.length == 0) {
                 body = indexHTML(1);  // 生成第一页的 HTML 内容
                 statusCode = 200;  // 设置状态码为 200(成功)
                 headers = new KeyValue ;
                 headers[0].key = "Content-type";  // 设置响应头
                 headers[0].value = "text/html";  // 内容类型为 text/html
             }
          // 处理 /index/[uint] 路径
             else if(resource.length >= 1 && resource.length <= 2 && ToString.compare(resource[0], "index")) {
                 uint page = 1;
                 if(resource.length == 2) {
                     page = ToString.stringToUint(resource[1]);  // 将第二个元素转换为页码
                 }
                 if(page == 0) {
                     statusCode = 404;  // 如果页码为 0,设置状态码为 404(未找到)
                 }
                 else {
                     body = indexHTML(page);  // 生成对应页码的 HTML 内容
                     statusCode = 200;  // 设置状态码为 200(成功)
                     headers = new KeyValue ;
                     headers[0].key = "Content-type";  // 设置响应头
                     headers[0].value = "text/html";  // 内容类型为 text/html
                 }
             }
         // 处理 /view/[uint] 路径
             else if(resource.length == 2 && ToString.compare(resource[0], "view")) {
                 uint terraformsTotalSupply = ITerraforms(terraformsAddress).totalSupply();  // 获取 Terraforms 的总供应量
         
                 uint tokenId = ToString.stringToUint(resource[1]);  // 将第二个元素转换为 tokenId
                 if(tokenId == 0 || tokenId > terraformsTotalSupply) {
                     statusCode = 404;  // 如果 tokenId 为 0 或大于总供应量,设置状态码为 404(未找到)
                 }
                 else {
                     body = viewHTML(tokenId);  // 生成对应 tokenId 的 HTML 内容
                     statusCode = 200;  // 设置状态码为 200(成功)
                     headers = new KeyValue ;
                     headers[0].key = "Content-type";  // 设置响应头
                     headers[0].value = "text/html";  // 内容类型为 text/html
                 }
             }
         // 处理 /view/[uint]/svg 路径,代理 SVG 请求直到 ERC-7087 被接受
             else if(resource.length == 3 && ToString.compare(resource[0], "view") && ToString.compare(resource[2], "svg")) {
                 uint terraformsTotalSupply = ITerraforms(terraformsAddress).totalSupply();  // 获取 Terraforms 的总供应量
         
                 uint tokenId = ToString.stringToUint(resource[1]);  // 将第二个元素转换为 tokenId
                 if(tokenId == 0 || tokenId > terraformsTotalSupply) {
                     statusCode = 404;  // 如果 tokenId 为 0 或大于总供应量,设置状态码为 404(未找到)
                 }
                 else {
                     body = ITerraforms(terraformsAddress).tokenSVG(tokenId);  // 获取对应 tokenId 的 SVG 数据
                     statusCode = 200;  // 设置状态码为 200(成功)
                     headers = new KeyValue ;
                     headers[0].key = "Content-type";  // 设置响应头
                     headers[0].value = "image/svg+xml";  // 内容类型为 image/svg+xml
                 }
             }
             else {
                 statusCode = 404;  // 如果上述条件都不满足,设置状态码为 404(未找到)
             }
         }
        
        
  • Homework 部分(如果有安排需要填写证明完成)
  • Question and Ideas(有什么疑问/或者想法,可以记在这里,也可以分享到共学频道群讨论交流)

07.29

07.30

  • 今日学习时间:0.5h
  • 学习内容小结:
    • 修改项目的一些问题
    • 确认项目分工后的细节
  • Homework 部分(如果有安排需要填写证明完成)
  • Question and Ideas(有什么疑问/或者想法,可以记在这里,也可以分享到共学频道群讨论交流)

07.31

  • 今日学习时间:0.5h
  • 学习内容小结:
    • 项目代码检查
    • 研究OP跟ARB的储存成本
    • 主网是20,000Gas/1000KB
    • OP 的Gas费用是 1000Gas/1000KB,消耗的是等价的ETH
    • ARB One 的每一个gas大约是主网1~0.5之间,也就是说最贵大约就像OP这么贵,低的时候大约只有OP一半
    • ARB Nove 则又更低,Nove更低的原因是它采用Anytrust的机制,可以有更高的吞吐量跟更低的储存成本
    • 但因为他的验证是采用DAC(数据可用性委员会),有中心化风险,安全性没有Arb One 高因此官方也建议更加适合做应用,而非交易
      • 就这一点而言还挺适合用来布署Web3URL的
    • Arbitrum Nova 的数据可用性委员会 (DAC) 目前由 24 个节点 组成
    • Arbitrum Nova 如果1MB大约是0.00325ETH,如果上主网,大约6Eth
    • OP大概0.3eth,Arbitrum One大约0.18eth
  • Homework 部分(如果有安排需要填写证明完成)
  • Question and Ideas(有什么疑问/或者想法,可以记在这里,也可以分享到共学频道群讨论交流)

08.01

  • 今日学习时间:0.5h
  • 学习内容小结:
    • 检查项目代码并进行测试

08.02

  • 今日学习时间:1h
  • 学习内容小结:
    • 修正项目所需要的代码,将变量增加Get的Function

08.03

  • 今日学习时间:1h
  • 学习内容小结:
    • 测通项目合约
    • 修改bug

08.04

  • 今日学习时间:1.5h
  • 学习内容小结:
    • 完成合约测通
    • 补充功能

ToDo

  • Challenge: Use ERC6944 to return a uncompressed compressed data determine a customized MIME
  • 研究如果使用web3protocol-js,是否可以不用网关就获取数据