http://www.7klian.com

一文带你读懂如安在ChainX上陈设智能合约

ChainX 上的 XRC20
智能合约的陈设及挪用请参考 ChainX 钱包部门。
ChainX 智能合约的陈设即测试
· chainx_contractXRCTokenInfo
ChainX Dev 模式:
陈设于 ChainX 上的 XRC20 项目为:
   /// Flips the current state of our smart contract.
1. 配置合约代码相关
Substrate 作为第一个规模的技能框架,让开拓者可以或许专注于链的运行时逻辑,,而不消再耗费大量的时间精神构建区块链底层的基本设施。另外, Substrate 默认提供了许多成果模块,好比 Staking, Consensus, 利便框架利用者按照本身的需求举办自由组合和定制。合约模块就是个中的一个成果模块,不管是任何一条基于 Substrate 技能的独立链,照旧将来的平行链, 只要集成了合约模块,就可以成为一个智能合约平台。
· 挪用的要领中呈现异常,如利用未初始化存储
· gas_spent是耗损的 gas
    event_per_topic_cost: 1, // 合约中 event 每个topic耗损的Gas
该剧本默认利用 Alice 的私钥(见 ChainX Dev 模式的开头部门)执行。请留意执行该剧本至少需要期待已经出了150个区块后( Alice 才会具备资产执行生意业务)。
因为 ChainX 中put_code_per_byte_cost配置得较量大,因此合约陈设者应留意陈设合约时提供的 gas limit 是否足够。一般环境下应大于len(wasm) * put_code_per_byte_cost
[runtime|xrml_xcontracts::gas] [refund_unused_gas]|account:88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee (5SjUJPJJ…)|gas_payment:2500000|refund:0|real cost:2500000|gas_spent:500000
https://github.com/chainx-org/ChainX/wiki/wallet#ChainX
请查抄参数和合约代码,如:
2. 挪用进程中到达了 gas limit
钱包成果
   }
3. 合约无论是执行照旧要领的返回值都可以通过 RPC 在不打包的环境下挪用,发起合约开拓者可以先利用 rpc 挪用模仿合约执行环境
       self.value += by;  // 挪用未初始化的存储
chrome 插件安装地点:
XRC20 (原以太坊 ERC20)
    event_data_per_byte_cost: 20,  // 合约中 event 每字节耗损的Gas
辅佐开拓者陈设合约的东西:
2. 陈设合约代码相关
请留意在测试网和主网中,必然要将ext.print从合约中删除,可能利用条件编译节制
XRC20 项目
1. 以太坊代币合约已经较量成熟,因此对付合约开拓者在代币模子下可以较量容易的将以太坊合约迁移到 ChainX 智能合约平台上。
    fn deploy(&mut self) {
· 合约开拓独立陈设组件开拓调试合约
个中:
1. 合约实例已经存在,请勿反复实例化。
3. wasm 合约已经存在于链上,对付沟通的合约,不该该反复配置代码
利用代币模子而不是将多币种直接引入合约基于如下思量:
3. 挪用合约代码相关
由于 Substrate Contracts 智能合约平台模子与以太坊智能合约模子相似,对付多币种的处理惩罚是“本币+代币”模子。
· gas_payment为gas_limit*gas_price的值,是挪用者暂存的 PCX
[runtime|chainx_runtime::xexecutive|183L] [apply_extrinsic] failed: Can’t decode wasm code
selector 请必然凭据编译合约生成的的abi.json可能old_abi.json去挪用,若利用不存在的 selector 则会挪用不乐成。编码错误同理
    version: 0, // 设置版本
ChainX 上的 Substrate Contracts 智能合约平台
    max_table_size: 16 * 1024, // 合约中最大数据布局表数
1. 打消合约存储收费的设计。 合约存储收费简朴来说就是当合约陈设到链上今后, 按照该合约在链上所占存储的巨细和该存储的占用时间收取必然的用度,当合约账户因为余额不足无法支持存储用度时,合约就会被删除,甚至大概无律例复。 纵然合约被删除后可以规复,今朝的合约规复可操纵性也是极低,大概会对今朝的合约开拓造成极大的困扰。因此,我们今朝抉择临时打消合约存储收费,只收取合约挪用的 Gas 用度, 也就是与今朝的收费设计一致。当合约存储收费的模子成熟后,可以从头启用这个设计。
针对 XRC20,ChainX 已经提供了2个对应的 RPC 可举办操纵:
· real cost是真实耗损的PCX
ChainX 上的比特币 X-BTC

2. 在 Dev 模式下可以在合约中利用env.println,而在主网和测试网中必然要将合约中的env.println删除。
}
请参考 ChainX Dev 模式的相关说明:
}
       env.println(&format!(“Incrementer::inc by = {:?}”, by));
