2

在我的帐户脚本中,当交易的附件包含存储在合约数据中的 keccak256 值的正确原像时,我想授权交易。

我使用waves-crypto计算JS中base58字符串的keccak256并将其存储在数据存储中:

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 条件失败。我相信这可能是格式不匹配,但我不确定如何调试它。

4

1 回答 1

0

检查Keccak 函数,它以字节数组作为输入参数。

这是一个使用 Waves-crypto 的 Keccak 示例:

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
于 2019-06-28T09:00:38.000 回答