Li Guangqiao
Li Guangqiao

一个正在转rust的ExtJs前端工程师。迷信rust的整体发展,十分相信rust在各个领域都能发光发热,至少目前rust在很多领域上验证了其安全性、易维护性。但说实话对于我这种菜鸡也是真的难上手哈哈哈~~。 思路总结:

  • 万物诞生都会有一个需求来源,每一个改变都是为了解决某个问题,最后应该考虑如何去做
  • 学会掌握一些宏观的知识和理论:系统论、还原论
  • 工程化思想,如何描述整体,从整体架构到模块关联等 故学习东西应该像看地图一样,先看整体了解整体的结构,然后再聚焦每一个模块,对于模块的学习,思考三个问题,“是什么?”、“为什么?”、“怎么做?”;那么设计一个东西时也应该去考虑整体性和关联性。

有关于未来的发展,以下是鄙人的粗浅的观点:

  • 编程语言未来应该是每个人必备的工具
  • 未来的交互方式应该会以语言交互为主流
  • 下一个去中心化的技术方案出来之前,区块链依然是web3建立价值体系的基础技术方案,如何将现实价值和虚拟价值联通是进入数字世界的一个大难题。
  • 未来注定是AI的世界。AI的进化会伴随绝大部分人的退化,届时除了尖端人才,人们学习的重心会放在何处?

Gradle基础
Gradle基础

Li Guangqiao - 08/05/2024

Gradle 基础 原文出自官方文档Gradle Basics Gradle 可根据构建脚本中的信息自动构建、测试和部署软件. 总体业务架构 对文字的解释: 业务包含三部分项目Project、构建工具Gradle和输出Output。项目作为输入经过构建工具后得到输出。 项目部分:一个项目可以有多个子项目。根项目中会包含一个setting.gradle文件,子项目包含build.gradle和源码文件。 构建工具部分:包含缓存Cache、构建工作流Build Flow和依赖管理Dependency Manager。根据引入插件Plugins添加默认的构建工作流、和引入的依赖项添加依赖 输出部分:包含测试结果、项目包和与服务器持续集成的操作。 Gradle 名词解释 Project 项目 Gradle 项目是可以构建的软件,例如应用程序或库。 单个项目生成包括一个名为根项目的单个项目。 多项目生成包括一个根项目和任意数量的子项目。 Build Scripts 构建脚本集 构建脚本向 Gradle 详细介绍了构建项目需要执行哪些步骤。 每个项目可以包含一个或多个生成脚本。 Dependency Manager 依赖关系管理 依赖项管理是一种自动化技术,用于声明和解析项目所需的外部资源。 每个项目通常都包含许多外部依赖项,Gradle 将在构建过程中解决这些依赖项。 Task 任务 任务是基本工作单元,例如编译代码或运行测试。 每个项目都包含在构建脚本或插件中定义的一个或多个任务。 Plugins 插件 插件用于扩展 Gradle 的功能,并选择性地为项目贡献任务。 Gradle 项目结构 存放gradle wrapper文件和其他相关文件的地方。 用于依赖项的版本管理 执行wrapper的脚本 定义跟项目名称并导入子项目 子项目的构建脚本 子项目的源码 命令行接口 参考官网Command-Line Interface Basics (gradle.org) Setting.gradle rootProject.name = 'root-project' //项目名称 include('sub-project-a') //引入子项目 include('sub-project-b') include('sub-project-c') Build.gradle plugins { id 'application' ...

Fisco Bcos链
Fisco Bcos链

Li Guangqiao - 08/03/2024

Fisco Bcos 国密链部署 新机构接入已有链 新节点接入所需要的文件: 证书机构颁发的国密证书(需要从外部获取) 证书机构生成的链证书(需要从外部获取) 群组创世文件(需要从已有的区块链网路节点中取)group.1.genesis 群组1节点地址{ip:port} generator二进制文件 fisco-bcos2.8.0版本二进制文件 conf配置目录 模板目录tpl(用完可以删掉) . ├── applicationContext.xml ├── config.ini ├── config.ini.gm ├── download_console.sh ├── group.i.genesis ├── group.i.ini ├── load_new_groups.sh ├── reload_whitelist.sh ├── start_all.sh ├── start.sh ├── stop_all.sh └── stop.sh pys 脚本目录 log日志目录 脚本执行步骤: 将已有链的证书拷贝到新机构的目录下,这里分别将非国密证书和国密证书文件夹命名为chain_ca 、chain_ca_gm。 利用链证书生成新机构的国密证书和私钥以及链证书。 ./generator --generate_agency_certificate ./agency_ca ./chain_ca kingdom ./generator --generate_agency_certificate ./agency_ca_gm ./chain_ca_gm kingdom -g agency_ca/ └── kingdom ├── agency.crt 机构非国密证书 ├── agency.key 机构私钥 └── ca.crt 链证书 1 directory, 3 files agency_ca_gm/ └── kingdom ...

