我有一個狀態SomeBond,我想在 Corda 網絡上發布和交易。當參與者 A 將SomeBond狀態轉移給參與者 B 時,期望是 A 從 X 獲得狀態,或者 A 被發布SomeBond(假設是 Y)。為了驗證這一點,B 運行與交易中所有狀態相關的合約。預期的合同是SomeBondContract,但 B 不能保證它會運行。為確保此事務中的狀態將運行SomeBondContract,他必須在簽名之前實際在流程中進行檢查。val outputsLegit = stx.tx.outputs.all { it.contract == "com.example.SomeBondContract" }
val inputsLegit = stx.tx.toLedgerTransaction(serviceHub).inputs.all { it.state.contract == "com.example.SomeBondContract" }但是,如果他只在流程中進行檢查,那么它只會驗證當前的交易。我們仍然不能確定之前的交易(C 將狀態發送給 A)是否具有分配給其輸入狀態的相同合約。也許它是這樣的:C 創建一個事務 (101):輸入(空)輸出:SomeBondState,合同 ID:com.example.EmptyContract然后創建事務(102):輸入:101[0]輸出:SomeBondState,合同 ID:com.example.SomeBondContract并使用該交易的輸出(即 102[0])作為向 B 轉移的輸入。這里的問題是 C 從來不是 的合法發行人SomeBondState,而且交易本不應該發生,但由于他給國家分配了一份錯誤的合同,他毫無問題地創造了它。防止這種情況的一種方法是在合同中也進行相同的檢查。這樣,流程可以檢查當前交易是否具有分配給其狀態的合約,并且合約本身可以檢查輸入狀態是否具有分配的合約。這樣,交易 102 永遠不會成功,因為它有一個類型的輸入,SomeBondState但沒有 acom.example.SomeBondState作為合同。由于依賴關系圖在出現問題之前被遞歸驗證,因此即使有故障的節點也無法將假狀態作為真實狀態傳遞。當然,更簡單的方法是確保EmptyContractjar 中沒有任何內容,但可能會更微妙地濫用任何現有合約來繞過不需要的狀態。我只是EmptyContract作為一個例子。但是在流和合同中檢查包名似乎有點不安全和hacky。我不完全了解類加載器是如何工作的,以及如何處理具有相同包名的兩個相同類名,以及惡意節點是否有辦法做事。另外,我真的不明白為什么我們被要求在建立交易時將合同綁定到一個狀態?為什么合同不能綁定到狀態定義本身的狀態?也許一個狀態可以用它的相關合同來注釋?是否可以在不同的時間以相同的狀態使用不同的合約?但這不是命令的用途嗎?那么同一份合約在不同的時間會有不同的表現嗎?還是我對“我如何確保正確的合同在交易中運行”的全部擔憂遺漏了什么?提前感謝您的回答。
1 回答

一只名叫tom的貓
TA貢獻1906條經驗 獲得超3個贊
為了防止這種情況,Corda 4 將引入@BelongsToContract注解。此注釋將狀態與給定合約聯系起來,并防止任何其他合約與此狀態一起使用。
示例用法:
@BelongsToContract(TemplateContract::class)
class TemplateState(override val participants: List<AbstractParty>) : ContractState
添加回答
舉報
0/150
提交
取消