Пример #1
0
    def delete_code(self, address):
        validate_canonical_address(address, title="Storage Address")

        key = get_code_key(address)
        self._check_accessibility(key)

        del self._trie[key]
Пример #2
0
    def set_code(self, address, code):
        validate_canonical_address(address, title="Storage Address")
        validate_is_bytes(code, title="Code")

        key = get_code_key(address)
        self._check_accessibility(key)

        self._trie[key] = code
Пример #3
0
    def get_code(self, address):
        validate_canonical_address(address, title="Storage Address")

        key = get_code_key(address)
        self._check_accessibility(key)

        if key in self._trie:
            return self._trie[key]
        else:
            return b""
Пример #4
0
def test_access_restriction():
    # populate db
    state = ShardingAccountStateDB(MemoryDB())
    state.set_balance(ADDRESS, 2)
    state.set_code(ADDRESS, b"code")
    state.set_storage(ADDRESS, 123, 4)

    original_db = state.db
    original_root_hash = state.root_hash

    def make_state(access_list):
        kv_store = copy.deepcopy(original_db.wrapped_db.kv_store)
        db = MemoryDB(kv_store)
        return ShardingAccountStateDB(db,
                                      original_root_hash,
                                      access_list=access_list)

    # access lists to use
    CODE_ACCESS_LIST = [get_code_key(ADDRESS)]
    BALANCE_ACCESS_LIST = [get_balance_key(ADDRESS)]
    STORAGE_ACCESS_LIST = [get_storage_key(ADDRESS, 123)]

    # test with access list
    state = make_state(BALANCE_ACCESS_LIST)
    state.get_balance(ADDRESS)
    state.set_balance(ADDRESS, 3)
    state.delta_balance(ADDRESS, 1)

    state = make_state(CODE_ACCESS_LIST)
    state.get_code(ADDRESS)
    state.set_code(ADDRESS, b"new_code")

    state = make_state(STORAGE_ACCESS_LIST)
    state.get_storage(ADDRESS, 123)
    state.set_storage(ADDRESS, 123, 5)

    # test without access list
    state = make_state([])
    with pytest.raises(UnannouncedStateAccess):
        state.get_balance(ADDRESS)
    with pytest.raises(UnannouncedStateAccess):
        state.set_balance(ADDRESS, 3)
    with pytest.raises(UnannouncedStateAccess):
        state.delta_balance(ADDRESS, 1)

    with pytest.raises(UnannouncedStateAccess):
        state.get_code(ADDRESS)
    with pytest.raises(UnannouncedStateAccess):
        state.set_code(ADDRESS, b"new_code")

    with pytest.raises(UnannouncedStateAccess):
        state.get_storage(ADDRESS, 123)
    with pytest.raises(UnannouncedStateAccess):
        state.set_storage(ADDRESS, 123, 5)