OWLS × ETHEREUM
一项关于 9,999 只代码生成的鸟类从随机熵迁移到以太坊主网上确定性永恒的观察研究。
01
纯链上艺术
299 行 Solidity 代码。零依赖。每只猫头鹰作为纯合约逻辑永远存在——没有服务器,没有 IPFS,只有从区块链本身产生的确定性艺术。
// tokenURI from Owls.sol
function tokenURI(uint256 tokenId) public view returns (string memory) {
require(_exists(tokenId), "Owl does not exist.");
uint256 seed = seeds[tokenId];
return descriptor.tokenURI(tokenId, seed);
}
02
区块哈希熵
在铸造时,合约读取 blockhash。这个 256 位的值,通过 keccak256 与您的代币 ID 结合,成为您猫头鹰的不可变种子。
// random() from Owls.sol
function random(uint256 tokenId) private view returns (uint256) {
return uint256(
keccak256(abi.encodePacked(blockhash(block.number - 1), tokenId))
);
}
03
位移魔法
256 位种子通过模运算分解。每个特征提取特定位:头部从位 0-47,面部从 48-95,身体从 96-143,脚从 144-191。颜色与形状交织。
// generateSeed() from Owls.sol
function generateSeed(uint256 tokenId) private view returns (uint256) {
uint256 r = random(tokenId);
uint256 headSeed = 100 * (r % 7 + 10) + ((r >> 48) % 20 + 10);
uint256 faceSeed = 100 * ((r >> 96) % 6 + 10) + ((r >> 96) % 20 + 10);
...
}
04
实时 SVG 生成
没有预存储的图像。合约使用 abi.encodePacked() 在内存中构建 SVG。自定义 WOFF2 字体内联 base64 编码,确保在任何地方都能完美渲染。
// tokenURI from OwlDescriptorV3.sol
function tokenURI(...) {
// Extract traits from seed
Trait memory head = getHead(seed / 1000000000000);
Trait memory face = getFace((seed / 100000000) % 10000);
Trait memory body = getBody((seed / 10000) % 10000);
Trait memory feet = getFeet(seed % 10000);
...
// Assemble SVG from traits
string memory rawSvg = string(
abi.encodePacked(
'<text x="160" y="130">',
head.content, face.content, body.content, feet.content,
'</text>'
));
}
05
Gas 优化工程
每一行都为效率而优化。unchecked 块在安全的地方跳过溢出检查。批量铸造最多 100 只猫头鹰使用单个 SSTORE。结果:节省 30% 的 gas。
MINT GAS
~65K
CONTRACT SIZE
24KB
ON-CHAIN %
100%
TOTAL SUPPLY
9,999
06
进化画布
三个描述符版本部署在链上。团队可以升级视觉渲染器——实现未来的竞赛、艺术改进或社区定制。您的猫头鹰种子保持不变,而其表现形式可以演进。
Network:Ethereum Mainnet
Status:
Live
我们是谁
瑞士给世界带来了手表和巧克力。现在它为你带来了 9,999 个 ASCII 猫头鹰的收藏,由两个来自阿尔卑斯山、痴迷于 Web3、ASCII 艺术和猫头鹰的家伙创造。不客气。
有问题?hey@goodbird.ioReady to own a piece of history?