---
title: "Your First **Intelligent** Contract"
description: "Your First Intelligent Contract shows how to use non-deterministic blocks, web rendering, and strict_eq in GenLayer."
source: https://docs.genlayer.com/developers/intelligent-contracts/first-intelligent-contract
last_updated: 2026-06-11
---

# Your First **Intelligent** Contract

An Intelligent Contract in GenLayer can contain non-deterministic blocks: regular Python functions with no arguments that may return arbitrary values and must be invoked through `gl.eq_principle.*`. For blockchain integrity reasons, non-determinism must be contained within these special non-deterministic blocks, and the blocks have two important limitations:
- Storage is inaccessible from non-deterministic blocks
- State of the Python interpreter is not passed back to the deterministic code (for instance, you won't see changes in global variables)

### Simple Case
To illustrate how non-deterministic blocks work, this example gets a webpage as plain HTML and verifies that it has a link to the owner:

```py
example_web_address = 'https://example.org'
def my_non_deterministic_block():
    web_data = gl.nondet.web.render(example_web_address, mode='html')
    return 'iana' in web_data

print(gl.eq_principle.strict_eq(my_non_deterministic_block))
```

Here are a few important parts:
1. It is **mandatory** to call `gl.nondet.web.render` (or `gl.nondet.web.get`) from a function invoked via `gl.eq_principle.*`, otherwise it will give an error
2. Type annotations are not required
3. `example_web_address` gets captured without the need to specify it explicitly
4. We are getting the page in plain HTML, because we want text from a link (`<a>` HTML tag), which is not visible in the text representation
5. We are using `gl.eq_principle.strict_eq` because we return a `bool` (`True` or `False`), so there is no need to run LLMs or other complex computations: validators will agree _if_ they both get the exactly the same result, which makes sense for our case. However, if you wish to return more complex data (such as a text summary), you should use other `gl.eq_principle` methods. More on this topic on the next page

### As a Full Contract
```py
# { "Depends": "py-genlayer:1jb45aa8ynh2a9c9xn3b7qqh8sm5q93hwfp7jqmwsfhh8jpz09h6" }

from genlayer import *

class Contract(gl.Contract):
    had_iana: bool

    def __init__(self):
        example_web_address = 'https://example.org'
        def my_non_deterministic_block():
            web_data = gl.nondet.web.render(example_web_address, mode='html')
            return 'iana' in web_data
        self.had_iana = gl.eq_principle.strict_eq(my_non_deterministic_block)
```
