Может ли контракт получить глобальный лимит блочного газа?

OPCODE получает лимит GASLIMIT газа блока. Может встроенная сборка,

    uint gasLimit;

    assembly {
        gasLimit := gaslimit
    }

получить лимит газа?

contract B {

function getGasLimit() returns (uint) {
    uint gasLimit;

    assembly {
        gasLimit := gaslimit
    }
    return gasLimit;

}

}

Использование https://ethereum.github.io/browser-solidity/ с установленным лимитом газа на 3000000 getGasLimit()возвращает 6000000.

Почему он возвращает вдвое больше лимита газа?

введите описание изображения здесь

После небольшого тестирования я думаю, что на самом деле это может быть ошибка, связанная с твердостью браузера, которая устанавливает лимит газа в два раза больше запрошенного количества. Попробуйте в testrpc или в реальной цепочке, у меня работает
Это тоже было мое предположение. Протестировал в тестовой сети Ropsten, там вроде работает, imgur.com/a/pkcoC
На самом деле это не ошибка, а просто плохой дизайн. Глядя на код, кажется, что «лимит газа» на самом деле является лимитом газа для каждой транзакции , а не лимитом газа блока. Виртуальная машина браузера автоматически устанавливает лимит блочного газа в два раза больше транзакционного газа. Вы можете увидеть это, если просто посмотрите на msg.gasотправляемые транзакции. Это будет то, что вы поместите в gas limitполе (минус немного)
Я отправил вопрос/PR github.com/ethereum/browser-solidity/issues/370
Пожалуйста, опубликуйте свой ответ @TjadenHess.

Ответы (1)

Эта путаница возникла из-за двусмысленности термина «лимит газа», который в твердости браузера означал газ за транзакцию , но OP предположил, что имел в виду лимит газа на блок . Путаница усугублялась тем фактом, что лимит блочного газа в виртуальной машине браузера по умолчанию вдвое превышает лимит транзакционного газа.

Я отправил PR, который был объединен, и теперь на этикетке написано «Лимит транзакционного газа», что, надеюсь, должно быть понятнее.