Hello World - 2020年6月
type: channel
link: https://wlwl.host/index.php/2020/06/
description: Just So So ...
items: platon 合约
items: vnt 合约
items: ontology 合约
items: parity 合约
items: EOS 基础
items: Go CGO入门

platon 合约
type: item
date: 2020-06-16T10:36:00+00:00
description: PlatON致力于建设下一代隐私计算架构和数据交换网络，基于现代密码技术和区块链技术，创造全新的计算范式，保证用户数据隐私的前提下，无需依赖第三方就可进行协同计算并验证结果的完整性。创建并运行debian10镜像docker run --name platon --restart always -itd debian:10 进入debian终端docker exec -it platon /bin/bash 换源（加速下载包）和更新/bin/bash -c 'echo -e "\ deb http://mirrors.163.com/debian/ buster main non-free contrib\n\ deb http://mirrors.163.com/debian/ buster-updates main non-free contrib\n\ deb http://mirrors.163.com/debian/ buster-backports main non-free contrib\n\ deb http://mirrors.163.com/debian-security/ buster/updates main non-free contrib" > /etc/apt/sources.list;\ apt update;\ apt upgrade -y;' 安装所需的包，编译程序和合约所需的库apt install -y git gcc golang npm libgmp-dev libssl-dev libtinfo5 procps nano wget 安装plantongit clone https://github.com/PlatONnetwork/PlatON-Go ~/PlatON-Go -b release-0.12.0 --depth 1 --recursive --shallow-submodules cd ~/PlatON-Go && make all echo 'export PATH="$HOME/PlatON-Go/build/bin:$PATH"' >> ~/.bashrc && source ~/.bashrc 启动单节点测试网1、生成nodekey和blskey等相关文件mkdir -p ~/platon-node/data && keytool genkeypair | tee >(grep "PrivateKey" | awk '{print $2}' > ~/platon-node/data/nodekey) >(grep "PublicKey" | awk '{print $3}' > ~/platon-node/data/nodeid) && keytool genblskeypair | tee >(grep "PrivateKey" | awk '{print $2}' > ~/platon-node/data/blskey) >(grep "PublicKey" | awk '{print $3}' > ~/platon-node/data/blspub) 2、创建钱包文件，使用空白密码mkdir -p ~/platon-node/data && platon --datadir ~/platon-node/data account new 3、在目录~/platon-node下生成创世块配置文件platon.jsonnano ~/platon-node/platon.json 三个关键字段:node 只修改节点公钥部分，查看cat ~/platon-node/data/nodeidblsPubKey 节点BLS公钥，查看cat ~/platon-node/data/blspuballoc 给测试账户配置一定的余额，之前生成的在目录platon-node/data/keystore下模板：{ "config": { "chainId": 299, "eip155Block": 1, "ewasmBlock": 0, "VMInterpreter": "evm", "cbft": { "initialNodes": [{ "node": "enode://0fd7c8f228ff8549afd2a5a56cb688800b8b66706add2bc0a2190a09fee228d990e4a9f410b052e030abed9c6611f63798481992551cf3f3e4f8a736adfdc341@127.0.0.1:16789", "blsPubKey": "8b0069a77e06da5ef94dad38ac74a26eee35a77c2b4d…

