caivega / ipfslib

Other
2 stars 1 forks source link

S2 - jt_sendRawTransaction:同时发送多个底层币签名交易(同一发送接收地址),有的成功有的失败 #152

Open zyd82 opened 3 years ago

zyd82 commented 3 years ago

版本:v0.5.3-dev-20201220-1ca4d11e354ca988b4087eb9275355b4ec105d0c 测试用例:jt_sendTransaction_002000

1、用jt_signTransaction签名一个100个底层币的交易,获得如下签名交易

{
    "jsonrpc": "2.0",
    "method": "jt_signTransaction",
    "params": [
        {
            "from": "jPdx7mG595P6CowtGYbxRkik9HdWUWtB2J",
            "secret": "shhquPeZm7uQ6Rvjrqn6L2cR6H33u",
            "to": "js3MF5kQkTG6NBVj9HEiw9cFe4ckNvMYGg",
            "value": "100"
        }
    ],
    "id": 1
}
{
    "id": 1,
    "jsonrpc": "2.0",
    "result": [
        "1200002280000000240000000461400000000000006468400000000000000a7321034153eebb406b3593aa7f31a4908e56ed820031db87f4f2e868fb8e1686d5e1e374473045022100e12f4f937888131e3d6467c189a5aabca3e78ef5eeb13146bab5278961b1a79602202d949b11f6b7caac26896abaf13538ffc3fa2dfed23798c48b693d0bf9fbcd238114f8500d9a44fce19e8d873b0661a2be53557bb43c831417548b963584f5337addf78dbf78f188682a6ffe"
    ]
}

2、再用jt_signTransaction签名一个200个底层币的交易,获得如下签名交易

{
    "jsonrpc": "2.0",
    "method": "jt_signTransaction",
    "params": [
        {
            "from": "jPdx7mG595P6CowtGYbxRkik9HdWUWtB2J",
            "secret": "shhquPeZm7uQ6Rvjrqn6L2cR6H33u",
            "to": "js3MF5kQkTG6NBVj9HEiw9cFe4ckNvMYGg",
            "value": "200"
        }
    ],
    "id": 1
}
{
    "id": 1,
    "jsonrpc": "2.0",
    "result": [
        "120000228000000024000000046140000000000000c868400000000000000a7321034153eebb406b3593aa7f31a4908e56ed820031db87f4f2e868fb8e1686d5e1e37446304402203b55e30069be45473fc68d596c3797dbc51ea766489718a59929124686a2b32d022072619d12501da4510616dc04d75406a54544739be12bf450b81af8bbd5fc5e868114f8500d9a44fce19e8d873b0661a2be53557bb43c831417548b963584f5337addf78dbf78f188682a6ffe"
    ]
}

3、用jt_sendRawTransaction同时发送这两个签名交易,返回2个交易哈希

{
    "jsonrpc": "2.0",
    "method": "jt_sendRawTransaction",
    "params": [
        "1200002280000000240000000461400000000000006468400000000000000a7321034153eebb406b3593aa7f31a4908e56ed820031db87f4f2e868fb8e1686d5e1e374473045022100e12f4f937888131e3d6467c189a5aabca3e78ef5eeb13146bab5278961b1a79602202d949b11f6b7caac26896abaf13538ffc3fa2dfed23798c48b693d0bf9fbcd238114f8500d9a44fce19e8d873b0661a2be53557bb43c831417548b963584f5337addf78dbf78f188682a6ffe",
        "120000228000000024000000046140000000000000c868400000000000000a7321034153eebb406b3593aa7f31a4908e56ed820031db87f4f2e868fb8e1686d5e1e37446304402203b55e30069be45473fc68d596c3797dbc51ea766489718a59929124686a2b32d022072619d12501da4510616dc04d75406a54544739be12bf450b81af8bbd5fc5e868114f8500d9a44fce19e8d873b0661a2be53557bb43c831417548b963584f5337addf78dbf78f188682a6ffe"
    ],
    "id": 1
}
{
    "id": 1,
    "jsonrpc": "2.0",
    "result": [
        "981641D920C8CE0CCF0136A63093CFD7A51E7F0FBC706B119785A2699CCEADDD",
        "C8AF9A02EAD56E6FF354594C264DF37A421C95065E0F422FB5D78A258BA4DDE0"
    ]
}

4、2个交易哈希中只有一个能查询到交易信息,另外一个查不到交易。2个交易哈希的查询结果如下

