Сначала я прочитал документ от 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-файла, получаю хеш, а затем запускаю поток, с хешем в качестве входных данных. Поток выполнен успешно, но на стороне получателя я не смог получить ключ хеша для загруженного файла при проверке существующего состояния.