vnt 合约
type: item
date: 2020-06-15T10:38:00+00:00
description: vnt简称维特，采用聚合链架构，打造分布式智能价值网络。为多种资产授权、交易、流转提供低廉的资产服务，实现数字资产的高效流转。创建并运行debian10镜像docker run --name vnt --restart always -itd debian:10 进入debian终端docker exec -it vnt /bin/bash 换源（加速下载包）和更新/bin/bash -c 'echo -e "\ deb http://mirrors.163.com/debian/ buster main non-free contrib\n\ deb http://mirrors.163.com/debian/ buster-updates main non-free contrib\n\ deb http://mirrors.163.com/debian/ buster-backports main non-free contrib\n\ deb http://mirrors.163.com/debian-security/ buster/updates main non-free contrib" > /etc/apt/sources.list;\ apt update;\ apt upgrade -y;' 安装所需的包apt install -y curl git gcc npm nano 安装go1.14cd /usr/local/ && curl -O https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz tar -xvf go1.14.2.linux-amd64.tar.gz && rm go1.14.2.linux-amd64.tar.gz ln go/bin/go bin/go && ln go/bin/gofmt bin/gofmt && go env -w GOPROXY=https://goproxy.cn 安装vntgit clone https://github.com/vntchain/go-vnt ~/go/src/github.com/vntchain/go-vnt --depth 1 cd ~/go/src/github.com/vntchain/go-vnt/cmd/gvnt && go install . echo 'export PATH="$HOME/go/bin:$PATH"' >> ~/.bashrc && source ~/.bashrc 配置和启动一个测试节点1、生成一个见证人账户，记住账户地址和密码vntgvnt account new --datadir ~/vntnode 2、生成初始见证人的p2p地址，会打印在终端上，如：/ip4/127.0.0.1/tcp/30303/ipfs/1kHQwhd4kSVunUVPSbUH8av9FKLcrDYJDopjrwBYz9a9SDv，按ctrl+c结束gvnt --datadir ~/vntnode 3、移除临时数据gvnt目录，否则使用配置文件初始化节点时会失败rm -rf ~/vntnode/gvnt 4、使用前2步获得的账号和p2p地址创建创世块配置文件dpos.jsonnano ~/vntnode/dpos.json 修改三个字段：witnessesUrl 初始见证人p2p地址列表alloc 初始见证人余额分配witnesses 初始见证人列表模板：{"config": { "chainId": 1012, "dpos": { "period": 2, "witnessesNum": 1, "witnessesUrl": [ "/ip4/127.0.0.1/tcp/30303/ipfs/1kHQwhd4kSVunUVPSbUH8av9FKLcrDYJDopjrwBYz9a9SDv" ] } }, "timestamp": "0x5c2a3d00", "extraData": "0x", "gasLimit": "0x47b760", "difficulty": "0x1", "coinbase": "0x0000000000000000000000000000000000000000", "alloc": { "0a85b5e48a789edaa73a7c46e3396210c255df8d": { "balance": "0x200000000000000000000000000000000000000000000000000000000000000" } }, "witnesses": [ "0x0a85b5e48a789edaa73a7c46e3396210c2…

ontology 合约
type: item
date: 2020-06-12T10:36:00+00:00
description: ontology简称本体，是新一代公有基础链项目与分布式信任协作平台，提供智能合约支持。创建并运行debian10镜像docker run --name onto --restart always -p 20334-20336:20334-20336 -itd debian:10 进入debian终端docker exec -it onto /bin/bash 换源（加速下载包）和更新/bin/bash -c 'echo -e "\ deb http://mirrors.163.com/debian/ buster main non-free contrib\n\ deb http://mirrors.163.com/debian/ buster-updates main non-free contrib\n\ deb http://mirrors.163.com/debian/ buster-backports main non-free contrib\n\ deb http://mirrors.163.com/debian-security/ buster/updates main non-free contrib" > /etc/apt/sources.list;\ apt update;\ apt upgrade -y;' 安装所需的包apt install -y curl git gcc xxd 安装go1.14，设置go代理，默认的无法访问cd /usr/local/ && curl -O https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz tar -xvf go1.14.4.linux-amd64.tar.gz && rm go1.14.4.linux-amd64.tar.gz ln go/bin/go bin/go && ln go/bin/gofmt bin/gofmt && go env -w GOPROXY=https://goproxy.cn 安装ontologygit clone https://github.com/ontio/ontology ~/go/src/github.com/ontio/ontology -b v1.10.0 --depth 1 cd ~/go/src/github.com/ontio/ontology && go install . echo 'export PATH="$HOME/go/bin:$PATH"' >> ~/.bashrc && source ~/.bashrc 安装rustcurl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain nightly echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> ~/.bashrc && source ~/.bashrc rustup换源，加速下载/bin/bash -c 'echo -e "\ [source.crates-io]\n\ replace-with = "tuna"\n\ \n\ [source.tuna]\n\ registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"" > $HOME/.cargo/config;' 安装wasm编译器rustup target add wasm32-unknown-unknown cargo install --git=https://github.com/ontio/ontio-wasm-build 拉取rust版wasm工具和示例代码cd && git clone https://github.com/ontio/ontology-wasm-cdt-rust --depth 1 编译示例代码，编译出来的wasm文件在target/wasm32-unknown-unknown/releasecd ontology-wasm-cdt-rust && bash build.sh 生成测试钱包，需要输入密码，记住这个密码，启动节点和签名交易需要它，以123456密码为例cd && ontology account add -d 启动测试节点，使用-p参数指定密码或者按提示输入ontology --testmode -p 123456 在网站smartx.ont.io上部署wasm合约smartx.ont.io是本体在线开发合约工具，支持编辑、编译、部署等一站式服务，但是目前不支持wasm合约的编辑与编译，可以部署was…

