Skip to content

andyYuanFZM/yccDemo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

YCC+平行链EVM合约使用教程

文档目录

- [文档修改记录](#文档修改记录)
- [文档阅读说明](#文档阅读说明)
- [术语介绍](#术语介绍)
- [背景介绍](#背景介绍)
- [主链和平行链环境部署](#主链和平行链环境部署)
- [EVM合约概述](#EVM合约概述)
- [合约部署调用](#合约部署调用)
- [应用和YCC平行链对接注意事项](#应用和YCC平行链对接注意事项)

文档修改记

版本号 版本描述 修改日期 备注
V1.0 1. 主链+平行链部署
2. NFT合约简单概述
3.通过remixIDE和小狐狸插件部署合约
4. 通过web3.js, truffle将一个以太坊上的应用部署到YCC平行链上
5. 对接注意事项
2022/06/03
V1.0 1. 增加通过JAVA-SDK部署调用ERC1155合约的例子 2022/07/08

文档阅读说明

  • 术语介绍:简单了解
  • 背景介绍: 简单了解
  • 主链和平行链环境部署:已经具备环境情况下,可忽略;还未部署的重点了解。
  • EVM合约概述: 了解下概念,文档中有NFT合约的样例,如果样例太简单满足不了业务需求,需要自己开发新合约的,可以重点了解
  • 合约部署调用:重点了解
  • 应用和YCC平行链对接注意事项: 重点了解,是项目中踩过的坑,了解过后可少走弯路。

术语介绍

序号 术语 缩写 解释
1 YCC主链 YCC主链采用POS33共识机制,共识效率高,且节点可随意加入和退出集群
2 平行链 平行链依附于主链,平行链之间通过名称来区分,平行链与平行链之间数据相互隔离, 平行链与主链之间通过grpc通信。
3 EVM 以太坊虚拟机的缩写,目前EVM算是区块链中最大的生态,很多链都支持EVM的能力,森田平行链也完全兼容EVM,通过EVM可以动态的部署智能合约进行计算
4 ERC721 运行在EVM中,服务于非同质化代币(NFT), 每个Token都是不一样的,都有自己的唯一性和独特价值,不可分割,可追踪。
5 ERC1155 运行在EVM中,也是服务于非同质化代币(NFT),相比于ERC721它同时还支持在一个合约中存储多个数字资产,支持一次性批量发行多个不同类型的的数字资产,支持在一次转账过程中转多个不同类型的数字资产。
6 交易组 把两笔及以上的交易放在一个组里一次性发送。
7 代扣手续费 将代扣交易和正常用户的交易打包进一个交易组中,代扣交易使用代扣地址签名,用于主链上手续费扣除。(适用于能过java-sdk和go-sdk对接的方式,不适用于web3.js对接方式)
8 SDK 封装了同区块链交互的接口和区块链通用方法(包括:公私钥生成,签名,交易构造等), 支持java-sdk, go-sdk, web3.js以及jsonrpc接口等

背景介绍

YCC公链和平行链都是基于Chain33区块链开发框架开发出来的,主链和平行链的的区别就是加载了不同的共识机制插件。

  • POS33共识插件:YCC主链共识插件,采用抽签投票方式pos共识算法.
  • PARA共识插件:平行链共识插件,平行链不是独立存在的,它依附于主链(上述的5种都是主链),利用主链的共识算法来保证其安全性,同时平行链实现交易执行分片,主链下可以挂很多不同名称的平行链,每条平行链只负责自己独立的业务。 平行链条数的增加不会影响主链的性能,也不会影响其它平行链的性能。 比如EVM合约运行在平行链上, 而主链上只对这些交易的原始信息做共识和存证,所以主链只做存证而不用做具体的计算性能就可以很高。

主链和平行链环境部署

说明

主链采用抽签投票POS共识机制, 抽签的目的是减少投票人的数量. 每轮进行两次抽签, 第一次抽出候选的出块人, 第二次抽出投票人. 然后由投票人对候选的区块制作人投票, 谁的票多谁就制作新区块. 为了全网共识安全性, ycc节点需要提前抵押部分ycc才有参与共识的资格. ycc采用vrf 算法抽签, 根据自己的密钥以及区块高度和其他公共信息, 计算一个随机数, 如果此随机数小于某个给定的数值, 表示抽取成功. 为了减少出块时间, 系统提前进行抽签和投票, 这样出块人可以提前准备好出块的数据. 无需在本轮等待抽签和投票数据. 通过以上机制 ycc 拥有较高的TPS。
主链区块链浏览器: 区块链浏览器地址
主链+平行链交易流程:

  • 交易在链下完成构造和签名,交易构造时需要在交易体中带上对应平行链的名称。
  • 签好名的交易通过平行链的jsonrpc接口发往平行链节点。
  • 平行链通过它和主链之间的grpc连接,将交易转发到主链节点,由主链打包区块共识后存入主链账本。
  • 主链区块生成后,平行链实时拉取新产生的区块,过滤出属于本平行链的交易(根据平行链名称), 送入虚拟机执行后并写入平行链账本。
    下面介绍主链节点和平行链节点的部署,智能合约部署和调用方法。

注: 支持在同一台服务器上同时部署BTY主链节点和BTY平行链节点(只要保证两者的jsonrpc和grpc端口不冲突即可)

主链节点同步:

待补充

平行链节点部署

待补充

EVM合约概述

合约运行在平行链的EVM虚拟机中, EVM虚拟机运行solidity语言编写和编译的智能合约。
Solidity语言更多信息, 请参阅 [Solidity中文官方文档]
下文[NFT合约说明]链接介绍基于EVM的ERC1155和ERC721两类非同质化通证合约最简单的使用。
合约的基本介绍 [NFT合约说明]

合约部署调用

根据应用层开发语言的不同,YCC平行链提供了多语言的SDK, 支持web3.js, java-sdk, go-sdk以及jsonrpc等方式接入区块链,用户根据实际的需求选择SDK

web3.js

YCC平行链除了兼容以太坊虚拟机(EVM),同时在接口上也做了适配, 完全兼容web3.js,小狐狸插件(metamask),truffle, remix等以太坊生态工具。
web3生态工具使用说明: [web3生态工具使用说明]

JAVA-SDK

适用于应用平台使用JAVA开发的情况,提供SDK对应的jar包,SDK里包含了公私钥生成,合约部署方法,合约调用方法,交易签名,交易查询,区块链信息查询等方法。
JAVA-SDK开发环境部署参考链接: [JAVA-SDK]

运行JAVA Demo程序
  • 调用 [BlockChainTest.java] 中的createAccountYCC方法,生成地址和私钥
  • 修改对应子目录下的ERC1155Test文件,将上一步生成的内容,分别填充到以下几个参数中,注意私钥即资产,要隐私存放,而地址是可以公开的
// 管理员地址和私钥
String managerAddress = "";
String managerPrivateKey = "";
    
// 代扣地址和私钥,用于所有用户的手续费代扣,避免用户接触燃料费这一底层概念
String withholdAddress = "";
String withholdPrivateKey = "";
  • 给上述两个地址下充值测试用的燃料
  • 修改ERC1155Test文件中以下两个参数
// 改成自己平行链所在服务器IP地址
String ip = "";
// 改成自己平行链服务端口,对应的是配置文件里的jrpcBindAddr配置项,默认的是8921。 注意:如果远程访问,防火墙要放行此端口
int port = 8921;
  • 修改平行链名称
// 改成和实际部署的平行链一致,注意最后的.号不能省去
String paraName = "user.p.mbaas.";
  • 运行测试程序

GO-SDK

适用于应用平台使用Golang开发的情况,SDK里包含了公私钥生成,合约部署方法,合约调用方法,交易签名,交易查询,区块链信息查询等方法。
GO-SDK的使用参考链接: [GO-SDK]

JSONRPC接口方式

https://github.com/33cn/chain33-sdk-go/blob/master/doc/jsonrpc%E6%95%B0%E6%8D%AE%E4%B8%8A%E9%93%BE.md

应用和YCC平行链对接注意事项

由于YCC主链涉及燃料费,同时YCC主链平均每1-3秒一个确认的特性,可能会存在交易的失败,主要有以下两大类情况:

  1. 交易上链了,但交易执行失败(有返回交易hash): 这类交易通过了mempool(交易缓存池)的合法性检查,但是在合约执行过程中失败了( 比如转移了错误数量的NFT)。
  2. 交易没有上链(没有返回交易hash,rpc接口直接返回出错信息): 这类交易在mempool的合法性检查中没有通过,包括以下以类错误:
    • 签名错误(ErrSign): 签名校验不通过,一般不会遇到,除非人为去改交易内容。 -- 不常见
    • 交易重复(ErrDupTx):mempool中发现重复交易,一般不会遇到,除非人为发送重复交易(所谓重复是hash完全一模一样的两笔交易,而不是指业务上数据相同)。 -- 不常见
    • 手续费不足: 代扣地址下手续费不足会导致交易无法上链,需要保证代扣地址下GAS费充足。 -- 有可能会遇到
    • 手续费太低(ErrTxFeeTooLow): 交易设置的手续费比链上要求的手续费低,常见于部署EVM合约或批量发行大量NFT的场合, 需要通过queryEVMGas预估计出一个GAS费,然后在这个基础上再加上0.001作为手续费,这样能保证交易不会上链失败。 -- 有可能遇到,参考用例中手续费设置方式
    • 交易账户在mempool中存在过多交易(ErrManyTx): YCC为防止来自于同一个地址的频繁交易,限制每个账户在mempool中的最大交易数量不能超过100, 所以当交易频率很高时,mempool中代扣手续费的交易(都是来自同一个代扣地址)可能会超过100的, 而100笔以后的交易会被丢弃(rpc返回errmanytx的错)从而导致关联的交易也被丢弃。 -- 有可能会遇到

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published