Skip to content

Open Digital Cash. Cryptography blockchain Core, written in Kotlin

License

Notifications You must be signed in to change notification settings

resuba/odc-kotlin-core

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Open Digital Cash -- Kotlin Core

(Russian)

Передача банк -> клиент

Alt text

Обмен следующий.


Шаг 1 Банк-эмитент создаёт новую банкноту:

    val banknote = bankIssuer.newBanknote(
            amount = amount,
            bin = BIN,
            currencyCode=ISO_4217_CODE.RUB,
    )

После эта банкнота передаётся Алисе.


Шаг 2 Алиса верифицирует корректность банкноты

    if ( ! banknote.verification(bok)){
        throw Exception("Банкнота поддельная")
    }

Шаг 3 Алиса генерирует *часть первого блока блокчейна.

(!) На каждую банкноту генерируется свой блокчейн

var (block, protectedBlock) = walletA.firstBlock(banknote)

protectedBlock -- это защищённый блок блокчейна. Данный блок передаётся только между двумя парами передающих сторон а так же при операции push на сервер.

Таким образом имея весь блокчейн мы не можем сказать кто был участником, кроме последнего блока (что логично.)

После Алиса передаёт block и protectedBlock банку-эмитенту


Шаг 4

Банк подписывает первый блок блокчейна:

block = bankIssuer.signature(banknote, block, protectedBlock)

Этот блок передаётся Алисе. Банк некоторое время ждёт (Шаг 5а), на случай если пакет пропадёт.


Шаг 5b.

Алиса перепроверяет что блок block корректно записан


Шаг 6 (а,b) -- запись в локальный блокчейн и в глобальный блокчейн

Передача клиент -> клиент

Передача между двумя клиентами может происходить как offline, так и online.

Alt text


Шаг 1 Инициализация запроса на передачу.

Для этого нужно сформировать:

val parentBlock = banknote_blockchain.last()

val protectedBlock_part = ProtectedBlock(
        parentSok=walletA.sok,
        parentSokSignature=walletA.sokSignature,
        parentOtokSignature=walletA.otokSignature(parentBlock.otok),
        refUuid=null,
        sok=null,
        sokSignature=null,
        otokSignature=null,
)

и передать banknote_blockchain и protectedBlock_part по каналу Бобу


Шаг 2 Боб проверяет весь блокчейн

var lastKey = bok
for (block in banknote_blockchain){
    block.verification(lastKey)
    lastKey = block.otok
}

(!) Можно оптимизировать и в конце каждого блока поставить подпись банка. Тогда нужно проверять только с самого последнего блока, для которого есть подпись


Шаг 3 (опционально)

Если есть сеть -- лучше ещё подписать и проверить в банке.

Но операции можно проводить офлайн


Шаг 4

Боб принимает купюру, для этого он должен создать свой блок

var (childBlock, protectedBlock) = walletB.acceptanceInit(parentBlock, protectedBlock_part, bok)

Данные передаются по каналу Алисе


Шаг 5

Алиса проверяет корректность ключей (подфункция acceptanceInitVerification внутри signature) и подписывает:

childBlock = walletA.signature(parentBlock, childBlock, protectedBlock, bok)

Данный блок передаётся по каналу. На всякий случай Алиса выжидает (Шаг 6a) и переходит к Шагу 7.


Шаг 6b

Боб проверяет корректность последнего блока (весь блокчейн проверен на шаге 2):

if (! childBlock.verification(parentBlock.otok)){
    throw Exception("childBlock некорректно подписан")
}

Шаг 7 Записываем новый блок в блокчейн

banknote_blockchain.add(childBlock)
banknote_protectedBlockChain.add(protectedBlock)

About

Open Digital Cash. Cryptography blockchain Core, written in Kotlin

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Kotlin 100.0%