From 762936805bd34ad22894937133ef77ee6be6d4a0 Mon Sep 17 00:00:00 2001 From: erhant Date: Mon, 2 Oct 2023 11:54:22 +0300 Subject: [PATCH] tidy up readme & repo --- .env.example | 3 -- README.md | 69 ++++++++++++++++++++++++++++++------------- assets/blueprint.png | Bin 33290 -> 0 bytes script/Deploy.s.sol | 16 ---------- 4 files changed, 49 insertions(+), 39 deletions(-) delete mode 100644 .env.example delete mode 100644 assets/blueprint.png delete mode 100644 script/Deploy.s.sol diff --git a/.env.example b/.env.example deleted file mode 100644 index 861d3b1..0000000 --- a/.env.example +++ /dev/null @@ -1,3 +0,0 @@ -ETHERSCAN_API_KEY=ABC123ABC123ABC123ABC123ABC123ABC1 -ROPSTEN_URL=https://eth-ropsten.alchemyapi.io/v2/ -PRIVATE_KEY=0xabc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1 diff --git a/README.md b/README.md index 6bfa269..641856a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,20 @@ -# `huffd1` +

+

+ huffd1 +

+

+ An NFT with Huff, using polynomials over a finite field of the largest 20-byte prime, instead of mappings. +

+

+ +

+ + License: MIT + + + Workflow: Tests + +

`huffd1` is a non-fungible token implementation in Huff, where the ownership of a token is given by the evaluation of a polynomial $P(x)$, defined over the finite field of prime order $p = 2^{160} - 47$, the largest 160-bit prime: @@ -12,9 +28,13 @@ $$ P \in \mathbb{F}_\mathtt{0xffffffffffffffffffffffffffffffffffffffd1}^{n-1}[X] $$ +At contract deployment, all tokens are owned by the contract owner; and as a result the main polynomial is simply a constant polynomial equal to the owner address $P(x) = \mathtt{owner}$. + +To transfer a token, we simply have to find the difference between the sender and recipient addresses, multiply that value with the basis polynomial of the respective token, and add that to the main polynomial. See `transfer` subsection below for more details. + > -> -> Warning +> +> Warning >
> > The stack comments are written in reverse order: @@ -24,9 +44,27 @@ $$ > pop // [top-N, ..., top-1] > 0x01 // [top-N, ..., top-1, 0x01] > ``` +> +> unlike the usual order described in the [Style Guide](https://docs.huff.sh/style-guide/overview/). ## Usage +Let's describe each function of [`huffd1`](./src/Huffd1.huff): + +### `ownerOf` + +To find the owner of a token $t$, simply evaluate $P(t)$ and the result will be a 160-bit number corresponding to the owner address. We use [Horner's method](https://zcash.github.io/halo2/background/polynomials.html#aside-horners-rule) to efficiently evaluate our polynomial. + +Initially, all tokens are owned by the contract deployer, which can be represented by the constant polynomial that is equal to the owner address. + +### `balanceOf` + +To find the balance of an address, iterate over all tokens and call `ownerOf`, counting the number of matching addresses along the way. + +### `transfer` + +To transfer a token $t$ from address $a \to b$, update $P(x)$ to be $P(x) + L_t(x)(b - a)$. Here, $L_t(x)$ is the Lagrange basis of the token, defined as a polynomial that is equal to 1 at $t$ and 0 on all other points. These polynomials are computed before deploying the contract, and are stored within the contract bytecode. + We have a Sage script that can export the basis polynomials, one for each token id, as a codetable where the coefficients of each polynomial are concatenated. ```c @@ -45,29 +83,20 @@ We have a Sage script that can export the basis polynomials, one for each token #define constant ORDER = 0xffffffffffffffffffffffffffffffffffffffd1 ``` -Using these, we can load polynomials from the code table, and work with them using [`Polynomial.huff`](./src/util/Polynomial.huff). Note that this codetable grows pretty large for 20-byte coefficient size, and may easily get past the 24KB maximum contract size. +Using these, we can load polynomials from the code table. -Let's describe each function of [`huffd1`](./src/Huffd1.huff): - -### `ownerOf` - -To find the owner of a token $t$, simply evaluate $P(t)$ and the result will be a 160-bit number corresponding to the owner address. We use [Horner's method](https://zcash.github.io/halo2/background/polynomials.html#aside-horners-rule) to efficiently evaluate our polynomial. - -Initially, all tokens are owned by the contract deployer, which can be represented by the constant polynomial that is equal to the owner address. - -### `balanceOf` - -To find the balance of an address, iterate over all tokens and call `ownerOf`, counting the number of matching addresses along the way. - -### `transfer` - -To transfer a token $t$ from address $a \to b$, update $P(x)$ to be $P(x) + L_t(x)(b - a)$. Here, $L_t(x)$ is the Lagrange basis of the token, defined as a polynomial that is equal to 1 at $t$ and 0 on all other points. +> +> +> Warning +>
+> +> The codetable grows pretty large for 20-byte coefficient size, and may easily get past the 24KB maximum contract size. To be more specific, for coefficient size `S` and total supply `N`, you will have `N` polynomials with `N` coefficients each, with `S` bytes per coefficient, resulting in total number of bytes of `N * N * S`. This operation results in multiplying the coefficients of $L_t(x)$ with $(b - a)$ which we will do via `MULMOD`, and afterwards summation of the coefficients of $P(x)$ and the resulting polynomial from previous step, using `ADDMOD`. Also note that $-a$ is obtained by $p-a$ where $p$ is the order of the finite field. -#### `name` +### `name` Returns the string `"Huffd1"`. diff --git a/assets/blueprint.png b/assets/blueprint.png deleted file mode 100644 index a10380bfa2bd3624890b2452730d8be8a25c2f87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33290 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 F{{xequ;>5) diff --git a/script/Deploy.s.sol b/script/Deploy.s.sol deleted file mode 100644 index 1b204c8..0000000 --- a/script/Deploy.s.sol +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-License-Identifier: Unlicense -pragma solidity ^0.8.15; - -import "foundry-huff/HuffDeployer.sol"; -import "forge-std/Script.sol"; - -interface SimpleStore { - function setValue(uint256) external; - function getValue() external returns (uint256); -} - -contract Deploy is Script { - function run() public returns (SimpleStore simpleStore) { - simpleStore = SimpleStore(HuffDeployer.deploy("SimpleStore")); - } -}