https://dapps.chainx.org.cn/contract
开拓者本身编写东西时,请必然在上传代码前通过 sdk 的相关接口查抄合约是否已经在链上。
    return_data_per_byte_cost: 1, // 返回值每字节耗损的Gas,因此对付合约见相互挪用应仔细设计这个值
        // not init value
若配置,陈设,挪用合约不乐成,可以参考如下问题列表:
    event_base_cost: 1, // 合约中每个event要耗损的基本Gas,譬喻每打一个event就要先淘汰这个值的Gas
相关链接:
3. 陈设到达了 gas limit
ink 合约编写相关资源:
    max_memory_pages: 16, // 合约执行中最大的页数
主网与测试网-道
· 实例化吸收的参数是 u128,可是通报已往的是 u64
[runtime|chainx_runtime::xexecutive|183L] [apply_extrinsic] failed: during execution|Failed to invoke an exported function for some reason|wrong selector, decode params fail or inner error

· 发放测试利用的假 X-BTC
· 适配关联范例 Call 以支持 PCX 转账和将跨链资产划转已往的 XRC20 Token 转回 ChainX 跨链资产, 合约开拓者可以基于 PCX 和 ChainX 的跨链资产设计本身的 Dapp。
针对这种模子,ChainX 的智能合约上的跨链资产回收合约代币模子,因此在 ChainX 上 PCX 将会雷同以太坊一样对智能合约提供 gas 及本币畅通的代价,对付 ChainX 上的跨链资产以合约代币的形式引入。
· Event 最多只能打4个,因此需要合约开拓者小心设计 Event。
https://github.com/chainx-org/ChainX/wiki/ChainX-Dev
· polkaworld-org/workshop: polkaworld 合约相关技能讲座
· substrate-contracts-workshop: ink 官方教程 
开拓调试合约
ChainX 资产中的多币种与合约中代币的转换
当前 ChainX 实现智能合约中的比特币回收 XRC20 模子,按照合约开拓者的反馈,未来也可回收其他尺度。今朝已经思量的代币模子有:
[runtime|chainx_runtime::xexecutive|183L] [apply_extrinsic] failed: during execution|Failed to invoke an exported function for some reason|reach gas limit
1. 获取链上指定的 XRC20-BTC 合约实例地点:

运行节点
    grow_mem_cost: 1,  // 单页中内存增值需要的Gas
留意该部门耗损指的是在合约中的 Gas 执行的耗损,真实付出的 PCX 还要再加上挪用合约要领的外部手续费。
ChainX 钱包:
1. 接入测试网
· 实例化一个合约的价钱稍大,因此发起合约开拓者只管重用已实例化过的合约实例
对付 ChainX Dev 节点而言,该合约没有被内置。因此若需要调试和智能合约上的比特币相关操纵,需要:
对付主网与测试网-道,该针对 X-BTC 的合约实例已经陈设且被配置完成。合约开拓者或用户只需要在合约平台上导入该项目中的abi 文件target/abi.json即可挪用合约。个中该XRC20的地点可以通过rpc chainx_contractXRCTokenInfo 获取到。
· 关联范例 Balance 从 u128 改为 u64.
https://github.com/chainx-org/ChainX/wiki/Join-ChainX-Testnet
与 Gas 相关的参数设置

