跨链技术方案中典型的有:哈希时间锁定(HTLC) 、公证人机制、侧链、中继链、分布式秘钥控制等。本篇主要讲解哈希时间锁定(HTLC)实现跨链的技术特性,在后续的文章中会相继介绍其他跨链的技术。

HTLC 的核心是时间锁和哈希锁。时间锁 指,交易双方约定在某个时间内提交才有效,超时则承诺方案失效(无论是提出方或接受方)。哈希锁 指,对一个哈希值 H,如果提供原像 R 使得 Hash(R) = H,则承诺有效,否则失效。如果交易因为各种原因未能成功,时间锁能够让交易参与各方拿回自己资金,避免因欺诈或交易失败造成的损失。

哈希时间锁定最早出现在比特币的闪电网络,跨链资产交换支持一定数量的 A 链资产和一定数量的 B 链资产进行原子交换。哈希时间锁定巧妙地采用了哈希锁和时间锁,迫使资产的接收方在最后期限内确定收款并产生一种收款证明给打款人,否则资产会归还给打款人。收款证明能够被付款人用来获取接收人区块链上的等量价值的数量资产或触发其他事件。

阅读全文

对于联盟链的业务中搭建一个私有网络的 IPFS 集群还是很有必要的,私有网络集群允许 IPFS 节点只连接到拥有共享密钥的其他对等节点,网络中的节点不响应来自网络外节点的通信。 IPFS-Cluster 是一个独立的应用程序和一个 CLI 客户端,它跨一组 IPFS 守护进程分配、复制和跟踪 pin。它使用基于 Raft 一致性算法来协调存储,将数据集分布到参与节点上。对于我们要将一个 peer 上的存储同步备份到所有集群上其他的 peers 时,或者对集群的节点管理,这时 IPFS-Cluster 就会起到一个很好的作用。 下面简单描述一下 IPFS 私有网络以及 IPFS-Cluster 集群的搭建配置过程(Ubuntu16.04)。 IPFS 和 IPFS-Cluster 默认的端口: IPFS: 4001 – 与其他节点同学端口 5001 – API server 8080 – Gateway server IPFS-CLUSTER: 9094 – HTTP API endpoint 9095 – IPFS proxy endpoint 9096 – Cluster swarm 集群几点通信端口 Golang 安装 IPFS 官方提供的安装方式有安装包方式,ipfs-update 方式,源码编译安装方式,具体可以查看 https://docs.ipfs.io/guides/guides/install/ 这里为了 ipfs 版本选择和升级,所以使用ipfs-update方式安装,Go 是必须的,对于 Go 的安装这里不再赘述。

阅读全文

所需依赖以及安装 Nodejs 8.11.x (Note that v9.x is not yet supported) PostgreSQL 9.5 or greater jq docker-ce docker-compose git 在上一篇的《Hyperledger Fabric 多机部署》已经部署好了 Fabric 网络,这里用 CLI 那台机器来部署 Hyperledger Explorer,所以有些依赖已经安装好了。 安装 PostgreSQL sudo apt-get install wget ca-certificates wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" >> /etc/apt/sources.list.d/pgdg.list' sudo apt-get update sudo apt-get install postgresql postgresql-contrib ##修改密码 sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'postgres';" 安装 jq apt-get install jq jq --version 代码配置 Clone 项目代码 git clone https://github.

阅读全文

官方的first-network执行一个脚本单机 docker 就可以启动 fabric 网络环 很多书和网络上也都是基于first-network教学,下面教程基于拆解first-network,不但对我们更深入了解 fabric 网络搭建有很大帮助,也有利于我们真实生产环境的搭建操作。 主机列表 节点 IP order.example.com 192.168.11.11 peer0.org0.example.com 192.168.11.12 peer1.org0.example.com 192.168.11.13 peer0.org1.example.com 192.168.11.14 peer1.org1.example.com 192.168.11.15 由于域名并非真实解析的公网,所以需要将以上加入各个主机的/etc/hosts 环境依赖安装 以下依赖安装没有特别说明需要在各个主机中安装操作 docker 安装 apt-get update apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - add-apt-repository \ "deb [arch=arm64] https://download.

阅读全文

Golang Web 项目工程结构

好久没有写后端 api 了,最近写一个微信小程序,顺便后端也用 Golang 的 echo web 框架写了,使用 go mod 做包管理,分享一下自己在用 golang 做 web 开发的项目目录结构。Github 地址请戳 golang-web-layout,其中包含了示例代码,如果有需要的话你也可以自己修改其中的代码,用作自己平时开发使用的开发框架模板。 ├── README.md ├── bin ├── bootstrap │ └── bootstrap.go ├── config │ ├── config.go │ ├── dev.ini │ └── prod.ini ├── database │ └── mysql.go ├── go.mod ├── go.sum ├── handler │ ├── auth_handler.go │ └── base_handler.go ├── log ├── middleware │ ├── logger.go │ └── openid.go ├── model │ ├── base_model.go │ └── user_model.

阅读全文

Twitter 的 snowflake 在分布式生成唯一 UUID 应用还是蛮广泛的,基于 snowflake 的一些变种的算法网上也有不少。使用 snowflake 生成 UUID 很多都是在分布式场景下使用,我看了下网上有其中有几篇 PHP 实现的都没有考虑到线程安全。现在 PHP 有了 Swoole 的锁和协程的加持,对于我们开发线程安全和高并发模拟还是很方便的,这里用 PHP 结合 Swoole 来学习下实现最简单的 snowflake(好久没写 PHP,感觉没有 IDE 真写不了 PHP 了)。 先来看以下 snowflake 的结构: 生成的数值是 64 位,分成 4 个部分: 第一个 bit 为符号位,最高位为 0 表示正数 第二部分 41 个 bit 用于记录生成 ID 时候的时间戳,单位为毫秒,所以该部分表示的数值范围为 2^41 - 1(69 年),它是相对于某一时间的偏移量 第三部分的 10 个 bit 表示工作节点的 ID,表示数值范围为 2^10 - 1,相当于支持 1024 个节点 第四部分 12 个 bit 表示每个工作节点没毫秒生成的循环自增 id,最多可以生成 2^12 -1 个 id,超出归零等待下一毫秒重新自增 先贴下代码:

