Reducción de las operaciones de escritura de almacenamiento

Las operaciones de almacenamiento son muy costosas y todo palidece en comparación tan pronto como comienzas a usarlos.

Así que me preguntaba qué forma inteligente se podría usar para reducir las siguientes operaciones de escritura de almacenamiento (20000/5000 de gas cada una).

function tradeBalances(address tokenGet, uint amountGet, address tokenGive, uint amountGive, address user, uint amount) private {
  uint feeTakeXfer = safeMul(amount, feeTake) / (1 ether);
  tokens[tokenGet][msg.sender] = safeSub(tokens[tokenGet][msg.sender], safeAdd(amount, feeTakeXfer));
  tokens[tokenGet][user] = safeAdd(tokens[tokenGet][user], amount);
  tokens[tokenGet][feeAccount] = safeAdd(tokens[tokenGet][feeAccount], feeTakeXfer);
  tokens[tokenGive][user] = safeSub(tokens[tokenGive][user], safeMul(amountGive, amount) / amountGet);
  tokens[tokenGive][msg.sender] = safeAdd(tokens[tokenGive][msg.sender], safeMul(amountGive, amount) / amountGet);
}

Se almacenan así:mapping (address => mapping (address => uint)) public tokens;

Respuestas (1)

Aunque aquí hay una asignación anidada, solo se usa una única ranura de almacenamiento para cada escritura. Solidity usa las dos claves que acceden al valor en el mapeo juntas para calcular el índice de ranura en el almacenamiento. En este método particular, se utilizan 5 ranuras de almacenamiento.

Realmente no hay forma de optimizar aquí que no sea usar un tipo más pequeño para valores como uint128o uint64y luego empaquetar los valores juntos.