Web3js

Javascript 中的 XOR bytes32(來自 web3.sha3)

  • May 21, 2016

如何在 Javascript 中使用 bytes32 對象執行按位運算?這似乎是一個通用的 Javascript 問題,但由於這是在智能合約中混淆輸入值的常見做法,我將其發佈在這裡。我在 Javascript 中按如下方式獲取 bytes32:

var v1 = 'blabla';
var v2 = 'bla'
var h1 = web3.sha3(v1);
var h2 = web3.sha3(v2);
var clientHash = h1 | h2;

不幸clientHash的是總是等於零 - 我假設因為 h1 和 h2 實際上是字元串(但即使將其轉換為 int 也保持不變)。在智能合約(Solidity)中,我計算模擬場景如下:

function testHash(bytes32 h1, bytes32 h2) constant returns (bytes32 b) {
     b = h1 ^ h2;
   }

背景:出於學習目的,我正在開發乙太坊上的石頭剪刀布遊戲。當然,在安全遊戲中,我會使用第二個秘密隨機輸入來混淆使用者的選擇。兩個輸入的組合雜湊應該在客戶端上計算,然後才發送到智能合約。當兩個玩家都做出選擇時,兩個玩家都將他們的明文發送到智能合約,獲勝者將獲得底池。是我的詳細程式碼(我想將其第一部分移至客戶端(JS))。

您需要使用大數字庫,因為Javascript 的按位運算符僅適用於 32-bitsweb3.sha3輸出為 32字節

web3.js 中包含的 BigNumber.js 不支持按位運算符。

一種選擇是使用bn.js,例如:

const BN = require("bn");
var a = new BN.BigInteger(h1, 16);
var b = new BN.BigInteger(h2, 16);
var clientHash = '0x' + a.xor(b).toString(16);

我測試了一個範例,但您可能需要將填充指定為toString.

引用自:https://ethereum.stackexchange.com/questions/4134