Solidity

如何使用 web3.js 測試自定義備份功能?

  • September 7, 2019

我正在嘗試實現代理模式。我有一個代理契約和一個彩票契約,我希望代理契約將呼叫委託給彩票契約。

為了測試函式呼叫是否被委託,我想呼叫 enter() 將玩家輸入彩票並呼叫 getPlayers() 來檢查彩票中的玩家數量是否等於 1。

摩卡測試如下:

 it('allows one account to enter', async () => {

      await proxy.methods.enter().send({
          from: accounts[1],
          value: web3.utils.toWei('0.02', 'ether')
      });

      const players = await proxy.methods.getPlayers().call({
          from: accounts[0]
      });

      assert.equal(accounts[1], players[0]);
      assert.equal(1, players.length);
  })

代理合約有一個回退功能,可以將呼叫委託給彩票合約。通過在代理合約上呼叫 enter() 和 getPlayers(),我希望函式簽名不會被辨識,而是會呼叫回退函式。

但是,它不起作用。我收到類型錯誤:TypeError: proxy.methods.enter is not a function。

為什麼不呼叫回退函式?我認為如果其他函式不等於提供的標識符,則將呼叫回退函式的點。

是否有更好的方法(或者如果我完全錯誤地這樣做,則為正確的方法)來測試呼叫是否被委派。

我已將代理合約的備份功能放在下面,以防萬一:

function () external payable {

   address target = getLotteryAddress();


   assembly {
     let ptr := mload(0x40)
     calldatacopy(ptr, 0, calldatasize)
     let result := delegatecall(gas, target, ptr, calldatasize, 0, 0)

     let size := returndatasize
     returndatacopy(ptr, 0, size)

     switch result
     case 0 { revert(ptr, size) }
     case 1 { return(ptr, size) }
   }
 }

回答標題中的問題(How to test a custom fallback function using web3.js?):

await web3.eth.sendTransaction({
   from: accounts[1],
   to: proxy.address,
   value: web3.utils.toWei('0.02', 'ether')
});

我假設accounts[1]在您連接的節點上已解鎖。

Web3js 合約使用 ABI 知道如何呼叫合約函式,它需要參數和類型來正確編碼。如果您嘗試呼叫 ABI 中不存在的函式,它將抱怨缺少函式。

您有兩種可能的解決方案:

  1. 使用具有正確 ABI 的合約,但使用代理地址。
  2. 使用 sendTransaction 和 encodeABI 來正確格式化參數和類型。

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