{
    "error": "can't find transaction 981641D920C8CE0CCF0136A63093CFD7A51E7F0FBC706B119785A2699CCEADDD",
    "id": 1,
    "jsonrpc": "2.0",
    "result": "",
    "status": 140,
    "type": "tecNO_ENTRY"
}
{
    "id": 1,
    "jsonrpc": "2.0",
    "result": {
        "TransactionType": "Payment",
        "Flags": 2147483648,
        "Account": "jPdx7mG595P6CowtGYbxRkik9HdWUWtB2J",
        "Sequence": 4,
        "Fee": "10",
        "SigningPubKey": "034153EEBB406B3593AA7F31A4908E56ED820031DB87F4F2E868FB8E1686D5E1E3",
        "TxnSignature": "304402203B55E30069BE45473FC68D596C3797DBC51EA766489718A59929124686A2B32D022072619D12501DA4510616DC04D75406A54544739BE12BF450B81AF8BBD5FC5E86",
        "hash": "C8AF9A02EAD56E6FF354594C264DF37A421C95065E0F422FB5D78A258BA4DDE0",
        "Destination": "js3MF5kQkTG6NBVj9HEiw9cFe4ckNvMYGg",
        "Amount": {
            "value": "200",
            "currency": "SWT",
            "issuer": "jjjjjjjjjjjjjjjjjjjjjhoLvTp"
        },
        "date": 661853875,
        "inLedger": 550,
        "ledger_index": 550,
        "meta": {
            "AffectedNodes": [
                {
                    "ModifiedNode": {
                        "FinalFields": {
                            "Hash": "0000000000000000000000000000000000000000000000000000000000000000",
                            "Account": "jhCVwTcg5aYWMMdfDmwqYxBr5NMA1PDfyg",
                            "Sequence": 0,
                            "Balance": {
                                "value": "74900",
                                "currency": "SWT",
                                "issuer": "jjjjjjjjjjjjjjjjjjjjjhoLvTp"
                            }
                        },
                        "LedgerEntryType": "AccountRoot",
                        "PreviousFields": {
                            "Hash": "0000000000000000000000000000000000000000000000000000000000000000",
                            "Account": "jhCVwTcg5aYWMMdfDmwqYxBr5NMA1PDfyg",
                            "Sequence": 0,
                            "Balance": {
                                "value": "74890",
                                "currency": "SWT",
                                "issuer": "jjjjjjjjjjjjjjjjjjjjjhoLvTp"
                            }
                        }
                    }
                },
                {
                    "ModifiedNode": {
                        "FinalFields": {
                            "Hash": "0000000000000000000000000000000000000000000000000000000000000000",
                            "Account": "jPdx7mG595P6CowtGYbxRkik9HdWUWtB2J",
                            "Sequence": 4,
                            "Balance": {
                                "value": "98999460",
                                "currency": "SWT",
                                "issuer": "jjjjjjjjjjjjjjjjjjjjjhoLvTp"
                            }
                        },
                        "LedgerEntryType": "AccountRoot",
                        "PreviousFields": {
                            "Hash": "0000000000000000000000000000000000000000000000000000000000000000",
                            "Account": "jPdx7mG595P6CowtGYbxRkik9HdWUWtB2J",
                            "Sequence": 3,
                            "Balance": {
                                "value": "98999670",
                                "currency": "SWT",
                                "issuer": "jjjjjjjjjjjjjjjjjjjjjhoLvTp"
                            }
                        }
                    }
                },
                {
                    "ModifiedNode": {
                        "FinalFields": {
                            "Hash": "0000000000000000000000000000000000000000000000000000000000000000",
                            "Account": "js3MF5kQkTG6NBVj9HEiw9cFe4ckNvMYGg",
                            "Sequence": 0,
                            "Balance": {
                                "value": "1000500",
                                "currency": "SWT",
                                "issuer": "jjjjjjjjjjjjjjjjjjjjjhoLvTp"
                            }
                        },
                        "LedgerEntryType": "AccountRoot",
                        "PreviousFields": {
                            "Hash": "0000000000000000000000000000000000000000000000000000000000000000",
                            "Account": "js3MF5kQkTG6NBVj9HEiw9cFe4ckNvMYGg",
                            "Sequence": 0,
                            "Balance": {
                                "value": "1000300",
                                "currency": "SWT",
                                "issuer": "jjjjjjjjjjjjjjjjjjjjjhoLvTp"
                            }
                        }
                    }
                }
            ],
            "TransactionIndex": 0,
            "TransactionResult": "tesSUCCESS"
        }
    }
}

5、通过观察交易接收钱包的余额,也可以看到只有一个交易是成功了

caivega commented 3 years ago

看样上次讨论,我理解错了,我以为是两个IssueCoin交易,在一起sign, 一起sendRaw, 那个如果有问题是bug, 可是当前提出的问题,倒不是bug, 原因如下

因为我们发送交易(jt_sendTransaction)包括签署(jt_signTransaction), 需要填写sequence, 现在基本上都不填,实际上是节点自动获得发送帐户的sequence帮填进去了,而且如果一次发送中某个发送帐户有多条发送的话,sequence会自动+1,以保证发送成功,但是这种情况不适用多次调用的情形

上边贴子里边两次调用的结果是一样的,我特意比较了下,是一样的,因为sequence一样,其他参数也一样,所以这是一个一样的交易,所以在一起发到jt_sendRawTransaction的时候,第一个会成功,第二个会报错(因为已经发送过了)

建议的使用方式是,都在jt_signTransaction中签署,生成两个transactionBlob, 然后再使用jt_sendRawTransaction一起发送,这样就都会成功了

caivega commented 3 years ago

另外一个原因,也是因为jt_signTransaction只是一个本地调用(虽然调用的是节点的服务),不会影响节点的验证交易及处理交易的状态,所以,多次sign都是无状态调用

zyd82 commented 3 years ago

@caivega 也就是说用jt_signTransaction一个一个签署同一账户的交易,再用jt_sendRawTransaction一次性发送所有transactionBlob,这种操作是不支持的,对吧? 正确的做法应该是用jt_signTransaction一次性签署多个交易参数组,再用jt_sendRawTransaction一次性发送所有transactionBlob,这样子才行,对吧?