Solidity

你如何處理沒有值的十六進制前綴(只有“0x”)?

  • May 25, 2021

首先,我正在呼叫函式foo()(來自另一個合約),它uintbytes.

然後,我BytesLib.toUint(foo(), 0)用來檢索uint.

當值應該是1, foo 返回0x0000000000000000000000000000000000000000000000000000000000000001,並且BytesLib.toUint(foo(), 0)工作正常。

當值應該是2, foo 返回0x0000000000000000000000000000000000000000000000000000000000000002,並且BytesLib.toUint(foo(), 0)工作正常。

但是,當值應該是 時0, foo 不會返回0x0000000000000000000000000000000000000000000000000000000000000000

它返回0x。並且BytesLib.toUint(foo()), 0)不起作用。

我想實現一些邏輯來檢查foo()equals的值0x。我嘗試了多種方法:

  • if (foo() == 0x) { //do something else }
  • if (foo() == "0x") { //do something else }
  • if (foo() == address(0)) { //do something else }
  • if (foo() == keccak256(0x)) { //do something else }

但是所有這些都會導致編譯錯誤。

我應該如何處理0x

0x在技​​術上是一個空字節數組。在 Solidity 中,您不能直接比較字節(或其他動態類型),因此檢查這一點的簡單方法是檢查字節的長度,例如foo().length == 0.

contract Foo {
 function foo() public returns (bytes memory) {
   return bytes("");
 }
 
 function bar() public returns (bool) {
   return foo().length == 0;
 }
}

呼叫foo()返回一個空字節數組 ( 0x),呼叫按預期bar()返回。true

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