Вопрос о загрузке и загрузке вложений - PullRequest
0 голосов
/ 27 декабря 2018

Сначала я прочитал документ от corda об использовании приложения.Однако у меня все еще есть вопрос о процессе загрузки и скачивания вложения.

Моей задачей было написать простое приложение для передачи файла с NodeA на NodeB.После загрузки zip-файла из оболочки NodeA я получил хеш, а затем включил его в транзакцию.Поток прошел успешно.Однако в NodeB я не смог получить файл обратно.Затем я попытался вернуть файл из NodeA, используя этот хэш.Однако оболочка вернула сообщение об ошибке и сказала invalidInputSteam.

Но затем, когда я запустил cordaftp (https://github.com/corda/cordaftp) и попытался загрузить файл и загрузить его из той же оболочки, оболочка правильно задала путьдля хранения. Я прочитал различные посты и знал, что мне нужно включить дополнительные коды для успешной загрузки. Но я не знаю, какой файл я должен изменить и какой код я должен написать. Надеюсь, кто-то может помочь мне решить мою проблему, так как я уже потратилдней на чтение предыдущих постов и документов.

Здесь ниже часть потока:

@InitiatingFlow
@StartableByRPC
class FileInitiateFlow(
    val receiver: Party,
    val comment: String,
    val hash: SecureHash.SHA256) : FlowLogic<SignedTransaction>() {
    companion object {
    object GENERATING_TRANSACTION : Step("Generating transaction")
    object VERIFYING_TRANSACTION : Step("Verifying contract constraints.")
    object SIGNING_TRANSACTION : Step("Signing transaction with sender private key.")
    object GATHERING_SIGS : Step("Gathering the receiver's signature."){
        override fun childProgressTracker() = CollectSignaturesFlow.tracker()
    }

    object FINALISING_TRANSACTION : Step("Obtaining notary signature and recording transaction.") {
        override fun childProgressTracker() = FinalityFlow.tracker()
    }

    fun tracker() = ProgressTracker(
            GENERATING_TRANSACTION,
            VERIFYING_TRANSACTION,
            SIGNING_TRANSACTION,
            GATHERING_SIGS,
            FINALISING_TRANSACTION
    )
}

override val progressTracker = tracker()


@Suspendable
override fun call(): SignedTransaction {
    // Obtain a reference to the notary we want to use.
    val notary = serviceHub.networkMapCache.notaryIdentities[0]
    val sender = serviceHub.myInfo.legalIdentities.first()
    // Stage 1.
    progressTracker.currentStep = GENERATING_TRANSACTION
    // Generate an unsigned transaction.
    val fileState = FileState(sender, receiver,comment)
    val txCommand = Command(RoamingContract.Commands.FileInitiate(), fileState.participants.map { it.owningKey })
    val txBuilder = TransactionBuilder(notary)
            .addOutputState(fileState, ID)
            .addCommand(txCommand)
            .addAttachment(hash)

    // Stage 2.
    progressTracker.currentStep = VERIFYING_TRANSACTION
    // Verify that the transaction is valid.
    txBuilder.verify(serviceHub)

    // Stage 3.
    progressTracker.currentStep = SIGNING_TRANSACTION
    // Sign the transaction.
    val partSignedTx = serviceHub.signInitialTransaction(txBuilder)

    // Stage 4.
    progressTracker.currentStep = GATHERING_SIGS
    // Send the state to the counterparty, and receive it back with their signature.
    val otherPartyFlow = initiateFlow(receiver)
    val fullySignedTx = subFlow(CollectSignaturesFlow(partSignedTx, setOf(otherPartyFlow), GATHERING_SIGS.childProgressTracker()))

    // Stage 5.
    progressTracker.currentStep = FINALISING_TRANSACTION
    // Notarise and record the transaction in both parties' vaults.
    return subFlow(FinalityFlow(fullySignedTx, FINALISING_TRANSACTION.childProgressTracker()))
}
}

@InitiatedBy(FileInitiateFlow::class)
class FileInitiateRespond(val senderFlow: FlowSession) :         FlowLogic<SignedTransaction>() {
@Suspendable
override fun call(): SignedTransaction{
    val signedTransactionFlow = object : SignTransactionFlow(senderFlow) {
        override fun checkTransaction(stx: SignedTransaction) = requireThat {
            val output = stx.tx.outputs.single().data
            "This must be an File State" using (output is FileState)
        }
    }
    return subFlow(signedTransactionFlow)
}
}

Итак, сначала я запускаю uploadAttachment для загрузки zip-файла, получаю хеш, а затем запускаю поток, с хешем в качестве входных данных. Поток выполнен успешно, но на стороне получателя я не смог получить ключ хеша для загруженного файла при проверке существующего состояния.

1 Ответ

0 голосов
/ 04 января 2019

Хэши вложений экземпляров SecureHash.В Corda 3.2 / 3.3 есть ошибка, из-за которой оболочка не может конвертировать строки в SecureHash объекты.

Исправление здесь: https://github.com/corda/corda/pull/3248 и будет доступно в Corda 4.

...