问道区块链_区块链学习_v0.0.2_持续更新。。。

本系列内容参考图

创建
共识网络
调用
部署
挖矿
消耗
编写
超级链组件
节点
多节点
账号
智能合约
合约账号
燃料耗品代币
开发者
区块

尊重原创,转载请注明出处https://blog.csdn.net/cc007cc009/article/details/102902294

尊重原创,转载请注明出处 - https://blog.csdn.net/cc007cc009/article/details/102902294

标题 版本号 作者 qq 技术栈版本号 IDE 官网
问道区块链_区块链学习_v0.0.2_持续更新。。。 v0.0.3 若布与宫合 8416837 protobuf3.10.1
golang1.13.4
LiteIDE protobuf
golang

前言

  • 简明的基础技术落地笔记;
  • 有兴趣的同学请一起讨论;
  • 难免纰漏,请斧正。

概念

Hash

  • Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
  • 哈希表是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映射到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈希地址或散列地址。作为线性数据结构与表格和队列等相比,哈希表无疑是查找速度比较快的一种。
  • 用途。身份验证和数字签名,——也称为“消息摘要”。

SHA-256

将任意数据编码为256位的二进制串。hash碰撞的概率极低。
Java代码

public class Sha256 {
    public static void main(String[] args) {
        String  data = "他是一个勇士。";
        getSHA256( data);
        getSHA256( data);
         data += " ";
        getSHA256( data);
    }
    /**
     * 利用java原生的类实现SHA256加密
     *
     * @param  data 加密后的报文
     * @return
     */

    public static String getSHA256(String  data) {
        MessageDigest messageDigest;
        String encodestr = "";
        try {
            messageDigest = MessageDigest.getInstance("SHA-256"); // 汇编
            messageDigest.update( data.getBytes("UTF-8"));
            encodestr = byte2Hex(messageDigest.digest());// 字节转16进制
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        System.out.println(String.format("%s%s%d",encodestr," 长度 === ", encodestr.length()));
        return encodestr;
    }

    /**
     * 将byte转为16进制
     *
     * @param bytes
     * @return
     */

    private static String byte2Hex(byte[] bytes) {
        StringBuffer stringBuffer = new StringBuffer();
        String temp;
        for (int i = 0; i < bytes.length; i++) {
            temp = Integer.toHexString(bytes[i] & 0xFF);
            if (temp.length() == 1) {
                stringBuffer.append("0"); // 补0
            }
            stringBuffer.append(temp);
        }
        return stringBuffer.toString();
    }

}

Output

c75c7b4b24d94e4f2686022d917654d21ade275bfbfab8976a7f8540e02af462 长度 === 64
c75c7b4b24d94e4f2686022d917654d21ade275bfbfab8976a7f8540e02af462 长度 === 64
a969eac9922e2b88f48ec1f8212c8a4a747292dca1ff785812005c55d7e7c237 长度 === 64

无中心化

  • 无管理员。数据库有管理员,而区块链没有。

Block

  • 记录。每写入记录,就是建立一个区块(Block)。

创世区块

第一个块。

块相关

  • 出块时间:区块产生的时间间隔。

节点

可看成是服务器。客户端为什么是服务器?举个栗子,互联网诞生之初,个人电脑经常充当服务器的角色。

DAG:Directed Acyclic Graph

有向无环图.有人提出用DAG的拓扑结构来存储区块,解决区块链的效率问题.
在这里插入图片描述

p2p广播