parity 合约
type: item
date: 2020-06-11T10:39:00+00:00
description: parity是rust语言实现的以太坊客户端，现改名为openethereum，目标是成为最快、最轻和最安全的以太坊客户端。它和go版本的geth功能差不多，支持wasm虚拟机，但不自带cpu挖矿。一、环境构建创建并运行debian:10镜像docker run --name parity --restart always -p 8545 -itd debian:10 连接debian终端docker exec -it parity /bin/bash 换源（加速下载包）和更新/bin/bash -c 'echo -e "\ deb http://mirrors.163.com/debian/ buster main non-free contrib\n\ deb http://mirrors.163.com/debian/ buster-updates main non-free contrib\n\ deb http://mirrors.163.com/debian/ buster-backports main non-free contrib\n\ deb http://mirrors.163.com/debian-security/ buster/updates main non-free contrib" > /etc/apt/sources.list;\ apt update;\ apt upgrade -y;'安装所需的包apt install -y curl cmake g++ clang npm git nano 安装rustup来安装rustcurl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain nightly 把rustup添加到环境变量path并生效echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> ~/.bashrc && source ~/.bashrc rustup换源，加速下载/bin/bash -c 'echo -e "\ [source.crates-io]\n\ replace-with = "tuna"\n\ \n\ [source.tuna]\n\ registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"" > $HOME/.cargo/config;' 下载openethereum代码git clone https://github.com/openethereum/openethereum.git -b v3.0.1 ~/openethereum 编译并安装openethereumcd ~/openethereum && cargo install --path . --features final 安装wasm工具，添加wasm32-unknown-unknown和安装wasm-buildrustup target add wasm32-unknown-unknown && cargo install pwasm-utils-cli --bin wasm-build 二、合约下载wasm实例项目pwasm-tutorialgit clone https://github.com/openethereum/pwasm-tutorial.git --depth 1 ~/pwasm-tutorial 编译项目中的token合约,编译成功后，可以在目录~/pwasm-tutorial/step-5/target及其子目录json下分别找到wasm和abi文件cd ~/pwasm-tutorial/step-5 && ./build.sh 启动测试节点和导入测试账户，测试账户在创世时已经分配一些余额用于合约测试openethereum --chain ~/pwasm-tutorial/wasm-dev-chain.json --jsonrpc-apis=all & curl --data '{"jsonrpc":"2.0","method":"parity_newAccountFromPhrase","params":["user", "user"],"id":0}' -H "Content-Type: application/json" -X POST localhost:8545 安装web3和进入node交互控制台cd ~/pwasm-tutorial && npm install web3 && node 部署调用流程，进入node交互控制台，参考https://github.c…

