4.常见问题解答
4.1 区块链相关
4.1.1 什么场景适合使用区块链
区块链集成了密码学、共识算法、智能合约等技术,具有分布式、不可篡改、公开透明等特点,适合存证、溯源、投票治理、数据共享、身份验证等场景。
4.1.2 什么数据适合上链
区块链作为复杂的分布式系统,处理性能上限较低,同时链上存储资源昂贵且数据公开透明,因此建议遵循以下原则:
文件链下存储,哈希上链;
批量数据链下存储,处理结果上链;
复杂逻辑链下处理,计算结果上链;
隐私数据链下处理,公开数据上链。
4.1.3 如何设计好的链上智能合约
逻辑与数据分离:
从业务视角来看,智能合约只需要做两件事,一是定义数据的结果和读写方式,二是处理数据并对外提供服务接口。为了更好的做好模块抽象和合约结构分层,将业务控制逻辑和数据从合约代码层面做好分离,即将合约分为控制器合约与数据合约,被认为是比较好的设计模式。
控制器合约专注于对数据的逻辑处理和对外提供服务,通过访问数据合约获得数据,并对数据做逻辑处理,然后写回数据合约。
数据合约专注于数据结构定义与所存储数据的读写裸接口。
保持智能合约的简洁:
单个合约的行数建议控制在1000行以内。
确保合约逻辑简洁,只在系统中的去中心化部分使用智能合约实现。
对可能的错误有所准备:
可能存在交易执行超过1s甚至1分钟的情况。
合约可能存在bug或被攻击的情况,合约设计需要考虑冻结或暂停合约的开关。
合约可能会被其他人调用,如果合约的某个方法不希望其他人调用,需要在合约内做好权限控制。
4.2 星火链相关
4.2.1 什么是许可公有链
见星火链的定位。
4.2.2 星火链上是否可以发token
星火链作为“许可链”,链上合约运行以及用户行为合法性受到相关方的严格监管,任何人不得以任何形式发token, 否则需要付相关的法律责任。
4.3 星火令相关
4.3.1 星火令有什么作用
交易在上链的时候需要消耗服务器的存储和计算资源,为了防止链上出现大量“垃圾”交易,我们设计了类似于以太坊gas的星火令。
4.3.2 星火令如何获取
通过插件钱包获取个人可信认证的用户可以在星火服务平台获取体验网的星火令。体验网星火服务平台地址:
登录开放平台]后可以领取体验网的星火令。开放平台地址:
4.3.3 链上交易费用如何扣除
见交易费扣除规则。
4.3.4 上链时交易费用如何设置
见交易费用设置建议。
4.3.5 如何降低交易星火令的消耗
对于Solidity合约,无法降低星火令的消耗;
对于JS合约,可以试用合约压缩工具,将合约进行压缩,从而减少部署合约交易星火令的消耗。
4.3.6 可信认证申请多久可以通过审核
体验网的个人可信认证一般一周会审核1-2次,着急的话可以加入星火链技术交流群联系技术人员尽快处理,企业认证需要加入星火链技术交流群联系业务人员尽快处理。
4.4 常见错误
4.4.1 Failed to connect to the network
连接节点失败,确认节点是否运行正常,以及配置地址是否正确。
4.4.2 balance(xxx) - base_reserve(0) is not enough for payment
Account(did:bid:efnVUgqQFfYeu97ABf6sGm3WFtVXHZB2)'s balance(48145674) - base_reserve(0) is not enough for payment (100000000)
账号余额不足,需要获取更多的星火令,见星火令如何获取。
4.4.3 reserve balance(xxx) - transaction(xx) fee limit(xxx) < base reserve(0)
Account(did:bid:efL9pEFZzyK6ysPGZ5XwdYPcii7Tmvpd)'s reserve balance(1068101007) - transaction(1dea4d6d) fee limit(10691018641) < base reserve(0)
feelimit设置大于账户余额,需要调整feelimit。
4.4.4 Transaction nonce(4) too small
Transaction nonce(4) too small, the account(did:bid:efBdagu8sVkJWEw5kLt1w69bxa85Kuag) nonce is (5)
nonce值错误,当前nonce
=5的基础上+1,发起下一笔交易。建议使用随机nonce功能。
4.4.5 Received duplicate transaction message
Received duplicate transaction message. The transaction's source address is did:bid:efnVUgqQFfYeu97ABf6sGm3WFtVXHZB2, and hash is d0cd3c87
相同交易处理策略,交易池中存在一笔完全相同的交易(交易hash)一致,则直接插入失败。建议使用随机nonce功能。
4.4.6 Drop the transaction to insert queue because of low fee
某个源账户发的交易,nonce
相同,其它参数存在差异,入交易池失败,需要调整nonce重新发送。建议使用随机nonce功能。
4.4.7 signature weight is not enough…
Transaction(0f3c99381b7bca967bcad2b55d396ff33b375c9aea1cda024f7b705aea1a2e5c) signature weight is not enough..
验签失败,签名私钥或者签名本身不正确。
4.4.8 EVMContract Execute VMException OutOfGas..
交易费用不够,需调整freelimt。见交易费用设置建议。
4.4.9 nodejs-sdk Number类型参数问题
为了保证数字精度,请求参数中的Number
类型,全都按照字符串处理,例如: amount = 500
,那么传递参数时候就将其更改为 amount ='500'
字符串形式。
4.4.10 创建合约消耗星火令过大问题
sdk中gasprice
默认值100
,建议手动设置为1, 基于许可的考虑,目前创建合约是基础创建操作消耗的星火令 + 合约消耗的星火令,使用完再申请就可以了。
4.4.11 remarks长度问题
sdk中remarks
为选填字段,长度[0,256k]。
4.4.12 js合约调用异常
{"contract":"did:bid:efspy6btdcuzP5BH2N899Ycti5Sd7n3z","exception":"SyntaxError: Unexpected token \r in JSON at position 1457","linenum":34,"stack":"SyntaxError: Unexpected token \r in JSON at position 1457\n at JSON.parse (<anonymous>)\n at main (__enable_check_time__:83:22)"}
input参数格式校验,需校验JSON规范。
4.4.13 EVMContract RevertInstruction
solidity合约内部异常,需要在合约内添加异常信息,根据合约内的异常信息判断具体的异常,例:
require(!_exists[id], "data has exists");
4.4.14 Length of the key should be between [1,1024].key=XXXXX…XXXXX”,key.length=1248
key
的长度超过1024Byte
限制。
4.4.15 Length of the value should be between [0, 262144]. key=XXXX…XXX,value.length=307200
value
的长度超过256KB
限制。
4.4.16 Step exceeding limit
合约循环处理深度超过1024
限制。
4.4.17 Too many recursion
合约递归调用深度超过4
层限制。
4.4.18 value type error, only support string or bool
JS合约查询方法的返回值只支持string和bool两种类型,需要在合约中做类型转换处理:
function query()
{
let num = 1;
return String(num);
}
4.5 其他
4.5.1 智能合约支持什么语言?
智能合约目前支持JS
、Solidity
。
4.5.2 合约设置初始化星火令InitBalance作用
合约之间调用需要消耗星火令,JavaScript
合约中Chain.payCoin(address, amount[, input])
,支持合约账号余额的转账。
4.5.3 交易查询
访问星火网区块链浏览器
体验网:http://test-explorer.bitfactory.cn
正式网:https://explorer.bitfactory.cn
查询示例:
4.5.4 插件钱包是否支持合约创建?
暂不支持。
4.5.5 如何存储对象数据?
链上以key-value
的键值对形式保存数据,可以使用Chain.store(id,JSON.stringify(str))
其中参数str
可以是一个json
格式的字符串。
4.5.6 关于账号可信认证问题
账户没有经过可信认证的话就不能发交易,体验网现在是放开的,正式网必须通过认证才可以发交易。
4.5.7 SDK 发送交易后返回成功,但实际执行失败
区块链交易的执行是异步的。SDK返回的成功信息指的是链交易池成功接收到该交易。 获取查看交易实际结果的方式:
根据交易哈希调用SDK交易信息查询接口查询该交易,解析出结果。
根据交易哈希在区块链浏览器查询结果。
也可以SDK结合订阅服务一起使用,订阅交易的源账户地址,这样无论交易成功处理还是超时丢弃都会有订阅消息返回。
4.5.8 SDK 发送交易后返回交易hash, 但到链上查询不到交易结果
交易提交到交易池后就会返回交易hash, 但并不一定代表交易一定会上链,可能因为当时链上交易较多执行不过来导致交易超时被丢弃,也可能因为提交的nonce值过大导致交易超时被丢弃,建议SDK结合订阅服务一起使用,订阅交易的源账户地址,这样无论交易成功处理还是超时丢弃都会有订阅消息返回。