  • 节点向其它节点广播。节点通信基于加密的P2P网络,本质上和cs通信原理相同;局域网穿透技术采用NAT方案.
  • 对等网络,即对等计算机网络,是一种在对等者(Peer)之间分配任务和工作负载的分布式应用架构,是对等计算模型在应用层形成的一种组网或网络形式。因此,从字面上,P2P可以理解为对等计算或对等网络。
    在P2P网络环境中,彼此连接的多台计算机之间都处于对等的地位,各台计算机有相同的功能,无主从之分,一台计算机既可作为服务器,设定共享资源供网络中其他计算机所使用,又可以作为工作站,整个网络一般来说不依赖专用的集中服务器,也没有专用的工作站。网络中的每一台计算机既能充当网络服务的请求者,又对其它计算机的请求做出响应,提供资源、服务和内容。通常这些资源和服务包括:信息的共享和交换、计算资源(如CPU计算能力共享)、存储共享(如缓存和磁盘空间的使用)、网络共享、打印机共享等。P2P网络具有分散性、可扩展性、健壮性等特点,这使得P2P技术在信息共享、实时通信、协同工作、分布式计算、网络存储等领域都有广阔的应用。
    在这里插入图片描述
    在这里插入图片描述
  • 节点发现主流协议有Gossip以及KAD。
  • NAT技术是一种把内部网络(简称为内网)私有IP地址转换为外部网络(简称为外网)公共IP地址的技术,它使得一定范围内的多台主机只利用一个公共IP地址连接到外网,可以在很大程度上缓解了公网IP地址紧缺的问题.

超级链

百度超级链、Ethereum、EOS、Fabric.

Hyperledger

Linux基金会2015年成立了超级账本项目(Hyperledger)来推动跨行业区块链技术。并非声明一个单一的区块链标准,它鼓励通过社区来合作开发区块链技术,鼓励开源知识产权,采用随时间演进的关键标准。

Fabric

Hyperledger Fabric是Hyperledger区块链项目中的一员。像其他区块链技术一样,它有一个账本,使用智能合约,是一个由参与者共同管理他们的交易的系统。

共识

需要一种机制来认可运行在区块链上的行为(包括比特币的运营,亦或是运行在区块链上的其他业务),这种机制就是共识机制。

智能合约

英文即Smart Contracts.并不是人工智能(artificial intelligence)那个智能。萨博于1994年提出此概念。

  • 一个智能合约是一套以数字形式定义的承诺(commitment),包括合约参与方可以在上面执行这些承诺的协议。

Thomas Bocek. Digital Marketplaces Unleashed. Springer-Verlag GmbH. 2017-09-15: 169-184. ISBN 978-3-662-49274-1.

部署合约

由合约账号部署合约。

私钥

丢失将无法找回。

以太坊

运用数字货币和编程语言的结合解决问题。

EOS

Enterprise Operation System。“EOS是一个区块链开发平台,具有可扩展性强、支持大规模商业应用等特点。首先,EOS 采取DPoS共识算法及其他技术手段预期实现每秒百万级别交易请求,将能够支持数千个商业级的DAPPs。以太坊是一条公链,在以太坊链上运行的每一个应用都会消耗整条链的资源,但EOS 只是区块链基础架构,开发者可以自由地在 EOS 上创建公链,链与链之间不会影响彼此的资源使用,不会出现因个别应用资源消耗巨大而造成网络大面积拥堵。 其次,在 EOS 上转账与运行智能合约并不需要消耗 EOS代币,这将吸引更多的用户。 最后,EOS出现系统错误时,其“宪法”可用于区分此错误是否确实为BUG,判断社区的修复举措是否得当。”

提案

一种解决系统升级问题的机制。比如修改区块大小,升级共识算法。提案整个过程涉及 到发起提案、参与投票、投票生效三个阶段。

混盘技术

  • 混盘技术也称为多盘技术,将多个磁盘从逻辑上当作一个磁盘来处理,主要用于解决只支持本地单盘场景下数据库空间不够的问题(即扩展性问题),比如被广泛使用的LevelDB。目前对LevelDB的多盘扩展技术,大部分是采用了多个LevelDB实例的方式,也就是每个盘一个单独的LevelDB实例。
  • 多个LevelDB实例的方式好处是简单,不需要修改LevelDB底层代码,缺点是牺牲了多行原子写入的功能。在区块链的应用场景中,需要保证多个写入操作是原子性的特性。超级链改造LevelDB存储引擎本身,在引擎内部完成了数据文件的多盘放置,能够确保所有写入更新操作的原子性,从而能够满足区块链场景的交易原子性要求。

百度超级链中的平行链

  • 百度超级链通过系统合约方式创建平行链,平行链之间相互独立,拥有各自的账本和共识算法等模块,目前平行链之间共享p2p网络。不同的业务可以跑在不同的平行链上,起到了业务隔离效果,在使用平行链时,需要通过–name指定需要操作的平行链的名字。

utxo

UTXO(unspenttransaction outputs)是未花费交易输出。交易输出了,但是没花费出去,比如找零。

玩转开源组件 - 站在巨人的肩膀

XuperUnion

安装包部署

