# Open Discussion: Libraries 2.0
*These are collaborative notes from the open discussion round about "Libraries 2.0" at the [Solidity Summit 2020](https://solidity-summit.ethereum.org/).*
Slides: https://chriseth.github.io/notes/talks/solidity_summit_2020/libraries_2.0/
Next steps: Let's talk to some groups that had the code size limit prolbem and see what they did and what other solution migth be there.
group funcitons into modules, a contract is a set of modules.
call functions of the same module with functionName()
and of other module using moduleName.functionName() - using delegatecall (all modules can directly access state variables of the contract)
(see below)
Francisco: Better ways of sharing the storage layout with libraries are needed. Currently you have to put the storage variables of your contract into a `struct` to easily pass them into library functions.
Francisco: The tooling around libraries is not up to the task yet.
Nicolas: proposal on the Ethereum Magicians forum (by Vitalik) to make CALL cost proportional to bytecode size: https://ethereum-magicians.org/t/protocol-changes-to-bound-witness-size/3885
Nicholas: Modules need to know each other's addresses and thus they need to be deployed together, which is a problem with the transaction size
Chris: Potential solution: store addresses in storage instead - could also be used for upgrades
Make address deterministic somehow?
Poll: [Marking areas where to split contracts?](https://www.strawpoll.me/19900469)
Poll: [Should we remove the delegatecall aspect of libraries? (without alternative for now)](https://www.strawpoll.me/19900522)
Module example:
```solidity
contract c2 {
uint x;
constructor() {
}
module A {
function f1()public view returns (uint) { return x; }
function f2()public view returns (uint) {
f1(); // uses jump
g.g2(); // uses delegatecall
}
function f3()public view returns (uint) { }
function f4()public view returns (uint) { }
}
module B {
function g1()public view returns (uint) { return x; }
function g2()public view returns (uint) {
A.f2(); // uses delegatecall
}
function g3()public view returns (uint) { }
function g4()public view returns (uint) { }
function g5()public view returns (uint) { }
function g6()public view returns (uint) { }
}
module C {
function f1()public view returns (uint) { }
}
}
```