初识长安链
初识长安链

Li Guangqiao - 07/03/2024

长安链(chainmaker) 四节点docker离线部署 环境准备 我的实验环境是麒麟服务器外加一台可联网的机器(没有arm架构机器可以考虑使用qemu-static-user,安装之后允许本地跑arm架构的镜像,虽然会报警告,但没有影响运行) 要求联网可以通过ssh远程访问服务器。 目标是在服务器上部署四节点的CERT证书模式的长安链。 1 服务器docker 和docker-compose 离线安装 参考麒麟系统(arm64/aarch64)离线安装docker和docker-compose_docker-compose-linux-aarch64-CSDN博客 2 准备好长安链的arm64镜像。 联网环境: docker pull chainmakerofficial/chainmaker:v2.3.2_arm docker save -o chainmaker.tar chainmakerofficial/chainmaker:v2.3.2_arm 可以得到一个chainmaker.tar本地镜像包,并拷贝到服务器中(这里我是使用scp命令) 服务器: docker load -i chainmaker.tar 3 准备长安链的配置文件 详细参考官方文档,只需要准备到2.1.2.4. 账户生成 注意:国密版本需要修改配置模板参考官方文档 2. 通过命令行体验链 — chainmaker-docs v2.3.2 documentation # 查看生成好的节点密钥和配置 $ tree -L 3 ../build/ ../build/ ├── config │ ├── node1 │ │ ├── admin │ │ ├── chainconfig │ │ ...

共识算法
共识算法

Li Guangqiao - 07/03/2024

共识算法 主要研究四个共识算法包含拜占庭容错共识、工作量证明共识、权益证明共识和Raft共识。 拜占庭容错共识(PBFT) 工作量证明共识(PoW) 权益证明共识(PoS) 权益证明共识(DPoS) Raft共识 ...

智能合约
智能合约

Li Guangqiao - 07/03/2024

智能合约 主要以Fisco Bcos 和Hyperleger Fabric为主进行合约的学习和研究。 Fisco Bcos合约 Solidity合约 revert错误处理 revert指令的作用是回滚合约。 合约的交易回执中,若状态码为0x16,状态信息为RevertInstruction,表示执行了回滚指令revert。 地址传递 状态变量修改函数的地址传递 例如: 现有合约TestAdd.sol、Test.sol,Test 导入了TestAdd并调用了它的test方法。 已知部署Test 的用户地址为0xe2d3a5f33454452081eb2e4ba0f99f97e40fc840。 合约地址为0x7d26aec47df6c3702c91898b05fec3a2efd0fd2f。 用户调用合约的parent方法,当前合约的msg.sender地址是用户地址0xe2d3a5f33454452081eb2e4ba0f99f97e40fc840。 那么调用test的msg.sender应该是合约地址还是发起交易用户地址? 其中用到了两个solidity的官方api,包含msg.sender当前消息发送者、tx.origin交易原始调用者。 使用错误处理回滚apirevert打印结果显示为合约地址:0x7d26aec47df6c3702c91898b05fec3a2efd0fd2f。 msg.sender的地址具有传递性,并非调用链上和原始调用者保持一致,而是遵循调用关系,比如说,用户调用合约A方法则合约A中的msg.sender为用户公钥地址,合约A方法调用了合约B方法,则合约B中的msg.sender为合约A的地址,依此类推。 tx.origin在整个调用链上始终保持一致,表示为最终发起交易的用户地址。 Test //Test.sol pragma solidity ^0.4.25; import "./TestUtil.sol"; //字符串存储数据结构 contract Test { TestUtil t = new TestUtil(); event print(address,address); function parent() public{ emit print(tx.origin,msg.sender); t.test(); ...