当前 X-BTC 对应于智能合约平台中回收的代币模子为 XRC20。用户可以自由提倡生意业务让 ChainX 的 X-BTC 与合约平台中的 XRC20 相互转换。

    max_subject_len: 32, // 最大的PRNG subject数
4. 合约中含有ext.print,在本身测试能陈设,在测试网与主网上不能陈设
1. 合约开拓者在 ChainX Dev 节点下开拓调试合约,因为许多错误信息只会在节点日志中呈现。
当前 ChainX 智能合约中只支持
    max_stack_height: 64 * 1024, // 合约中栈的最大值
2. 参数通报错误,可能在实例化进程中瓦解,无法实例化
https://github.com/chainx-org/xrc20
我们强烈发起:
一些异常错误
对付陈设及挪用合约,请参考 ChainX 的钱包相关部门:
当前 ChainX 中默认的 Gas Price 为5
请通过 rpc 接口chainx_contractCall在非打包进程中去实验获得适合的gas limit,发起包围合约执行中最远的执行分支。
impl Incrementer {
2. 运行当地节点
测试请参考 ChainX Dev 模式|调试合约部门。
陈设及挪用合约
Schedule {
本次 ChainX 智能合约平台的主要实现方法就是集成 Substrate 的合约模块,并举办适配。ChainX 的合约成果与 Substrate 默认的合约模块主要区别如下:
ChainX 智能合约中多币种的实现方法
· tail -f log/chainx.log | egrep “xcontracts|apply_extrinsic”
    instantiate_base_cost: 200000, // 合约初始化(实例化)耗损的基本Gas
   pub(external) fn inc(&mut self, by: u32) {
当前钱包还未集成 XRC20 的 abi,因此需要开拓者手动添加。
完成相应设置后,请担保已经出块高出150个区块,因为150个块后才会对 Alice 发放第一条理嘉奖。
个中请寄望put_code_per_byte_cost,call_base_cost,instantiate_base_cost。因此在 ChainX 中:
· chainx_contractXRC20Call
· 挪用合约通报的 selector 不匹配,或参数编码错误
· 合约中的存储未初始化就举办加减操纵/溢出/有 panic 异常…
若需要重复测试,可以对高出150个块后的区块数据举办备份,若需从头启动,则只需要删除老数据目次,利用备份数据目次替换即可。
日志中与合约相关的日志均含有[runtime|xrml_xcontracts]字段,因此若只体贴合约及合约执行功效,只需要对日志 grep:
详细请参考代码
2. 若在合约中引入多币种的观念,将会极大修改 Substrate Contracts 的模子,容易引入非预期问题。
XRC777 (原以太坊 ERC777)
}
[runtime|chainx_runtime::xexecutive|183L] [apply_extrinsic] failed: Alive contract or tombstone already exists
因此需要调试是因为参数 /selector 错误照旧合约内部堕落,请在合约内部打日志即可鉴定
    sandbox_data_write_cost: 1, // 合约中写入一个字节耗损的Gas
2. 参考[合约成果部门|实例化合约]( wallet#2. 实例化合约(陈设合约))部门的第3节,通过“添加已存在的合约”的方法,将该 ERC20-BTC 合约地点的公钥填入,然后在 XRC20 项目中的target/abi.json的 abi 文件上传即可添加该合约实例。
除了以上两点窜改,在合约编写上与 paritytech/ink 保持一致,今朝合约写法仍然回收 ink1.0 的写法,后续我们将会进级利用 ink2.0.
ChainX 测试网:
[runtime|chainx_runtime::xexecutive|183L] [apply_extrinsic] failed: the code is already stored on chain
· 合约成果部门
impl Deploy for Incrementer {
[runtime|chainx_runtime::xexecutive|183L] [apply_extrinsic] failed: module imports `ext_println` but debug features disabled
· issue 只能被 Runtime 中的生意业务convert_to_xrc20挪用,不行通过直接挪用合约要领挪用。通过生意业务convert_to_xrc20挪用后,将会把该用户的资产转移到合约实例下,并在合约中对该发送生意业务的账户自动发放相应的金额。
    regular_op_cost: 1,  // 普通操纵符Op需要的Gas

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。