From 132ad53a886631eb3b4aeb54fe399dad799d265d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=AF=E5=98=89=E9=A2=96?= <568296125@qq.com> Date: Thu, 4 Jun 2026 10:09:00 +0800 Subject: [PATCH] [fix][relayer][core] preserve blockchain properties on partial update --- .../manager/BlockchainManagerTest.java | 56 +++++++++++++++++++ .../relayer/commons/model/BlockchainMeta.java | 3 + .../manager/blockchain/BlockchainManager.java | 2 +- 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/acb-relayer/r-bootstrap/src/test/java/com/alipay/antchain/bridge/relayer/bootstrap/manager/BlockchainManagerTest.java b/acb-relayer/r-bootstrap/src/test/java/com/alipay/antchain/bridge/relayer/bootstrap/manager/BlockchainManagerTest.java index dfb0b0ae..8ab1bf9d 100644 --- a/acb-relayer/r-bootstrap/src/test/java/com/alipay/antchain/bridge/relayer/bootstrap/manager/BlockchainManagerTest.java +++ b/acb-relayer/r-bootstrap/src/test/java/com/alipay/antchain/bridge/relayer/bootstrap/manager/BlockchainManagerTest.java @@ -118,6 +118,62 @@ public void testUpdateBlockchainAnchor() throws IOException { Assert.assertEquals(PS_ID, blockchainMeta.getPluginServerId()); } + @Test + public void testUpdateBlockchainPreservesPropertiesOnPartialConfig() { + + BlockchainMeta blockchainMeta = blockchainManager.getBlockchainMetaByDomain(antChainDotComDomain); + String amAddr = "AM_CONTRACT_TO_KEEP"; + String sdpAddr = "SDP_CONTRACT_TO_KEEP"; + String ptcAddr = "PTC_CONTRACT_TO_KEEP"; + long initBlockHeight = 12345L; + + blockchainMeta.getProperties().setAmClientContractAddress(amAddr); + blockchainMeta.getProperties().setSdpMsgContractAddress(sdpAddr); + blockchainMeta.getProperties().setPtcContractAddress(ptcAddr); + blockchainMeta.getProperties().setInitBlockHeight(initBlockHeight); + blockchainMeta.getProperties().setIsDomainRegistered(true); + Assert.assertTrue(blockchainRepository.updateBlockchainMeta(blockchainMeta)); + + Map partialClientConfig = new HashMap<>(); + partialClientConfig.put(Constants.HETEROGENEOUS_BBC_CONTEXT, JSON.toJSONString(blockchainProperties1.getBbcContext())); + blockchainManager.updateBlockchain( + antChainDotComProduct, + antChainDotComBlockchainId, + "", + blockchainMeta.getAlias(), + blockchainMeta.getDesc(), + partialClientConfig + ); + + BlockchainMeta updatedMeta = blockchainManager.getBlockchainMetaByDomain(antChainDotComDomain); + Assert.assertEquals(PS_ID, updatedMeta.getPluginServerId()); + Assert.assertEquals(initBlockHeight, updatedMeta.getProperties().getInitBlockHeight().longValue()); + Assert.assertEquals(amAddr, updatedMeta.getProperties().getAmClientContractAddress()); + Assert.assertEquals(sdpAddr, updatedMeta.getProperties().getSdpMsgContractAddress()); + Assert.assertEquals(ptcAddr, updatedMeta.getProperties().getPtcContractAddress()); + Assert.assertTrue(updatedMeta.getProperties().getIsDomainRegistered()); + + String newPtcAddr = "PTC_CONTRACT_UPDATED"; + partialClientConfig.clear(); + partialClientConfig.put("ptc_contract_address", newPtcAddr); + blockchainManager.updateBlockchain( + antChainDotComProduct, + antChainDotComBlockchainId, + "", + blockchainMeta.getAlias(), + blockchainMeta.getDesc(), + partialClientConfig + ); + + updatedMeta = blockchainManager.getBlockchainMetaByDomain(antChainDotComDomain); + Assert.assertEquals(PS_ID, updatedMeta.getPluginServerId()); + Assert.assertEquals(initBlockHeight, updatedMeta.getProperties().getInitBlockHeight().longValue()); + Assert.assertEquals(amAddr, updatedMeta.getProperties().getAmClientContractAddress()); + Assert.assertEquals(sdpAddr, updatedMeta.getProperties().getSdpMsgContractAddress()); + Assert.assertEquals(newPtcAddr, updatedMeta.getProperties().getPtcContractAddress()); + Assert.assertTrue(updatedMeta.getProperties().getIsDomainRegistered()); + } + @Test public void testUpdateBlockchainProperty() { diff --git a/acb-relayer/r-commons/src/main/java/com/alipay/antchain/bridge/relayer/commons/model/BlockchainMeta.java b/acb-relayer/r-commons/src/main/java/com/alipay/antchain/bridge/relayer/commons/model/BlockchainMeta.java index d8017b6b..28f4d2f2 100644 --- a/acb-relayer/r-commons/src/main/java/com/alipay/antchain/bridge/relayer/commons/model/BlockchainMeta.java +++ b/acb-relayer/r-commons/src/main/java/com/alipay/antchain/bridge/relayer/commons/model/BlockchainMeta.java @@ -164,6 +164,9 @@ public void updateProperties(BlockchainProperties properties) { if (StrUtil.isNotEmpty(properties.getSdpMsgContractAddress())) { this.properties.setSdpMsgContractAddress(properties.getSdpMsgContractAddress()); } + if (StrUtil.isNotEmpty(properties.getPtcContractAddress())) { + this.properties.setPtcContractAddress(properties.getPtcContractAddress()); + } if (ObjectUtil.isNotNull(properties.getAnchorRuntimeStatus())) { this.properties.setAnchorRuntimeStatus(properties.getAnchorRuntimeStatus()); } diff --git a/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/manager/blockchain/BlockchainManager.java b/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/manager/blockchain/BlockchainManager.java index bee47c21..f2ad6e3a 100644 --- a/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/manager/blockchain/BlockchainManager.java +++ b/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/manager/blockchain/BlockchainManager.java @@ -198,7 +198,7 @@ public void updateBlockchain(String product, String blockchainId, String pluginS blockchainMeta.setAlias(alias); blockchainMeta.setDesc(desc); blockchainMeta.updateProperties(blockchainProperties); - if (!updateBlockchainMeta(new BlockchainMeta(product, blockchainId, alias, desc, blockchainProperties))) { + if (!updateBlockchainMeta(blockchainMeta)) { throw new RuntimeException( StrUtil.format( "failed to update meta for blockchain {} - {} into DB",