识别冻结的ETP交易输出

由于支持链上储存机制onchain-deposit, 用户可以将冻结的ETP发送到任何地址,所以交易所和钱包服务商必须识别这种类型的交易输出。

如何识别冻结的ETP交易输出?

一个普通的P2PKH(支付到公钥哈希)输出脚本如下:

dup hash160 [ 376485d30ed4e7d051f215f5eeeff4732b1075c6 ] equalverify checksig

锁定的交易输出脚本如下:

[ 7062 ] numequalverify dup hash160 [ 4fd34a03c3e140700c9324202a335bda6b5fddc3 ] equalverify checksig

第一个方括号的内容决定区块的锁定时长,表示经过多少个(十六进制编码,小字节序)区块之后才能解锁。

锁定交易也会触发矿工创建的区块奖励交易。该交易有一个coinbase输入和一个锁定的输出。如果您希望定期付款或存款,请确保您只接受P2PKH交易输出。否则,ETP将被锁定长达一年。

解决方案

  • 解决方案1:
    编写代码来识别ETP的交易类型。我们建议使用如下的正则表达式来筛选脚本:
^dup\ hash160\ \[ ([a-f0-9]+)\ \]\ equalverify\ checksig$
  • 解决方案2:
    Metaverse钱包的改进版本已经在mvs.org上发布,并在github(#178)上提交了改进的源代码。
    在JSON响应中为以下命令添加了新的字段“locked_height_range”:
gettransaction
fetch-tx
listtxs
getblock

如果locked_height_range的值不为零,则意味着ETP输出为冻结的。

正常 的ETP输出示例::

{
"hash": "edfabf9651669645235ddeda824648409bf586b79722c4ebd54f6aaf53de58f8",
"height": "719299",
"inputs": [
{
"previous_output": {
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"index": "4294967295"
},
"script": "[ 03c3f90a ]",
"sequence": "0"
}
],
"lock_time": "0",
"outputs": [
{
"index": "0",
"address": "MEVgP8kvucyR9523t71FVKSiZccQjeK4ki",
"script": "dup hash160 [ 485810bf4d7c698938786c937aa12c467f8261a9 ] equalverify checksig",
"locked_height_range": "0", // 零值表示此 ETP 是正常的,没有冻结。
"value": "285240000",
"attachment": {
"type": "etp"
}
}
],
"version": "1"
}

冻结 的ETP输出示例:

{
"hash": "53e05539209c80bf36b9f729f4d8c0f240e55b320814fdb074029b6bd5d3e967",
"height": "676276",
"inputs": [
{
"previous_output": {
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"index": "4294967295"
},
"script": "[ 03b4510a ]",
"sequence": "0"
}
],
"lock_time": "676274",
"outputs": [
{
"index": "0",
"address": "MFBEjD9QwgTxnRiUGd2qXATYxcReyG5ZtB",
"script": "[ 7062 ] numequalverify dup hash160 [ 4fd34a03c3e140700c9324202a335bda6b5fddc3 ] equalverify checksig",
"locked_height_range": "25200", // 非零值,表示此 ETP 是冻结的,将在之后这么多个(此为25200)区块之后才会解锁。
"value": "9",
"attachment": {
"type": "etp"
}
}
],
"version": "1"
}