From e64fd361b5b151dddff7a95a0203ec36bcfd8594 Mon Sep 17 00:00:00 2001 From: Greg <35093316+gskril@users.noreply.github.com> Date: Tue, 17 Dec 2024 08:58:02 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=A5=90=20(#93)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Create .gitignore * Clean up build process * Add content * Update * Fix * Update copy --- .gitignore | 1 + blog/buildAssets.ts | 42 +++++++++++++------------ blog/src/lib/get_posts.ts | 11 +++++-- content/030_linea_namechain/cover.png | Bin 0 -> 54639 bytes content/030_linea_namechain/meta.json | 8 +++++ content/030_linea_namechain/readme.mdx | 30 ++++++++++++++++++ 6 files changed, 70 insertions(+), 22 deletions(-) create mode 100644 .gitignore create mode 100644 content/030_linea_namechain/cover.png create mode 100644 content/030_linea_namechain/meta.json create mode 100644 content/030_linea_namechain/readme.mdx diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ccc9fd9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.DS_Store \ No newline at end of file diff --git a/blog/buildAssets.ts b/blog/buildAssets.ts index 7a75d03..c96c8dc 100644 --- a/blog/buildAssets.ts +++ b/blog/buildAssets.ts @@ -90,11 +90,15 @@ type Cover = { data: Buffer; }; -const getCoverImages = async () => { - const posts = await readdir(CONTENT_FOLDER); +async function getPostDirectories() { + // Load all posts from the content directory + const files = await readdir(CONTENT_FOLDER); - console.log('Posts', posts); + return files.filter((file) => file !== '.DS_Store'); +} +const getCoverImages = async () => { + const posts = await getPostDirectories(); const covers: Cover[] = []; for (const post of posts) { @@ -104,8 +108,6 @@ const getCoverImages = async () => { for (const format of ImageFormats) { const cover = `${CONTENT_FOLDER}/${post}/cover.${format}`; - console.log('Checking', cover); - try { await access(cover, constants.F_OK | constants.R_OK); const data = await readFile(cover); @@ -127,7 +129,7 @@ const getCoverImages = async () => { // Read meta.json and check for cover const meta = await import(`../content/${post}/meta.json`).catch( - () => { } + () => {} ); if (meta?.cover) { @@ -180,8 +182,9 @@ const handleCoverImages = async () => { // eslint-disable-next-line sonarjs/no-nested-template-literals const key = `${prefix || ''}cover${suffix ? `-${suffix}` : ''}`; - const output = `${ASSETS_FOLDER}/${cover.post}/${key}.${format || 'webp' - }`; + const output = `${ASSETS_FOLDER}/${cover.post}/${key}.${ + format || 'webp' + }`; console.log(`Converting image to ${output}`); @@ -189,8 +192,9 @@ const handleCoverImages = async () => { await sharp(cover.data).resize(width, height).toFile(output); - result += ` '${key}': import('./${cover.post}/${key}.${format || 'webp' - }') as Promise<{default: StaticImageData}>,\n`; + result += ` '${key}': import('./${cover.post}/${key}.${ + format || 'webp' + }') as Promise<{default: StaticImageData}>,\n`; } result += ' },\n'; @@ -216,17 +220,14 @@ const AVATAR_IMG_SETTINGS: ImageSettings[] = [ ]; const getAvatarImages = async () => { - const posts = await readdir(CONTENT_FOLDER); - - console.log('Posts', posts); - + const posts = await getPostDirectories(); const avatars: Record = {}; for (const post of posts) { // Read meta.json and check for cover const meta: BlogPostMetadata = await import( `../content/${post}/meta.json` - ).catch(() => { }); + ).catch(() => {}); if (!meta) continue; @@ -305,8 +306,9 @@ const handleAvatarImages = async () => { // eslint-disable-next-line sonarjs/no-nested-template-literals const key = `${prefix || ''}avatar${suffix ? `-${suffix}` : ''}`; - const output = `${ASSETS_FOLDER}/${author}/${key}.${format || 'webp' - }`; + const output = `${ASSETS_FOLDER}/${author}/${key}.${ + format || 'webp' + }`; console.log(`Converting image to ${output}`); @@ -324,9 +326,9 @@ const handleAvatarImages = async () => { continue; } - - result += ` '${key}': import('./${author}/${key}.${format || 'webp' - }') as Promise<{default: StaticImageData}>,\n`; + result += ` '${key}': import('./${author}/${key}.${ + format || 'webp' + }') as Promise<{default: StaticImageData}>,\n`; } result += ' },\n'; diff --git a/blog/src/lib/get_posts.ts b/blog/src/lib/get_posts.ts index 8333ee9..86af184 100644 --- a/blog/src/lib/get_posts.ts +++ b/blog/src/lib/get_posts.ts @@ -11,7 +11,7 @@ export type BlogPostMetadataPlus = BlogPostMetadata & { }; export const getPostsMetadata = async () => { - const folderNames = await readdir('../content'); + const folderNames = await getPostDirectories(); return unstable_cache(_getPostsMetadata, [folderNames.join(',')], {})(); }; @@ -22,7 +22,7 @@ export const _getPostsMetadata = async (): Promise => { const posts: BlogPostMetadataPlus[] = []; // Load all posts from the content directory - const files = await readdir('../content'); + const files = await getPostDirectories(); // For each file, get the slug and file name for (const file of files) { @@ -46,3 +46,10 @@ export const _getPostsMetadata = async (): Promise => { return aDate.getTime() > bDate.getTime() ? -1 : 1; }); }; + +async function getPostDirectories() { + // Load all posts from the content directory + const files = await readdir('../content'); + + return files.filter((file) => file !== '.DS_Store'); +} diff --git a/content/030_linea_namechain/cover.png b/content/030_linea_namechain/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..f01dccd2a71a1a0fdb1cc848eef87db70d907990 GIT binary patch literal 54639 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 IZHLJJ0f)!cg#Z8m literal 0 HcmV?d00001 diff --git a/content/030_linea_namechain/meta.json b/content/030_linea_namechain/meta.json new file mode 100644 index 0000000..e641314 --- /dev/null +++ b/content/030_linea_namechain/meta.json @@ -0,0 +1,8 @@ +{ + "slug": "ens-picks-linea", + "title": "ENS Picks Linea for Layer 2 Rollout", + "description": "ENS Labs has entered into a joint engineering partnership with the incredible team at Linea to build Namechain!", + "date": "2024-12-17", + "tags": [], + "authors": ["enslabs.eth"] +} diff --git a/content/030_linea_namechain/readme.mdx b/content/030_linea_namechain/readme.mdx new file mode 100644 index 0000000..834c348 --- /dev/null +++ b/content/030_linea_namechain/readme.mdx @@ -0,0 +1,30 @@ +The Ethereum Name Service (ENS) was designed to not only improve the UX of blockchains - but make a new, more intuitive internet. In the spirit of that mission, we are thrilled to announce that we have entered into a joint engineering partnership with the incredible team at Linea to build Namechain! + +## Why Linea? + +The selection of Linea as the foundation for Namechain emerged from a comprehensive technical and strategic evaluation conducted by the ENS Labs team, which you can read about [here](https://blog.ens.domains/post/ensv2-update). Two key architectural decisions immediately stood out about Linea: + +- Being a [Type 2 zkEVM](https://vitalik.eth.limo/general/2022/08/04/zkevm.html#type-2-fully-evm-equivalent), Linea achieves bytecode compatibility with Ethereum, ensuring that existing smart contract code and tooling can be used without modification. +- Linea's high-performance prover, alongside the configurability of its rollup parameters, enables fast state confirmation essential for reliable name resolution. + +The benefits of Linea's properties also extends to broader ecosystem compatibility. Many Ethereum execution clients - including Besu, Geth, Erigon, and Nethermind - can sync directly to chains built on the Linea stack, providing the same client diversity that secures Ethereum mainnet. This multi-client approach, combined with rapid finality guarantees, creates a robust and resilient infrastructure that is perfectly suited for the needs of ENS. + +### Proven Integration History + +In addition to Linea's standalone strong technical foundation, we at ENS Labs also share an excellent history of collaboration with their team. They were the first L2 team to build a trust-minimized implementation of [CCIP-Read (ERC-3668)](https://eips.ethereum.org/EIPS/eip-3668), enabling decentralized cross-chain name resolution for over 530,000 [linea.eth subnames](https://names.linea.build/). This integration validated ENS technology on L2 and further demonstrated Linea's capability to support ENS's specific technical requirements. + +## Why Namechain Matters + +As ENS has evolved, its role has expanded beyond simple address resolution. The protocol now serves as foundational infrastructure for decentralized identity and naming across the web3 ecosystem, supporting diverse use cases including permissionless user profiles, decentralized website hosting, and interoperability with traditional DNS systems. This expansion, while validating the core value proposition of ENS, has also highlighted the need for enhanced scalability and improved performance characteristics. + +Namechain represents a strategic response to these emerging requirements. By implementing ENS functionality on an L2 network, we can address several challenges: + +1. **Transaction Throughput**: L2 scaling enables significantly higher registration and renewal volumes, in addition to significantly increased performance for ecosystem applications. +2. **Cost Efficiency**: Transactions on L2 networks have dramatically reduced transaction fees, making ENS services more accessible to a broader user base. +3. **Extensibility**: L2s make exploring advanced naming features and complex resolution logic more practical. + +## Building the Future Together + +This partnership will combine Linea's advanced zkEVM architecture with ENS's upcoming ENSv2 protocol to create robust, scalable infrastructure for the decentralized identity system. Our joint development roadmap will focus on protocol enhancements for ENS and Linea, in addition to the broader mission of serving L2s and their users. This technical foundation will enable innovative applications in cross-chain name resolution, decentralized hosting, and identity verification. + +As we progress through our development milestones, we invite the broader technical community to participate in shaping this evolution through open-source contributions and protocol feedback.