Lotus CLI 以及 Pond GUI 的使用

[[IPFS]] [[Filecoin]] [[Lotus]] Lotus CLI 以及 Pond GUI 的使用 说明 Lotus 是基于 IPFS 技术上的激励层 FileCoin 的一种实现,它区别于 go-filecoin 是一种不同的实现,但是底层的架构极为相似。 Lotus CLI 是实现 Lotus 的命令行界面工具。 Pond GUI 是基于 Lotus 的图形用户界面。 Lotus 的安装 需要依赖 go (1.13 or higher) gcc (7.4.0 or higher) git (version 2 or higher) bzr (some go dependency needs this) jq pkg-config opencl-icd-loader opencl driver (like nvidia-opencl on arch) (for GPU acceleration) opencl-headers (build) rustup (proofs build) llvm (proofs build) clang (proofs build) 下载 $ git clone https://github.com/filecoin-project/lotus.git $ cd lotus/ 安装 $ make clean all $ sudo make install 安装过程会出现不少问题,其中一个就是没有 rustup 工具。可以参考 Rust 版本管理工具: rustup。安装完 rustup 可以配置 Rust Crates 镜像,以加快安装编译的速度。 ...

Lotus daemon 全过程

[[Lotus]] Lotus daemon 全过程 lotus daemon 会生成一个守护进程,那么它在这个过程中做了哪些事? 大致过程 通过命令行读取参数 拿到指定的 repo 或者使用默认的 repo(就是一个路径值),计作 $PATH,根据它进行服务初始化的操作 根据是否存在 $PATH/datastore,判断是否已经运行过服务,如果运行过就报警告,否则创建 $PATH 目录 创建默认的 $PATH/config.toml 文件 创建 $PATH/keystore 文件夹 根据 build/proof-parameters.json/parameters.json 里的数据对 /var/tmp/filecoin-proof-parameters/ 的证明参数文件进行校验 如果制定了 genesis 参数,则使用,否则从 build/genesis/devnet.car 生成,生成块逻辑比较复杂,如果指定了 lotus-make-random-genesis 和 genesis-presealed-sectors 参数,则可以通过逻辑生成一个,逻辑比较复杂 然后就是创建一个逻辑节点,先声明了一个接口,定为 api 通过 node.New 生成一个完整节点,第一步先把 子系统的api 和主节点的 api 绑定在一起,具体实现依赖的是子系统 根据节点类型,会更新一些配置项,配置项分为:调用,模块,会有非常多的模块,比较重要的有 SetApiEndpointKey 通过 serveRPC 返回一个 rpc 服务

Lotus send 全过程

Lotus Lotus send 全过程 lotus send 可以在钱包间转账。 大致过程 获得操作句柄(拿到api) 计算对方钱包地址 计算转账量 使用api的默认钱包地址或者指定的钱包地址 将转账信息记录到 mpool 里 获得操作句柄 通过 repo 参数(默认为~/.lotus),找到一个存储数据的路径,记为 PATH 从 $PATH/api 拿到 api 端点信息,通过 multiaddr.NewMultiaddr 转换为 byte 数组, 记为 apiInfo apiInfo 通过 manet.DialArgs 解析出协议和 Linux 网络地址 从 $PATH/token 拿到 token 信息,并加在默认 http.header 里,至此已经拿到了 网络地址 和 带 token 的 header 再根据拿到的两个数据通过一次 NewFullNodeRPC 处理,拿到操作句柄(暂时是一个struct),网络关闭函数 计算对方钱包位置 从命令行拿到原始的数据,记为 wls 对 wls 进行解码,根据 wls 的第二位判断协议类型,从第三位到结尾则是原始数据,记为 raw,进入下一步解码 使用一个自定义的 encoding 对 raw 进行解密,然后拆分成 payload 和 cksm 使用 ValidateChecksum 检测 payload 是否有效 通过 protocol 和 payload 创建新的地址,此时就拿到了钱包地址 计算转账量 这个纯粹就是通过字符串进行数学运算,牵扯到的过程还挺复杂的,主要依赖了 math/big/Rat 结构体,它表示任意精度的商 a / b 比较重要的一步转换是通过创建一个 big.NewRat(build.FilecoinPrecision, 1),然后对转账量进行一个处理,简单来说就是放大 10^18 次方(针对十进制),并且使b为1 使用api的默认钱包地址或者指定的钱包地址 如果指定了 source 信息,则类似 计算对方钱包位置 一样计算一个钱包地址 如果没有指定,则使用 api 的 WalletDefaultAddress 方法实现 通过 ~/.lotus/keystore 里的文件进行查询 将转账信息记录到 mpool 里 构建一个 message 结构,目前 GasLimit 和 GasPrice 都是固定的 使用 api 的 MpoolPushMessage 方法实现 通过 message 进行处理,判断余额是否足够传递 通过 mp.getNonceLocked 拿到 nonce 将 nonce 加入到 message里,对 message 的每一项数据根据类型进行不同处理,将结果写入到buffer,记为data,然后根据data生成一个cid,这两个参数通过 block.NewBlockWithCid 获取新块 通过 message 的 from address 和 cid 信息,创建签名文件 通过 PubSubPublish 进行数据传递 数据传递过程