阅读全文

gRPC安全认证

在 gRPC 作为服务间通信的过程中为了数据安全我们一般要进行安全认证,比如 HTTP Restful Api 经常需要做接口之间调用的认证,我们来看下 gRPC 的认证方式。 安全证书认证 gRPC 建立于 HTTP/2 所以对 TLS 支持,我们可以使用服务端客户端双向证书验证通信来提供安全可靠的 gRPC。这里假如我们已经生成好了服务端和客户端的证书和私钥文件,并已经通过根证书做了签名。 我们先来看下服务端大概代码 server.go: package main import ( ...... ) ...... func main() { certificate, err := tls.LoadX509KeyPair("server.crt", "server.key") if err != nil { log.Fatal(err) } certPool := x509.NewCertPool() ca, err := ioutil.ReadFile("ca.crt") if err != nil { log.Fatal(err) } if ok := certPool.AppendCertsFromPEM(ca); !ok { log.Fatal("failed to append certs") } creds := credentials.NewTLS(&tls.Config{ Certificates: []tls.

阅读全文

在公司要做一个技术分享,同事里面没有人会 Flutter 开发的,所以我只能讲点基础的装逼一下,把 PPT 贴出来凑一篇博客吧。。。 转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记 如果觉得本篇文章对您十分有益,何不 打赏一下 本文链接地址: Flutter 快速开发移动端跨平台 APP 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。

阅读全文

之前做后端开发的时候,不管是什么语言或者框架,都习惯根据不同环境加载不同的开发配置,比如本地开发的时候,加载 local.env 配置,部署开发环境的时候加载 develop.env 配置,通常通过一个环境变量来决定加载相应的配置。最近在开发一款 Flutter App,我也希望 App 在不同的环境中加载不同的配置文件,实现的方式如下,如有不妥还请指出。 首先在lib建立多个main.dart,比如main_local.dart表示本地开发运行时执行的入口文件,main_develop.dart和main.dart分别表示开发环境和生产环境: lib/ ├── api/ ├── main.dart ├── main_develop.dart ├── main_local.dart ├── models/ ├── pages/ ├── utils/ └── widgets/ 这样如果我们运行在本地开发,那么执行 flutter run -t lib/main_local.dart 那么如何在执行本地开发环境的时候来调用本地开发的配置呢?其实很简单,我来定义配置文件,比如utils/config.dart enum Env { PROD, DEV, LOCAL, } class Config { static Env env; static String get apiHost { switch (env) { case Env.PROD: return "http://yuanxuxu.com"; case Env.DEV: return "http://develop.yuanxuxu.com"; case Env.LOCAL: default: return "http://local.yuanxuxu.com"; } } } 其中Env就是一个环境变量,比如我们要获取 api 请求的地址,那么根据环境变量来获取不同的请求地址,接下来我们只要在运行的入口函数 main 中定义我们当前运行的环境变量,在main_local.

阅读全文

MPT(Merkle Patricia Tries)是以太坊中存储区块数据的核心数据结构,它是 Merkle Tree 和 Patricia Tree 融合一个树形结构,理解 MPT 结构对之后学习以太坊区块 header 以及智能合约状态存储结构的模块源码很有帮助。 首先来看下 Merkle 树: 它的叶子是数据块的 hash,从图中可以看出非叶子节点是其子节点串联字符串的 hash,底层数据的任何变动都会影响父节点,这棵树的 Merkle Root 代表对底层所有数据的“摘要”。 这样的树有一个很大的好处,比如我们把交易信息写入这样的树形结构,当需要证明一个交易是否存在这颗树中的时候,就不需要重新计算所有交易的 hash 值。比如证明图中 Hash 1-1,我们可以借助 Hash 1-0 重新计算出 Hash 1,然后再借助 Hash 0 重新计算出 Top Hash,这样就可以根据算出来的 Top Hash 和原来的 Top Hash 是否一样,如果一样的话那么 Hash 1-1 就属于这棵树。 所以想象一下,我们将这个 Top Hash 储存在区块头中,那么有了区块头就可以对区块信息进行验证了。同时 Hash 计算的过程可以十分快速,预处理可以在短时间内完成。利用 Merkle 树结构能带来巨大的比较性能提升。 再来看下 Patricia 树: 从它的名字压缩前缀树再结合上图就可以猜出来 Patricia 树的特点了,这种树形结构比将每一个字符作为一个节点的普通 trie 树形结构,它的键值可以使用多个字符,降低了树的高度,也节省了空间,再看个例子: 图中可以很容易看出数中所存储的键值对: 6c0a5c71ec20bq3w => 5 6c0a5c71ec20CX7j => 27 6c0a5c71781a1FXq => 18 6c0a5c71781a9Dog => 64 6c0a8f743b95zUfe => 30 6c0a8f743b95jx5R => 2 6c0a8f740d16y03G => 43 6c0a8f740d16vcc1 => 48 以太坊中的 MPT: 在以太坊中 MPT 的节点的规格主要有一下几个:

阅读全文

作者的图片

Ryan是菜鸟 | 技术栈笔记

一步一个脚印,一直在路上!记录LNMP技术栈,Web架构,区块链等笔记

菜鸟码农

南京