EOS 基础
type: item
date: 2020-06-09T10:49:00+00:00
description: EOS，可以理解为Enterprise Operation System，即为商用分布式应用设计的一款区块链。EOS是一个新的高性能区块链平台，可以快速部署高性能和高安全性的区块链应用。有以下特色：支持免费交易极快出块速度（0.5s）短的区块确认（1.5s）WASM智能合约账户权限管理上下文无关交易并行验证一、EOS主网启动初始超级节点和创世节点选取、众筹活动代币冻结在EOS主网上线之前，超级节点社区将从成员里面挑选一批志愿参与上线候选池（Go-Live Pool）的技术精英。这个上线候选池中应该有大概50人。在上线之前，从候选池随机选出22个人组建一个上线小队（Go-Live team)。然后，他们开始建立高度加密互通的VPN 连接，以阻挡DDOS攻击及其他黑客攻击。EOS Token的众筹活动（以太坊ERC-20代币合约）截止在2018年的6月2日22:00，在这一刻，代币将被冻结。最后一刻会生成一个包含所有EOS Token数量的快照。快照需要被上线小队22名成员中的15人确认，随机选择22人中的1人作为创世节点，其余为初始超级节点。创世节点随机一个EOS密钥（创世密钥）。创世节点引导创建EOS区块链根据之前的包含EOS Token数量的快照和创世密钥建立EOS区块链上第一个区块（创世区块）。利用创世密钥和创世区块，创世节点启动，构建初始EOS区块链网络，自动根据创世密钥创建eosio系统账号。创世节点安装21个指定的初始超级节点，这些节点将负责进行首次超级节点投票选举。创世节点将系统的算力分配给这21个超级节点。将系统账号的权限从创世节点交给21个超级节点。接下来，创世节点将发布自己刚才使用的创世密钥（现在已无用）。超级节点选举、初始超级节点替换初始超级节点连接初始EOS区块链网络，并且对系统账户以及余额进行验证，然后开始生成区块。一旦21个指定节点都已经上线，EOS区块链网络初步启动成功，后面参与进来的人就可以相互连接了。上线小队中的剩余成员可以连接EOS区块链，并将自己置于超级节点候选人的位置上。EOS Token持币人也可以接入EOS区块链，并且用代币来换选票，用选票来进行超级节点的投票。初始超级节点的职责只有一个：组织选举，直到21个新超级节点产生。21个当选超级节点将进行几轮的区块生产来组织整个EOS主网，而上线小队中剩余的超级节点以候选者身份接入EOS主网，他们同样也可以参与EOS主网运行。就此主网已经启动就绪，已当选的21个超级节点对主网的普通交易进行处理，开始无尽的候选者选举、当选超级节点等流程。启动过程可以总结为两步：创建，配置和启动创世节点从单一超级节点过渡到21个超级节点二、账户模型相比其它的区块链简单的公私钥账户模型，EOS提供了完善的账户体系，包括自定义账户标识和权限管理等等。1、钱包钱包是一个用来存储私钥的地方使用钱包之前，需要先打开解锁钱包打开之后的钱包，有两种状态：解锁状态和锁定状态钱包，是一个超高强度加密的文件。失去钱包密码的话，意味着你丢失了钱包中的私钥2、账户类似各个APP上用户名，代表你身份的唯一标识，有以下几个特点：是一个可读的字符串，创建之后，存储在区块链中。长度为1到12个字符，字符可以包括小写字母a-z，数字1-5和点（.）（最后一个字符除外）。账户创建者自己选择命名。由排列组合得出共有 31×（32^n从0到11的和）=2^60−1=1,152,921,504,606,846,975个账户，10^18级别私钥控制，且可以更换，所以可以更换私钥来确保账户安全3、权限当一个账户创建的时候，具备了两种基本权限。每个权限绑定到一个公钥上（单签名账户）或多个公钥上（多签名账户），除了绑定公钥也可以绑定到另一个有效的账户上：owner：账号主权限, 声明的这个账号的归属。拥有这个权限的私钥需要严格保存，可以用来设置其他权限和其它所有操作。active：活动权限，顾名思议，这个权限一般用来做一些转账、投票、发起事务等常规操作。除了以上两种默认权限，还可以对账户自定义新的权限。在EOS节点上，账户权限使用数组的方式存储，每一个元素包括三个字段：权限名称、父权限名称、允许的权限，权限可以链接到其父权限，形成以owner为根的权限树，这就是在EOSIO中允许分层权限的原因。4、权限的阈值公钥的权重一个权限的许可需要公钥的权重不小于权限的阈值单签名账户：就是权限的阈值和钥匙的权重都为1的一种账户类型。使用某个权限，只需要一把对应的私钥就行了多签名账户：一个权限绑定了多个公钥，权限的阈值和每一个公钥的权重可以自定义，使用某个权限，需要多个公钥的许可且权重和不小于阈值注：这里的许可就是公钥对应的私钥签名三、资源模型EOS网络有3种资源可用，即RAM、CPU和NET，这些资源由21个超级节点决定和…

