比原链向大家分享了比原链(Bytom)合约交易构造流程,其中包含比原链,Bytom,合约交易等知识点,遇到此问题的同学们可以参考下
equity合约简介
equity是bytom用于表达合约程序而使用的高级语言,主要用于描述bytom链上特定的资产:
·区块链上的所有资产都是锁定在合约program中, 资产值value(即UTXO)一旦被一个合约解锁unlock,仅仅是为了被一个或多个其他合约来进行锁定lock。
·合约保护资产value(即UTXO)的方式是采用执行虚拟机并通过verify指令来验证的交易要花费这个资产value是否达到了我的条件。
合约组成
contract ContractName ( parameters ) locks value { clauses }
·ContractName 合约名,用户自定义
·parameters 合约参数列表,其类型名必须符合合约语言的基本类型
·value 资产值(即UTXO的资产类型和对应的值)标识符,用户可以自定义
·clauses 条款(即函数)列表(一个或多个)
条款(函数)组成
clause ClauseName ( parameters ) { statements }
或
clause ClauseName ( parameters ) requires name : amount of asset { statements }
·ClauseName 条款/函数名,用户自定义
·parameters 条款/函数参数列表
·payments 花费UTXO需要的其他限制条件。例如进行币币交易的时候需要验证交易的另一方能够提供对应的资产值,该限制条件的使用场景主要为不同资产类型的合约交易
语句组成
statements 合约语句(一条或多条),代码语句只能是verify、lock和unlock
·verify语句 模式如verify expression,其中expression的结果必须是bool类型,为true才能继续往下执行
·unlock语句 模式如unlock value,其中value表示对应的资产值
·lock语句 模式如lock value with program,其中value表示对应的资产值,而program必须为Program基本类型
合约的基本类型:(Time类型暂已停用) Amount Asset Boolean Hash Integer Program PublicKey Signature String
内置函数:(涉及时间的内置函数before和after暂已停用,替代方法为验证区块高度的函数below和above)
·abs(n) 返回数值n的绝对值.
·min(x, y) 返回两个数值x和y中最小的一个.
·max(x, y) 返回两个数值x和y中最大的一个.
·size(s) 返回任意类型的字节大小size.
·concat(s1, s2) 返回连接两个字符串s1和s2生成新的字符串.
·concatpush(s1, s2) 将两个字符串类型的虚拟机执行操作码s1和s2连接起来(即将s2拼接在s1的后面),然后将他们push到栈中. 该操作函数主要用于嵌套合约中.
·below(height) 判断当前区块高度是否低于参数height,如果是则返回true,否则返回false.
·above(height) 判断当前区块高度是否高于参数height,如果是则返回true,否则返回false.
·sha3(s) 返回byte类型字符串参数s的SHA3-256的哈希运算结果.
·sha256(s) 返回byte类型字符串参数s的SHA-256的哈希运算结果.
·checkTxSig(key, sig) 根据一个PublicKey和一个Signature验证交易的签名是否正确.
·checkTxMultiSig([key1, key2, ...], [sig1, sig2, ...]) 根据多个PublicKey和多个Signature验证交易的多重签名是否正确。
合约交易构造流程
合约参数构造
合约参数主要涉及两个方面,一个是编译合约contract中的参数,另一个是解锁合约clause中的参数。合约的基本类型已做简单描述,对应编译合约的API接口compile中参数类型只有如下3种:
·boolean - 布尔类型的合约参数,对应的基本类型是Boolean.
·integer - 整数类型的合约参数,对应的基本类型包括:Integer、Amount.
·string - 字符串类型的合约参数,对应的基本类型包括:String、Asset、Hash、Program、PublicKey.
注意事项:
·编译合约API接口compile只需要使用contract中的参数
·解锁合约只需要提供clause中的参数
·Signature类型只能在clause的参数列表中出现,不能出现在编译合约的API中
·所有string类型的字符串都是必须以十六进制字节的string形式出现,否则调用编译合约API的时候会报错
如果合约参数中有Publickey和Signature(配套使用),那么获取这些参数需要调用list-pubkeys接口获取。Signature只能出现在clause中,表示该参数仅仅在解锁合约的时候才会被使用,由于目前对交易的签名必须通过sign-transaction接口才能获取签名结果,所以解锁的时候只需提供签名的参数root_xpub和derivation_path即可,需要注意的是这些参数需要跟验证签名pubkey匹配起来,否则合约也会执行失败。
其中list-pubkeys的参数如下:
String - account_id, 账户ID.
其请求和响应的json格式如下:
// Request
{
? "account_id": "0G1JIR6400A02"
}
// Result
{
? "pubkey_infos": [
? ? {
? ? ? "derivation_path": [
? ? ? ? "010100000000000000",
? ? ? ? "0300000000000000"
? ? ? ],
? ? ? "pubkey": "c37d5531f393bc6a3568628c0c0e17801ea452e75d604deb01403c4b161659a3"
? ? },
? ? {
? ? ? "derivation_path": [