  • 环境 Ubuntu 18.04.2 || CentOS7
安装Golang
  • 命令
# 卸载旧的
sudo apt-get remove golang-go
sudo apt-get remove --auto-remove golang-go
# 下载
mkdir -p 下载目录;cd 下载目录
wget https://studygolang.com/dl/golang/go1.12.5.linux-amd64.tar.gz
sudo tar -zxvf go1.12.5.linux-amd64.tar.gz -C /usr/local
# 配置
sudo vim ~/.bashrc # centos vim /etc/profile
# 内容
export GOROOT=/usr/local/go              # 安装目录
export GOPATH=$HOME/go     # 工作环境 centos环境将$HOME改为/usr/local
export GOBIN=$GOPATH/bin           # 可执行文件存放
export PATH=$GOPATH:$GOBIN:$GOROOT/bin:$PATH       # 添加PATH路径
source ~/.bashrc
g++
sudo apt-get install g++ # Ubuntu 18 已预置
g++ --version # 查看g++是否安装,如果安装了则output:g++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
git
apt-get install git
程序
cd 预安装目录 # 存放源码的目录,在这里对源码make
git clone https://github.com/xuperchain/xuperunion
git clone https://gitee.com/baidu/XuperUnion # 更快
# 解压后
cd 根目录
make # 执行make后,等待 ...
cd output/ # 发现xchain、xchain-cli目录
  • 目录意义
目录名 功能 备注
node/ 根节点目录
-----/conf xchain.yaml:xchain服务的配置信息,plugins.conf: 插件的配置信息 防止冲突,部署时根据需要修改端口号
-----/data 数据的存放目录,创世块信息,以及共识和合约的样例
-----/-----/blockchain 账本目录
-----/-----/keys 此节点的地址,唯一性
-----/-----/netkeys 此节点的网络标识ID,唯一性
-----/-----/config 创始的共识采用tdpos模式,指定单一地址有权利出块
-----/logs 程序日志目录
-----/plugins so的存放目录
-----/xchain 服务的二进制文件
-----/xchain-cli 客户端工具
-----/wasm2c wasm工具
# cd到上文的output目录,执行下述命令
mkdir -p /home/app/blockChain/x;cp -r * /home/app/blockChain/x;cd /home/app/blockChain/x # 递归拷贝output里的全部文件至x目录

至此,XuperUnion程序准备完毕。

Docker部署 - 待续

链的初始化

创世

创建第一个区块

# 创建xuper链
./xchain-cli createChain # 客户端创建创世区块。若是共识搭建,请先配置再创建。
dump_chain # 丢弃命令

output log见下文,较长。

t=2019-11-17T11:29:18+0800 lvl=dbug msg="create block chain by contract" module=xchain from=xuper toCreate=xuper
t=2019-11-17T11:29:18+0800 lvl=info msg="ledger meta" module=xchain genesis_block= tip_block= trunk_height=0
t=2019-11-17T11:29:18+0800 lvl=trce msg="Start to ConfirmBlock" module=xchain
t=2019-11-17T11:29:18+0800 lvl=info msg="begin format genesis block" module=xchain
t=2019-11-17T11:29:18+0800 lvl=info msg="start to confirm block" module=xchain blockid=0d7d3ba836179b81f6e3887f3710f41e5807586678e26d36478f677feea7bd36 txCount=1
t=2019-11-17T11:29:18+0800 lvl=dbug msg="print block size when confirm block" module=xchain blockSize=1415 blockid=0d7d3ba836179b81f6e3887f3710f41e5807586678e26d36478f677feea7bd36
t=2019-11-17T11:29:18+0800 lvl=dbug msg="confirm block cost" module=xchain blkTimer="saveHeader: 0.15 ms,saveAllTxs: 0.61 ms,saveToDisk: 0.08 ms,total: 1.06ms"
t=2019-11-17T11:29:18+0800 lvl=info msg="ConfirmBlock Success" module=xchain Height=1
t=2019-11-17T11:29:18+0800 lvl=info msg="utxo total is estimated" module=xchain total=0
t=2019-11-17T11:29:18+0800 lvl=dbug msg="debug tx" module=xchain txid=92adc3e88be5cc5aec29baa17d11b78b9814b7279a1125f347ac83ad04b2bb17
t=2019-11-17T11:29:18+0800 lvl=dbug msg=txoutput module=xchain offset=0 addr=dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN amount=100000000000000000000
t=2019-11-17T11:29:18+0800 lvl=dbug msg="hit queryblock cache" module=xchain blkid=0d7d3ba836179b81f6e3887f3710f41e5807586678e26d36478f677feea7bd36
t=2019-11-17T11:29:18+0800 lvl=info msg="unconfirm table size" module=xchain unconfirmTxMap=0
t=2019-11-17T11:29:18+0800 lvl=dbug msg="autogen tx list size, before play block" module=xchain len=0
t=2019-11-17T11:29:18+0800 lvl=trce msg="  start to dotx" module=xchain txid=92adc3e88be5cc5aec29baa17d11b78b9814b7279a1125f347ac83ad04b2bb17
t=2019-11-17T11:29:18+0800 lvl=trce msg="    insert utxo key" module=xchain utxoKey=UdpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN_92adc3e88be5cc5aec29baa17d11b78b9814b7279a1125f347ac83ad04b2bb17_0 amount=100000000000000000000
t=2019-11-17T11:29:18+0800 lvl=dbug msg="autogen tx list size, after play block" module=xchain len=0
cd /home/app/blockChain/x/data/blockchain/xuper # 这里存储了创世区块信息。
cd data/blockchain/ # 查看链名,bcname,即xuper,使用./xchain-cli status查询bcname
节点
  • 创建节点.节点,区别于区块,它是一个客户端,矿工节点。
# 启动服务节点
nohup ./xchain &
ps aux|grep 'xchain' # 查看xchain进程

在根目录查看日志tail -f nohup.out -n 500

# check服务运行状况
./xchain-cli status -H 127.0.0.1:37101
head /home/app/blockChain/x/data/keys/address && echo # 当前节点的地址
  • 某些时候,--host 127.0.0.1:37101 或 -H 127.0.0.1:37101可以省略。
账户
# 创建普通用户, 包含地址,公钥,私钥
./xchain-cli account newkeys --output data/bob # 注意这里是cli,同创世区块的创建
# 在bob目录下会看到文件address,publickey,privatekey生成
head data/bob/* && echo # 展示公私钥对

output log

create account using crypto type default
create account in data/bob
  • 余额
./xchain-cli account balance --keys data/keys -H 127.0.0.1:37101 # 余额为100000000000051000000
覆盖原节点账户

如果data/keys里面已经有账户,但是想更新它,那么执行:

./xchain-cli account newkeys --output data/keys -f # -f 强制覆盖
cat data/keys/address && echo # /home/app/moreChain/x003 YjuXEdGX3Y82JWN38WW3uMybUvSHhExgd
跨节点操作
  • 转账
./xchain-cli transfer --to YjuXEdGX3Y82JWN38WW3uMybUvSHhExgd --amount 123 --keys data/keys/ -H 127.0.0.1:37101 # txid: 68e8ad93de23a0b38d9c6984e9349b54b81a686461149cfa370156d236bb89be # 需要等待几分钟才到账,测试环境,可能是要等块更新

交易地址

与用户数据挂钩的最小单元。地址可以是合约账号,也可以是由公钥生成的一个长度为33的字符串。

交易

  • 转账
# 查询地址,目标
cat data/bob/address && echo # fszZouvYxmyhdhV4AB3q4TfpzZd6ge1YP
# 转账命令
# --keys 从此地址 转给 --to地址 --amount 钱
./xchain-cli transfer --to fszZouvYxmyhdhV4AB3q4TfpzZd6ge1YP --amount 36 --keys data/keys/ -H 127.0.0.1:37101 # 转账后,日志输出交易id 7677e8dad33137b4161d4027d4f339de9b9c0f1d77ef96553672a13ea574e2d1 1d2c0c528b49beba1dca31f1e2238973aadd636b83997bf4214ccc31361cc274
# 根据id查询交易记录
# 可查询上一步生成的txid的交易信息
./xchain-cli tx query 1d2c0c528b49beba1dca31f1e2238973aadd636b83997bf4214ccc31361cc274 -H 127.0.0.1:37101

交易信息 - 36币

"txOutputs": [
    {
      "amount": "36",
      "toAddr": "fszZouvYxmyhdhV4AB3q4TfpzZd6ge1YP"
    },
    {
      "amount": "999964",
      "toAddr": "dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN"
    }
  ],

在这里插入图片描述
其中包含一个块id0c607121b1f182fb44b64442b1eaabd7048758e1bde030ffa4e264b7022fd3f9。下文图示一个块id:
在这里插入图片描述

# 查询区块
# 可查询上一步交易所在的block id信息
./xchain-cli block 56c8cf05c5347474847e31fd34a6f83c6a6d18083db202c31fc2906775b54b92  -H 127.0.0.1:37101

在这里插入图片描述截图中可见区块高度已达到85;

./xchain-cli status -H 127.0.0.1:37101
  • 多重签名交易
  • 确认该交易已经上链(标志是blockid不为空了)

多重签名

多重签名是指在数字签名中,有时需要多个用户对同一个交易进行签名和认证,例如某些合约账户下的数据需要多个人【授权】才能修改或转账。

区块链自身运行的参数升级

包括:block大小、交易大小、挖矿奖励金额和衰减速度等。

P2P多节点部署

概念
  • 选一个节点作为“bootNode”,其他节点启动前都配置这个“bootNode”的地址即可实现
  • 获取bootNode URL
./xchain-cli netURL get -H 127.0.0.1:37101 # output "/ip4/127.0.0.1/tcp/47101/p2p/QmVxeNubpg1ZQjQT8W5yZC9fD7ZB1ViArwvyGUB53sqf8e"
./xchain-cli netURL gen -H 127.0.0.1:37101 # 如果不是以默认配置启动的,我们需要先生成它的netUrl,然后再获取
具体部署
  • TDPoS共识的环境部署注意事项

【注意】修改完每个节点的创世块配置后,需要确认各节点的 data/blockchain 目录下内容为空。然后重新按照下述步骤,在各节点上【创建链】,启动所有节点,即完成TDPoS共识的环境部署.

  • 更新各节点配置vim data/config/xuper.json
{
    "version" : "1",
    "predistribution":[
        {
            "address" : "mahtKhdV5SZP4FveEBzX7j6FgUGfBS9om",
            "quota" : "100000000000000000000"
        }
    ],
    "maxblocksize" : "128",
    "award" : "1000000",
    "decimals" : "8",
    "award_decay": {
        "height_gap": 31536000,
        "ratio": 1
    },
    "genesis_consensus": {
        "name": "tdpos",
        "config": {
            # tdpos共识初始时间,声明tdpos共识的起始时间戳,建议设置为一个刚过去不久的时间戳
            "timestamp": "1548123921000000000",
            # 每一轮选举出的矿工数,如果某一轮的投票不足以选出足够的矿工数则默认复用前一轮的矿工
            "proposer_num":"3",
            # 每个矿工连续出块的出块间隔
            "period":"3000",
            # 每一轮内切换矿工时的时间间隔,需要为period的整数倍
            "alternate_interval":"6000",
            # 切换轮时的出块间隔,即下一轮第一个矿工出第一个块距离上一轮矿工出最后一个块的时间间隔,需要为period的整数配
            "term_interval":"9000",
            # 每一轮内每个矿工轮值任期内连续出块的个数
            "block_num":"200",
            # 为被提名的候选人投票时,每一票单价,即一票等于多少Xuper
            "vote_unit_price":"1",
            # 指定第一轮初始矿工,矿工个数需要符合proposer_num指定的个数,所指定的初始矿工需要在网络中存在,不然系统轮到该节点出块时会没有节点出块
            "init_proposer": {
                "1":["RU7Qv3CrecW5waKc1ZWYnEuTdJNjHc43u","XpQXiBNo1eHRQpD9UbzBisTPXojpyzkxn","SDCBba3GVYU7s2VYQVrhMGLet6bobNzbM"]
            }
        }
    }
}
  • 共识查询:./xchain-cli tdpos -h
  • 这些节点可以部署在同一主机,或者部署到独立主机(ip)。
mkdir -p /home/app/blockChain/x003;cp -r * /home/app/blockChain/x003;cd /home/app/blockChain/x003 # 递归拷贝output里的全部文件至x目录
sudo vim conf/xchain.yaml # 配置根节点,根节点自己也要配置
p2pV2:
  port: 47102
  # port: 47101
  bootNodes:
  - "/ip4/127.0.0.1/tcp/47101/p2p/QmVxeNubpg1ZQjQT8W5yZC9fD7ZB1ViArwvyGUB53sqf8e"
./xchain-cli createChain # 与上文一样,在新节点使用客户端创建创世区块.【注意】必须先配置bootNodes再创建新链(节点)才行。
cd /home/app/blockChain/x002/data/blockchain/xuper # 查看信息
# 如果已经create了3个节点,重启bootNode。方式见下↓
kill pid
cd 节点根目录
nohup ./xchain &

如果启动报错:error="error to connect to all bootstrap",请检查bootNodes.不同主机的节点注意ip.

  • 部署列表
路径 ip端口 是否bootNodes
/home/app/newChain/x002 192.168.0.xxx:37001
/home/app/blockChain/x002 192.168.0.xxx:37002
/home/app/moreChain/x003 192.168.0.xxx:37003

查看分支高度,检测全部节点是否关联

./xchain-cli status -H 127.0.0.1:37101
./xchain-cli status -H 127.0.0.1:37102
./xchain-cli status -H 127.0.0.1:37103
# 启动
cd /home/app/newChain/x002/;nohup ./xchain &
cd /home/app/blockChain/x002/;nohup ./xchain &
cd /home/app/moreChain/x003/;nohup ./xchain &
# 修改配置文件
vim /home/app/newChain/x002/data/config/xuper.json
vim /home/app/blockChain/x002/data/config/xuper.json
vim /home/app/moreChain/x003/data/config/xuper.json
	{
      "name": "xuper",
      "ledger": {
        "rootBlockid": "94248ef7a1c1e8b043d4621cc3cc1bf1eb15e74c9c4fdedded0cdee199cd84d2",
        "tipBlockid": "0917a9e90a7916c4bfd9de36485940b9190c06f87313769e9bc2c8cea5d45bc1",
        "trunkHeight": 733
      },

智能合约

合约账户
  • 自定义权限的链上标识符称为合约账号,通常分配一个或多个密钥或多个账号。不同权重账户的多中心化资产管理模式,不同账户角色也可以通过共同签名来更改权限。
  • 部署合约以及需要多方共同管理资产时,需要使用合约账户;其他应用场景下,普通账户与合约账户没有明显区别。
  • 为了部署实名合约,我们需要首先创建一个合约账号.随机选择个节点:/home/app/newChain/x002,这个节点的信息在上文有讲。
./xchain-cli account new --account 1234560123456789 --fee 1000 # 192.168.4.132节点创建合约账户tx===1130b45b1d1b953ddb1098878a1f87d6cdc4e8cb4ada9231fdeee241e85a451e。目录为/opt/soft/xuperunion/output

上述命令output↓

contract response: 
        {
            "pm": {
                "rule": 1,
                "acceptValue": 1.0
            },
            "aksWeight": {
                "dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN": 1.0 // 此ak作为文件data/acl/addrs的内容
            }
        }
        
The gas you cousume is: 1000
有可能有这一句 You need add fee
./xchain-cli account query -H 127.0.0.1:37101 # 查询合约账号,结果为null,说明没创建成功

在文档找到解决方案:遇到The gas you cousume is: XXXX, You need add fee 通过加--fee XXXX 参数附加资源,加上--fee 数值后,创建账号成功。

创建MrCheng,【复习】文章开头的转账。

./xchain-cli account newkeys --output data/MrCheng
head data/MrCheng/* && echo # 查看MrCheng的公私钥,上文也有讲
cat data/MrCheng/address && echo # 查询MrCheng的地址
./xchain-cli transfer --to k8BAsKrxKhZYLXrh45eb7j7FydzApYUDC --amount 201234 --keys data/keys/ -H 127.0.0.1:37101 # 转账到上文获得的地址,获得txid 56ccc04bc98db0a4c6c11a4d64117bce3c36f0d205a5b68bf631d06caaa445e5

给合约账号转账↓

./xchain-cli transfer --to XC1234560123456789@xuper --amount 201234 # 执行转账后,output 交易id b63b62defc70e3f98c538f77360a5d3cdeaeaaca544fafbe04106797f634646f。192.168.4.132交易id===b29e4013948c5f24702e9c36c02548c4ae2162be8cf9cf0c38e18ff278bc0d59

–from指定转账来源账号,默认地址是data/keys/address。原始交易多重签名multisig send时,将该来源地址的签名写在Initiator(发起人)的位置。

  • 另一种NewAccount方式:调用系统合约的方式,创建合约账号其实属于调用系统合约。描述文件如下↓
{
    "module_name": "xkernel",
    "method_name": "NewAccount",
    "args" : {
        "account_name": "1234098776890654",  // 说明:16位数字组成的字符串
        "acl": "{
        	\"pm\": {\"rule\": 1,\"acceptValue\": 1},
        	\"aksWeight\": {\"dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN\": 1}
        	}"  // 这里的address改成自己的address
    	}
}
  • 查询存在的合约账户
./xchain-cli account query # 传地址,默认 -H 127.0.0.1:37101
编译合约

实名合约

  • 服务器上的源码地址 /home/app/newChain/source/XuperUnion。记录地址,便于回顾。
cd /home/app/newChain/source/XuperUnion # 进入源码根目录
cd contractsdk/cpp/ # 进入编译目录
cp reserved/identity.cc example
./build.sh # 执行后可能会报Unable to find image 'hub.baidubce.com/xchain/emcc:latest' locally,请等待自动下载。【注意】脚本依赖从hub.baidubce.com拉取的docker镜像,请在编译前确认docker相关环境是可用的。
cd build # 发现identity.wasm

注意事项:
问:编译cpp合约出现 “Post http:///var/run/docker.sock/v1.19/containers/create: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?” 是什么原因?
答:这可能是因为用户安装docker后,没有创建docker用户组,或者当前运行的系统账号不在docker用户组中,可以尝试下面的命令:

sudo groupadd docker
sudo usermod -aG docker ${USER}  // 此处${USER}为你编译合约时使用的linux账号
service docker resteart
部署合约
  • 部署xunion源码里的合约
  • 官方脚本

#!/bin/bash
set -e
# check input parameter
if [ $# -lt 4 ]; then
        echo "usage: sh -x deployContract.sh accountName contractName contractNamePath args fee"
        exit
fi
accountName=$1
contractName=$2
contractNamePath=$3
args=$4
fee=$5
address=`cat ./data/keys/address`
# get testnet conf including ip:port and complianceCheck public key
source "./testnet.conf"
acl="./data/acl"
if [ ! -d "$acl" ]; then
    mkdir $acl
fi
addrs="./data/acl/addrs"
if [ ! -f "$addrs" ]; then
    touch $addrs
fi
echo $public_key > data/acl/addrs
echo "$accountName/$address" >> data/acl/addrs
./xchain-cli wasm deploy --account $accountName --cname $contractName -H $ip_port -m $contractNamePath --arg $args --output contractRawTx.out --fee $fee
./xchain-cli multisig get --tx ./contractRawTx.out --host $ip_port --output complianceCheck.out
./xchain-cli multisig sign --tx ./contractRawTx.out --output my.sign
./xchain-cli multisig send my.sign complianceCheck.out,my.sign --tx ./contractRawTx.out -H $ip_port

cp identity.wasm /home/app/newChain/x002/ # 拷贝上文编译好的合约到节点根目录
./xchain-cli wasm deploy --account XC1234560123456789@xuper --cname identity003 -H 127.0.0.1:37101 wasm/identity.wasm -a '{"creator":"MrChengMath"}' # cname:合约名称,字母开头;identity.wasm:合约代码;-a:参数,由合约确定,可以查看服务端源码确定功能,比如,将客户端参数存入数据库,即PutObject;

运行,来了

contract response: initialize identity contract success
The gas you cousume is: 148794
You need add fee

意思是请支付燃料(代币),在命令末尾加上--fee 148794
部署合约成功,响应:d225ee6ec6e58bea9e0f1206f3d3af757a29bd274c60202ebf32712f98b525f5(交易id)

./xchain-cli tx query d225ee6ec6e58bea9e0f1206f3d3af757a29bd274c60202ebf32712f98b525f5 # 查看部署结果:查询本次部署
调用合约

data/keys账户也可以调用合约。
也就是调用合约的函数
调用合约的Json模板,【内容与本例无关】

{
    "module_name": "wasm",
    "contract_name": "counter",
    "method_name": "increase", // 函数名称
    "args":{
        "key":"counter"
    }
}
  • 先查询合约账户的acl,然后修改
./xchain-cli acl query --account XC1234560123456789@xuper

output:

{
  "pm": {
    "rule": 1,
    "acceptValue": 1
  },
  "aksWeight": {
    "dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN": 1
  }
}

  • 新增
    identity_add.json
{
    "module_name": "wasm",
    "contract_name": "identity002",
    "method_name": "register_aks",
    "args":{
        "aks":"ak1,ak2"
    }
}
mkdir -p data/acl
vim addrs # 填入内容:XC1234560123456789@xuper/dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN 生成地址文件.dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN 对应合约账号里的ak.将需要收集签名的address写入该文件中.如果需要黄反服务背书,须在data/acl/addrs文件中写入黄反服务address.
# 1: 生成原始交易
./xchain-cli multisig gen --desc json/identity_add.json --host 127.0.0.1:37101 --output out/tx_add.out

报错:

contract response: register aks to identify contract success
The gas you cousume is: 83
The fee you pay is: 83
WriteFile error

解决办法:
创建目录out.再次执行。

# 2: 本地签名
mkdir sign # 如果没有这个目录会报错
./xchain-cli multisig sign --output sign/tx_add_my.sign --tx out/tx_add.out
./xchain-cli multisig get --tx out/tx_add.out --host 14.215.179.74:37101 --output out/complianceCheck.out
# 3: 交易发送
./xchain-cli multisig send sign/tx_add_my.sign out/complianceCheck.out --host 127.0.0.1:37101 --tx out/tx_add.out # send随后的两个参数分别为发起者的签名和acl的签名(acl中有多个AK时,用逗号连接多个签名文件)。执行成功后,返回响应TX id:59b4d44a25a304aa15069217be4b7ff85a5381f2719052d4e8864ff1a2bc1a69
./xchain-cli tx query 59b4d44a25a304aa15069217be4b7ff85a5381f2719052d4e8864ff1a2bc1a69

响应日志↓
原始交易

contract response: register aks to identify contract success
The gas you cousume is: 83
The fee you pay is: 1000
{
  "txid": "",
  "blockid": "",

签名

{
  "PublicKey": "{\"Curvname\":\"P-256\",\"X\":74695617477160058757747208220371236837474210247114418775262229497812962582435,\"Y\":51348715319124770392993866417088542497927816017012182211244120852620959209571}",
  "Sign": "MEQCIFYFeh2SfDfETkXeuGfMTbSLt1JeiY7v8k5VaMoGMAvOAiAgFBEWN+mMi76Pprn72JQXKPSCzKarP3u69WxEz5nGZw=="
}

  • 删除
    上文的合约是注册ak,那么现在删除ak,即不注册它们了。
    identity_del.json
{
    "module_name": "wasm",
    "contract_name": "identity002",
    "method_name": "unregister_aks",
    "args":{
        "aks":"ak1,ak2"
    }
}
# 1: 生成原始交易
vim identity_del.json # 填入上文json内容
./xchain-cli multisig gen --desc json/identity_del.json --host 127.0.0.1:37101 --output out/tx_del.out
# 2: 本地签名
./xchain-cli multisig sign --output sign/tx_del_my.sign --tx out/tx_del.out
# 3: 交易发送
./xchain-cli multisig send sign/tx_del_my.sign out/complianceCheck.out --host 127.0.0.1:37101 --tx out/tx_del.out # send随后的两个参数分别为发起者的签名和acl的签名(acl中有多个AK时,用逗号连接多个签名文件)。响应交易id:db3763d95cc6ec40ad237455ed9ed081dd30b45927fd3652131914b3e22952ad
# 检验是否成功执行,即是否删除了ak
./xchain-cli tx query db3763d95cc6ec40ad237455ed9ed081dd30b45927fd3652131914b3e22952ad # 

Response:


查询部署过的合约
./xchain-cli account contracts --account XC1234560123456789@xuper # 根据合约账号检索

响应↓

[
  {
    "contract_name": "identity001",
    "txid": "d225ee6ec6e58bea9e0f1206f3d3af757a29bd274c60202ebf32712f98b525f5",
    "desc": "TWF5YmUgY29tbW9uIHRyYW5zZmVyIHRyYW5zYWN0aW9u"
  }
]

查询账号的ACL
./xchain-cli acl query --account XC1234560123456789@xuper # account参数为合约账号名称

上述命令响应↓

{
  "pm": {
    "rule": 1,
    "acceptValue": 1 // 须达到的阈值
  },
  "aksWeight": {
    "dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN": 1
  }
}
查询余额
./xchain-cli account balance XC1234560123456789@xuper -H 127.0.0.1:37101 # output 258118

自己写合约

GRPC基础 Protobuf

查看Protobuf教程

撰写合约-写代码 请见智能合约教程

查看智能合约教程

测试环境

测试命令

  • 连接互联网测试机
  • 查询节点余额
    ./xchain-cli account balance dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN -H 14.215.179.74:37101 不推荐,建议自己搭建测试环境

操作指导

升级XuperUnion

版本升级时,需要更新为新版本的代码,并重新编译,然后将 plugins文件夹, 二进制文件xchain,xchain-cli 全部替换后全部重新启动即可,注意多节点模式下需要先启动bootNodes节点。

问答

客户端发送交易后,怎么查询是否成功上链。通过querytx判断tx状态还是有其他事件机制?支持事件通知么?

首先查询交易所在区块,然后查询区块是否在区块链主干上,如果交易所在区块在区块链主干上,表明此交易已经生效。事件通知暂不支持,后续有计划支持部分类型事务执行结果的事件通知。

密码学中椭圆曲线选择使用P-256的考虑?

首先,P-256曲线目前依然在密码学界被广泛使用。其次,这次开源的是我们的基础版本,而在xchain的代码架构下,密码学相关的模块是插件化使用的,密码学crypto模块是可以独立研发并集成进开源框架中的。同时,在ECDSA之外,也已开源了多重签名、EDDSA、环签名等多种签名算法。在尚未开源的版本中,通过可变签名算法,我们已经支持国密/NIST的多条椭圆曲线。最后,这些算法和曲线被支持混合使用,开发者可以自由选择他们认为安全的曲线和算法来保护自己的数字资产。所以,敬请期待百度xchain后续的密码学相关开源进展。

以太坊 - 待续

Cosmos - 待续

原创文章 60 获赞 8 访问量 4万+

猜你喜欢

转载自blog.csdn.net/cc007cc009/article/details/102902294
今日推荐