使用 ZipEntry 复制附件异常 Corda

Duplicate Attachment Exception Corda Using a ZipEntry

我知道在 Corda 上作为附件上传的每个文件都会生成一个唯一的哈希值,这些文件将被转换为 zip/jar 格式,因为这些是 Corda 支持将它们保存为附件的类型.我遇到过一个场景,我在同一个节点上两次上传同一个文件,但有时间间隔,这导致它有两个附件哈希,这是可以理解的,因为我先将这个文件压缩为 zip,然后再上传。但是当我尝试同时上传同一个文件两次时,就会出现 DuplicateAttachmentException。我试过调试,我发现,当我们压缩文件时,它们在同一时间压缩,因此在 Corda 看来,这些压缩是相同的。如果我将多个文件的压缩过程延迟 1 秒左右,则不会发生此异常。有解决办法吗?

private fun uploader(inputStream: InputStream, fileName: String, uploader: String): AttachmentId {

        val zipName = "$fileName.zip"

        FileOutputStream(zipName).use { fileOutputStream ->
            ZipOutputStream(fileOutputStream).use { zipOutputStream ->
                val zipEntry = ZipEntry(fileName)
                zipOutputStream.putNextEntry(zipEntry)
                inputStream.copyTo(zipOutputStream, 1024)
            }
        }
        return FileInputStream(zipName).use { fileInputStream ->
            val hash = proxy.uploadAttachmentWithMetadata(
                    jar = fileInputStream,
                    uploader = uploader,
                    filename = fileName
            )
            Files.deleteIfExists(Paths.get(zipName))
            hash
        }

    }

这是我用来产生问题的代码。

我不认为这是可以避免的例外情况。如果哈希值相同,那么 Corda 很可能会抛出它。

我很好奇您需要多次上传同一附件的用例是什么,我怀疑您在设计中避免该问题比创建解决方法更容易对于 corda.

我想您也可以在上传文件的过程中稍微修改一下文件,以确保它们在上传时略有不同。

您可以在 corda 中找到检查重复附件的实际代码:https://github.com/corda/corda/blob/82a114a329fee1a249f9c0786d5c2f8593759863/node/src/main/kotlin/net/corda/node/services/persistence/NodeAttachmentService.kt#L435