Solidity

有人可以幫我解決這個 Solidity Fibonacci 挑戰嗎?

  • September 11, 2022

您可以為滿足以下兩個條件的合約編寫的最短執行時字節碼是什麼:

  • 接受長度為 32 字節的呼叫數據,表示一個 uint256(無函式選擇器)
  • 以 uint256 形式返回輸入索引處的斐波那契數(序列可以從 0 或 1 開始)

如果這是一個挑戰,你應該嘗試自己解決它。我理解你可能對這個問題不太了解,我會向你解釋清楚,然後我會闡明邏輯,然後我會告訴你一個解決方案。

但是當我澄清你需要做什麼時,試著自己解決它。如果不能,請檢查我將向您展示的邏輯。如果您仍然無法弄清楚,請查看我的解決方案:

澄清

他們希望您創建一個具有“沒有功能選擇器”的功能的合約(意思是,它就是fallback功能)。該函式應該接收calldata長度為 32 字節that will contain data that you need to treat as auint256 number (by decoding it). Let's call this numbern` 的參數。

然後,您需要計算直到該數字的斐波那契n數列並將其返回。

眾所周知,斐波那契數列如下:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ... 第一個是0,第二個是1,第三個是1,第四個是2。基本上,斐波那契數列是一個數字序列,其中每個數字由前 2 個數字的總和組成,以 . 開頭0, 1

編譯它(可能使用 Remix),獲取執行時字節碼,然後送出。

檢查fallback函式文件:https ://docs.soliditylang.org/en/v0.8.14/contracts.html?highlight=fallback#fallback-function

檢查abi.encode,abi.encodePackedabi.decode函式文件:https ://docs.soliditylang.org/en/v0.8.15/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions

想一想,現在試著自己解決。

邏輯

實現以下fallback功能:

js fallback(bytes calldata _input) external returns(bytes memory output)

在其中,將 解碼_input為一個uint256類型(該uint256類型有 32 個字節),在一個名為n.

計算斐波那契數列直到n.

返回將其編碼為字節的結果(使用abi.encodeor abi.encodePacked)。

編譯它(可能使用 Remix),獲取執行時字節碼,然後送出。

而已!

嘗試自己解決。

如果你不能,那麼看看我下面的解決方案。

解決方案

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;

contract Fibonacci {

   uint256 public input;
   uint256 public result;

   fallback(bytes calldata _input) external returns(bytes memory output) {

       (uint256 n) = abi.decode(_input, (uint256));

       uint256 v1 = 0;
       uint256 v2 = 1;
       for (uint256 i = 0; i < n - 1; i++) {
           v2 = v1 + v2;
           v1 = v2 - v1;
       }

       input = n; // No need to do this, just for debugging.
       result = v2; // No need to do this, just for debugging.

       // If called from another contract, the contract will receive this as the bytes response
       return abi.encode(v2);

   }

}

編譯它(可能使用 Remix),獲取執行時字節碼,然後送出。就我而言,它是:

608060405234801561001057600080fd5b506004361061003a5760003560e01c806365372147146100df578063eaed3f4f146100fd5761003b565b5b6000366060600083838101906100519190610162565b90506000806001905060005b60018461006a91906101be565b8110156100a057818361007d91906101f2565b9150828261008b91906101be565b9250808061009890610226565b91505061005d565b508260008190555080600181905550806040516020016100c0919061027d565b6040516020818303038152906040529350505050915050805190602001f35b6100e761011b565b6040516100f4919061027d565b60405180910390f35b610105610121565b604051610112919061027d565b60405180910390f35b60015481565b60005481565b600080fd5b6000819050919050565b61013f8161012c565b811461014a57600080fd5b50565b60008135905061015c81610136565b92915050565b60006020828403121561017857610177610127565b5b60006101868482850161014d565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101c98261012c565b91506101d48361012c565b92508282039050818111156101ec576101eb61018f565b5b92915050565b60006101fd8261012c565b91506102088361012c565b92508282019050808211156102205761021f61018f565b5b92915050565b60006102318261012c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036102635761026261018f565b5b600182019050919050565b6102778161012c565b82525050565b6000602082019050610292600083018461026e565b9291505056fea26469706673582212200a07d1acb375662d0b29a5f80dc05e9effdf73118008d05c193b7417094b1c8064736f6c63430008100033 在 Remix 中,點擊 Compilation Details 並點擊 Runtime Bytecode:

在此處輸入圖像描述

得到它:

在此處輸入圖像描述

有很多方法可以解決斐波那契數列。我使用的解決方案在時間和空間複雜度方面非常有效。該解決方案使用很少的氣體。用 Solidity 中的遞歸來解決這個問題真的很昂貴。如果需要,您可以嘗試其他解決方案。

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