Evm

如何使用外部庫函式操作儲存結構數組?

  • March 31, 2022

我的問題的基本虛擬碼模型

import libraryB;

contract A{

struct Person{
string Name;
uint age;

}

Person[] public Party;

Party[0] = (Alice, 30); 

libraryB.addAgeToPerson(Party[0], 1)



}

library libraryB{

struct Person{
string Name;
uint age;

}

function addAgeToPerson(Person storage PersonToAddAgeTo, uint ageToAdd) external {
PersonToAddAgeTo.age += ageToAdd;
}

}

契約 A 正在使用對 libraryB 的委託呼叫來使用該函式,將儲存指針傳遞給 Person

$$ $$公眾黨;該結構在兩個實例中都定義了,但我得到了錯誤: TypeError:函式呼叫中的參數類型無效。從 struct Contract A.Person storage ref 到 struct libraryB.Person 請求的儲存指針的隱式轉換無效。

關於如何將儲存結構從契約傳遞到委託呼叫到庫以使用的任何想法?我認為delegatecalls保留了呼叫者的上下文..

感謝您的任何意見!

在 Contract A 內部,Person實際上是A.Person在 libraryBPersonlibraryB.Person時,當您執行委託呼叫時,您正在提供指向庫的指針A.Person,該庫需要指向 的儲存指針libraryB.Person,因此會出現錯誤。

關於如何將儲存結構從契約傳遞到委託呼叫到庫以使用的任何想法?

只需按照此答案中的描述在您的庫中定義您的結構,並將Person契約 A 中的所有引用更改為libraryB.Person如下所示:

library libraryB {

   struct Person{
       string Name;
       uint age;
   }

   function addAgeToPerson(Person storage PersonToAddAgeTo, uint ageToAdd) external {
       PersonToAddAgeTo.age += ageToAdd;
   }

}

contract A {

   libraryB.Person[] public Party;

   constructor() {
       Party.push(libraryB.Person("Alice", 30));
       libraryB.addAgeToPerson(Party[0], 1);
   }
}

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