我们在收集交易签名时需要考虑哪些安全程序?

Which are the security procedures which we need to consider when we collect transaction signatures?

考虑以下情况: 节点 A 构建并签署发送给 B 进行签名的 TX。

class FlowA(val otherParty: Party) : FlowLogic<SignedTransaction>() {

    @Suspendable
    override fun call(): SignedTransaction {
        val notary = serviceHub.networkMapCache.getNotary()
        val builder = TransactionBuilder(notary)

        // ... add some commands and states

        val stx = serviceHub.signInitialTransaction(builder)

        val session = initiateFlow(otherParty)

        subFlow(SendTransactionFlow(session, stx))

        return session.sendAndReceive<SignedTransaction>(stx).unwrap {
            it.id == stx.id // is it enough?
            it
        }
    }
}

class FlowB(val session: FlowSession) : FlowLogic<Unit>() {
    @Suspendable
    override fun call() {
        subFlow(ReceiveTransactionFlow(session, false))

        val stx = session.receive<SignedTransaction>().unwrap {
            val ledgerTx = it.toLedgerTransaction(serviceHub, false)
            ledgerTx.commandsOfType<SomeContract.Commands.SomeCommand>().single()
            ledgerTx.verify()  // is it enough?
        }
    }
}

一旦我们收到完整签名的交易,仅检查来自发送方的交易 ID 是否安全?

我在文档中读到 id 是使用事务组件构建的根 Merkle 树,所以如果 otherParty 更改某些内容,id 会有所不同,对吗?

从接收方来看,检查交易中存在哪些命令是否安全,因此我们可以通过验证确定与该命令相关的合约是 运行?

收到交易后,您将能够查询所有输入、输出和命令。 通常,询问会在合同验证方法内发生。

是的,如果要更改任何内容,root ID 确实会更改。请注意,交易一旦签署就无法更改任何内容。

您可以寻找的其他事项是交易是否经过公证。

这取决于你的合同需要做什么,但是是的,你会检查交易中存在哪些命令,例如在发行证券时,您可能会检查是否只有一个发行命令存在。

您还可以检查命令是否已收到所需的交易对手签名。

如果您想亲自讨论,请随时参加其中一个办公时间会议 - https://www.corda.net/support/technical-office-hours/