@@ -1528,33 +1528,36 @@ namespace nil {
1528
1528
virtual void codecopy () {
1529
1529
// 6M memory bytes gives 60M+ gas cost
1530
1530
// max gas cost is 36M for now, might go up to 60M
1531
- constexpr static const std::size_t max_dest_offset = 8388608 ; // 2^23
1532
- // max contract size is 24,576 bytes, so offset and length need to fit in
1533
- // first chunk
1531
+ constexpr static const std::size_t max_dest_offset = 1 << 22 ;
1532
+ constexpr static const std:: size_t max_length = 1 << 22 ;
1533
+ // max contract size is 24,576 bytes, so offset need to fit in first chunk
1534
1534
constexpr static const std::size_t max_offset = 65536 ;
1535
- constexpr static const std::size_t max_length = 65536 ;
1536
- std::size_t dst = std::size_t (stack.back ()); stack.pop_back ();
1537
- std::size_t src = std::size_t (stack.back ()); stack.pop_back ();
1538
- std::size_t length = std::size_t (stack.back ()); stack.pop_back ();
1539
1535
1540
- bool overflow = (dst > max_dest_offset) ||
1541
- ( src > max_offset) ||
1542
- (length > max_length );
1536
+ auto dst = stack. back (); stack. pop_back ();
1537
+ auto src = stack. back (); stack. pop_back ();
1538
+ auto lgt = stack. back (); stack. pop_back ( );
1543
1539
1544
- std::size_t minimum_word_size = (length + 31 ) / 32 ;
1545
- std::size_t next_mem = std::max (dst + length, memory.size ());
1546
- std::size_t memory_expansion = memory_expansion_cost (next_mem, memory.size ());
1547
- std::size_t next_memory_size = memory_size_word_util (next_mem) * 32 ;
1540
+ bool overflow = (dst > max_dest_offset) ||
1541
+ (lgt > max_length);
1548
1542
1549
1543
1550
1544
if (overflow) {
1551
- memory. resize (memory. size () - 1 );
1552
- increase_gas ( 1 );
1545
+ decrease_gas (gas + 1 );
1546
+ memory. clear ( );
1553
1547
}
1554
1548
else {
1555
- if ( memory.size () < dst + length) memory.resize (next_memory_size);
1549
+ std::size_t distance = std::size_t (dst);
1550
+ std::size_t length = std::size_t (lgt);
1551
+ std::size_t source = src < max_offset ? std::size_t (src) : max_offset;
1552
+
1553
+ std::size_t minimum_word_size = (length + 31 ) / 32 ;
1554
+ std::size_t next_mem = std::max (distance + length, memory.size ());
1555
+ std::size_t memory_expansion = memory_expansion_cost (next_mem, memory.size ());
1556
+ std::size_t next_memory_size = memory_size_word_util (next_mem) * 32 ;
1557
+
1558
+ if ( memory.size () < distance + length) memory.resize (next_memory_size);
1556
1559
for ( std::size_t i = 0 ; i < length; i++){
1557
- memory[dst +i] = src + i < bytecode.size ()? bytecode[src +i]: 0 ;
1560
+ memory[distance +i] = source + i < bytecode.size ()? bytecode[source +i]: 0 ;
1558
1561
}
1559
1562
decrease_gas (3 + 3 * minimum_word_size + memory_expansion); // dynamic gas
1560
1563
}
0 commit comments