Go CGO入门
type: item
date: 2020-05-31T16:42:00+00:00
description: Go语言通过自带的一个叫CGO的工具来支持C语言函数调用，同时我们可以用Go语言导出C动态库接口给其它语言使用。一个简单的cgo程序：package main //#include <stdio.h> import "C" func main() { C.puts(C.CString("Hello, World\n")) } 通过import "C"语句启用CGO特性，同时包含C语言的<stdio.h>头文件。然后通过CGO包的C.CString函数将Go语言字符串转为C语言字符串，最后调用CGO包的C.puts函数向标准输出窗口打印转换后的C字符串。一、CGO基础要使用CGO特性，需要安装C/C++构建工具链，在macOS和Linux下是要安装GCC，在windows下是需要安装MinGW工具。同时需要保证环境变量CGO_ENABLED被设置为1，这表示CGO是被启用的状态。在本地构建时CGO_ENABLED默认是启用的，当交叉构建时CGO默认是禁止的。比如要交叉构建ARM环境运行的Go程序，需要手工设置好C/C++交叉构建的工具链，同时开启CGO_ENABLED环境变量。然后通过import "C"语句启用CGO特性。1、import "C"语句如果在Go代码中出现了import "C"语句则表示使用了CGO特性，紧跟在这行语句前面的注释是一种特殊语法，里面包含的是正常的C语言代码。当确保CGO启用的情况下，还可以在当前目录中包含C/C++对应的源文件。package main /* #include <stdio.h> void printint(int v) { printf("printint: %d\n", v); } */ import "C" func main() { v := 42 C.printint(C.int(v)) } 开头的注释中写了要调用的C函数和相关的头文件，头文件被include之后里面的所有的C语言元素都会被加入到”C”这个虚拟的包中。需要注意的是，import "C"导入语句需要单独一行，不能与其他包一同import；向C函数传递参数需要直接转化成对应C语言类型传递，如上例中C.int(v)用于将一个Go中的int类型值强制类型转换转化为C语言中的int类型值Go是强类型语言，所以cgo中传递的参数类型必须与声明的类型完全一致，而且传递前必须用”C”中的转化函数转换成对应的C类型，不能直接传入Go中类型的变量。通过虚拟的C包导入的C语言符号并不需要是大写字母开头，它们不受Go语言的导出规则约束。cgo将当前包引用的C语言符号都放到了虚拟的C包中，同时当前包依赖的其它Go语言包内部可能也通过cgo引入了相似的虚拟C包，但是不同的Go语言包引入的虚拟的C包之间的类型是不能通用的。这个约束对于要自己构造一些cgo辅助函数时有可能会造成一点的影响。2、#cgo语句在import "C"语句前的注释中可以通过#cgo语句设置编译阶段和链接阶段的相关参数。编译阶段的参数主要用于定义相关宏和指定头文件检索路径。链接阶段的参数主要是指定库文件检索路径和要链接的库文件。// #cgo CFLAGS: -DPNG_DEBUG=1 -I./include // #cgo LDFLAGS: -L/usr/local/lib -lpng // #include <png.h> import "C" 上面的代码中，CFLAGS部分，-D部分定义了宏PNG_DEBUG，值为1；-I定义了头文件包含的检索目录。LDFLAGS部分，-L指定了链接时库文件检索目录，-l指定了链接时需要链接png库。因为C/C++遗留的问题，C头文件检索目录可以是相对目录，但是库文件检索目录则需要绝对路径。在库文件的检索目录中可以通过${SRCDIR}变量表示当前包目录的绝对路径：// #cgo LDFLAGS: -L${SRCDIR}/libs -lfoo 上面的代码在链接时将被展开为：// #cgo LDFLAGS: -L/go/src/foo/libs -lfoo #cgo语句主要影响CFLAGS、CPPFLAGS、CXXFLAGS、FFLAGS和LDFLAGS几个编译器环境变量。LDFLAGS用于设置链接时的参数，除此之外的几个变量用于改变编译阶段的构建参数(CFLAGS用于针对C语言代码设置编译参数)。对于在cgo环境混合使用C和C++的用户来说，可能有三种不同的编译选项：其中CFLAGS对应C语言特有的编译选项、CXXFLAGS对应是C++特有的编译选项、CPPFLAGS则对应C和C++共有的编译选项。但是在链接阶段，C和C++的链接选项是通用的，因此这个时候已经不再有C和C++语言的区别，它们的目标文件的类型是相同的。#cgo…