Конструктор не работает должным образом

После того, как я разрабатываю следующий контракт с массивом [true, true, true] как _bools, я ожидаю, что getBools () вернет [true, true, true].

Вместо этого возвращается [ false , true, true].

Что-то явно не так я делаю?

 contract Broken   { address creator ; 
     uint   public  aInt ; 
     bool [ 3 ]  bools ; 

     function   Broken ( uint  _aInt ,   bool [ 3 ]  _bools )   public   { creator =  msg . sender ; aInt =  _aInt ; bools =  _bools ; 
     } 

     function  getBools ()  constant returns ( bool [ 3 ])   { 
         return  bools ; 
     } 

     function  kill ()   { 
         if   ( msg . sender ==  creator )  suicide ( creator ); 
     } 

 } 

ОБНОВИТЬ:

Вот скрипт, который я использую для запуска контракта: http://pastebin.com/h6588DXh

И на выходе я получаю:

 loadScript ( "broken.js" ) I0404 11 : 32 : 43.290351      8448  xeth . go : 1026 ]   Tx ( 0xf66606023ae787621534949a7da16b04b3a26213a532deb16ab9bbd7c2e0bc43 )  created :   0x1f7099dd0c58678883e89066a95f313d4b4f40d1 I0404 11 : 32 : 43.291519      8448  miner . go : 119 ]   Starting  mining operation ( CPU = 4  TOT = 5 ) I0404 11 : 32 : 43.298410      8448  worker . go : 569 ]  commit new  work on block 54   with   1  txs &   0  uncles .   Took   6.013736ms I0404 11 : 32 : 43.437366      8448  worker . go : 348 ]   🔨    Mined  block (# 54   /   755c7ff9 ).   Wait   5  blocks for  confirmation I0404 11 : 32 : 43.437721      8448  worker . go : 569 ]  commit new  work on block 55   with   0  txs &   0  uncles .   Took   312.353 µ s I0404 11 : 32 : 43.437750      8448  worker . go : 447 ]   🔨   🔗    Mined   5  blocks back :  block #49 I0404 11 : 32 : 43.923513      8448  worker . go : 348 ]   🔨    Mined  block (# 55   /   1218fc33 ).   Wait   5  blocks for  confirmation I0404 11 : 32 : 43.924200      8448  worker . go : 569 ]  commit new  work on block 56   with   0  txs &   0  uncles .   Took   322.033 µ s I0404 11 : 32 : 43.924442      8448  worker . go : 447 ]   🔨   🔗    Mined   5  blocks back :  block #50 I0404 11 : 32 : 43.925031      8448  worker . go : 569 ]  commit new  work on block 56   with   0  txs &   0  uncles .   Took   256.09 µ s I0404 11 : 32 : 44.335605      8448  worker . go : 569 ]  commit new  work on block 56   with   0  txs &   0  uncles .   Took   582.985 µ s true 
 >   Contract  mined ! 
 Bools  given :   true , true , true 
 Bools  stored :   false , true , true 

Более того, если конструктор имеет следующую подпись:

 function   Broken ( bool [ 3 ]  _bools ,   uint  _aInt )   public 

все ведет себя как ожидалось.

Какое сообщение вы отправили для создания договора?
Я подозреваю, что ваше первое истинное значение используется для инициализации параметра uint _aInt. Вы должны быть в состоянии проверить, попробовав следующее: 1) значения [true, false, true] должны возвращать false, true, false; и 2) добавление четвертого значения [1, false, false, false] должно возвращать false, false, false.
@BokkyPooBah 1) Подтверждено чистым кодом прочности: [t, f, t] => [f, t, f]. 2) [t, f, f, f] => [f, t, f, f]. Массив байтов смещен вправо. Это ожидаемое поведение? Если так, где узнать больше об этом?
Похоже, ошибка для меня. 'getBools' вернет правильные значения, если вы создадите функцию 'setBools' и установите ее таким образом.

Ответы (1)

Это критическая ошибка в solc .

Ссылка: https://github.com/ethereum/solidity/issues/485