Соответствие keccak256 в RIDE и в Waves JS - PullRequest
2 голосов
/ 24 июня 2019

В моем скрипте аккаунта я хочу авторизовать транзакцию, когда ее вложение содержит правильный прообраз для значения keccak256, хранящегося в данных контракта.

Я использую wave-crypto для вычисления keccak256 строки base58 в JS исохранить его в хранилище данных:

const setDataTx = waves.data(
    {
        data: [
            { key: 'buyer', value: buyerAccount.keyPair.public },
            { key: 'seller', value: sellerAccount.keyPair.public },
            { key: 'verificationHash', value: crypto.keccak(VERIFICATION_STRING_BASE_58) },
            { key: 'blockUnlocked', value: 1000000},
        ],
        timestamp: Date.now(),
        chainId: 'T'
    },
    contractAccount.seed
);

Я использую следующий предикат в своем контракте RIDE:

sigVerify(t.bodyBytes, t.proofs[0], fromBase58String(buyerPub)) || 
        (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(sellerPub)) && ((lastBlock.height > blockUnlocked) || (keccak256(t.attachment) == verificationHash)))

Я проверил все условия, кроме keccak, - все они работают как задумано.Однако условие keccak не выполняется.Я полагаю, что это может быть несоответствие формата, но я не уверен, как отладить это.

1 Ответ

0 голосов
/ 28 июня 2019

Проверьте функцию Keccak , она принимает массив байтов в качестве входного параметра.

Это пример того, как Keccak использует Waves-crypto:

import { keccak } from '@waves/waves-crypto'
const bytesArray = [117, 110, 99, 108, 101]
const bytesUint = Uint8Array.from([117, 110, 99, 108, 101])
const bytesBase58 = 'EFRr9cp'
keccak(bytesArray)  // 5cqz9N2PPjDkSBSwga8AttKzQEHfn8aQ95rcZZmabLA7
keccak(bytesUint)   // 5cqz9N2PPjDkSBSwga8AttKzQEHfn8aQ95rcZZmabLA7
keccak(bytesBase58) // 5cqz9N2PPjDkSBSwga8AttKzQEHfn8aQ95rcZZmabLA7
...