{"id":31261,"date":"2025-10-08T00:01:52","date_gmt":"2025-10-07T21:01:52","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/"},"modified":"2025-10-08T00:01:52","modified_gmt":"2025-10-07T21:01:52","slug":"polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/","title":{"rendered":"Polkadot \u00dczerinde ink! ile \u015eiir M\u00fczayedesi Ak\u0131ll\u0131 S\u00f6zle\u015fmesi Nas\u0131l Olu\u015fturulur?"},"content":{"rendered":"<p>Polkadot a\u011f\u0131nda ink! dilini kullanarak e\u015fsiz bir \u015fiir m\u00fczayedesi ak\u0131ll\u0131 s\u00f6zle\u015fmesi geli\u015ftirmek ister misiniz? Bu rehber, temel kavramlardan ileri d\u00fczey uygulamalara kadar ad\u0131m ad\u0131m size yol g\u00f6sterecek ve dijital sanat\u0131n blok zinciri ile nas\u0131l bulu\u015ftu\u011funu g\u00f6sterecek.<\/p>\n<p>Geleneksel sanat d\u00fcnyas\u0131, dijitalle\u015fmenin ve \u00f6zellikle blok zinciri teknolojisinin y\u00fckseli\u015fiyle k\u00f6kl\u00fc bir d\u00f6n\u00fc\u015f\u00fcm ge\u00e7iriyor. Bir zamanlar fiziksel sergi salonlar\u0131na, galerilere veya bas\u0131l\u0131 yay\u0131nlara hapsolmu\u015f olan sanat eserleri, art\u0131k dijital formatlarda k\u00fcresel kitlelere ula\u015fabiliyor. Bu d\u00f6n\u00fc\u015f\u00fcmde NFT&#8217;ler (Non-Fungible Token) \u00f6nemli bir rol oynad\u0131; dijital sanat eserlerinin benzersizli\u011fini ve sahipli\u011fini blok zinciri \u00fczerinde ispatlaman\u0131n bir yolu olarak \u00f6ne \u00e7\u0131kt\u0131. Ancak, NFT&#8217;ler genellikle g\u00f6rsel sanatlar veya m\u00fczik gibi alanlarda yo\u011funla\u015f\u0131rken, edebiyat\u0131n ve \u00f6zellikle de \u015fiirin bu yenilik\u00e7i dalgadan yeterince faydalanamad\u0131\u011f\u0131 bir ger\u00e7ek. Peki, bir \u015fairin e\u015fsiz dizeleri, bir ressam\u0131n tablosu ya da bir m\u00fczisyenin bestesi kadar dijital d\u00fcnyada de\u011fer ve sahiplik bulamaz m\u0131?<\/p>\n<p>\u0130\u015fte tam da bu noktada, \u015fiir m\u00fczayedesi ak\u0131ll\u0131 s\u00f6zle\u015fmeleri devreye giriyor. Geleneksel yay\u0131nc\u0131l\u0131k modelleri genellikle sanat\u00e7\u0131lara eserleri \u00fczerinde s\u0131n\u0131rl\u0131 kontrol ve \u015feffafl\u0131k sunar. Telif haklar\u0131, da\u011f\u0131t\u0131m, sat\u0131\u015f s\u00fcre\u00e7leri karma\u015f\u0131k ve merkezi yap\u0131lar taraf\u0131ndan y\u00f6netilir. Oysa blok zinciri, sanat\u00e7\u0131lara eserlerinin yarat\u0131c\u0131l\u0131\u011f\u0131n\u0131 do\u011frudan okuyucular\u0131na veya koleksiyonerlerine ula\u015ft\u0131rma f\u0131rsat\u0131 verirken, her bir \u015fiirin \u00f6zg\u00fcnl\u00fc\u011f\u00fcn\u00fc ve sahipli\u011fini inkar edilemez bir \u015fekilde kaydetme imkan\u0131 sunar. Polkadot gibi ileri d\u00fczey bir blok zinciri a\u011f\u0131, bu vizyonu ger\u00e7e\u011fe d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in m\u00fckemmel bir zemin sa\u011flar. Polkadot, tek bir blok zincirinin s\u0131n\u0131rlamalar\u0131n\u0131n \u00f6tesine ge\u00e7erek, \u00f6l\u00e7eklenebilirlik, birlikte \u00e7al\u0131\u015fabilirlik ve \u00f6zelle\u015ftirilebilir blok zincirleri (parachain&#8217;ler) arac\u0131l\u0131\u011f\u0131yla e\u015fsiz bir altyap\u0131 sunar. Bu, sanat\u00e7\u0131lar\u0131n kendi \u00f6zel ihtiya\u00e7lar\u0131na g\u00f6re tasarlanm\u0131\u015f, d\u00fc\u015f\u00fck maliyetli ve y\u00fcksek performansl\u0131 bir ortamda ak\u0131ll\u0131 s\u00f6zle\u015fmelerini \u00e7al\u0131\u015ft\u0131rmalar\u0131na olanak tan\u0131r. \u00d6rne\u011fin, bir \u015fiir m\u00fczayedesi platformu, kendi parachain&#8217;inde veya Polkadot Relay Chain&#8217;e ba\u011fl\u0131 bir ak\u0131ll\u0131 s\u00f6zle\u015fme platformunda (\u00f6rne\u011fin Astar veya Moonbeam) \u00e7al\u0131\u015fabilir, bu da platformun yo\u011funlu\u011funa ra\u011fmen h\u0131zl\u0131 ve verimli i\u015flemler yap\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>\u015eiirlerin blok zincirinde de\u011fer bulmas\u0131, sadece finansal bir getiri meselesi de\u011fildir; ayn\u0131 zamanda sanat\u00e7\u0131-koleksiyoner aras\u0131ndaki ili\u015fkiyi yeniden tan\u0131mlar. Her bir \u015fiir, bir dijital varl\u0131k olarak, sanat\u00e7\u0131n\u0131n imzas\u0131yla m\u00fch\u00fcrlenir ve bu m\u00fch\u00fcr, zaman i\u00e7inde taklit edilemez bir \u015fekilde varl\u0131\u011f\u0131n\u0131 s\u00fcrd\u00fcr\u00fcr. Bu sayede, sanat\u00e7\u0131lar eserlerinin telif haklar\u0131n\u0131 daha etkin bir \u015fekilde y\u00f6netebilir, her sat\u0131\u015ftan veya yeniden sat\u0131\u015ftan belirli bir y\u00fczde alabilirler. Ayr\u0131ca, eserlerin tarih\u00e7esi, sahiplik de\u011fi\u015fiklikleri ve fiyat performanslar\u0131 \u015feffaf bir \u015fekilde blok zincirinde g\u00f6r\u00fclebilir, bu da piyasa g\u00fcvenini art\u0131r\u0131r ve spek\u00fclasyonu azalt\u0131r. Polkadot&#8217;un sundu\u011fu \u00e7apraz zincir yetenekleri sayesinde, bir \u015fiir sadece Polkadot ekosistemi i\u00e7inde de\u011fil, di\u011fer blok zincirleri aras\u0131nda da transfer edilebilir veya farkl\u0131 uygulamalarla entegre edilebilir. Bu, dijital \u015fiir koleksiyonculu\u011funu k\u00fcresel ve dinamik bir hale getirir, sanat\u00e7\u0131lara daha geni\u015f bir eri\u015fim ve yeni gelir modelleri sunar. Dijital sanat\u0131n gelece\u011finde \u015fiir, Polkadot&#8217;un g\u00fc\u00e7l\u00fc altyap\u0131s\u0131 ve ink! gibi geli\u015ftirici dostu ara\u00e7lar\u0131yla hak etti\u011fi de\u011feri bulmaya haz\u0131r.<\/p>\n<h2 id=\"ink-ve-polkadot-akilli-sozlesmelerine-giris-temelleri-anlamak\">ink! ve Polkadot Ak\u0131ll\u0131 S\u00f6zle\u015fmelerine Giri\u015f: Temelleri Anlamak<\/h2>\n<p>Blok zinciri d\u00fcnyas\u0131na yeni ad\u0131m atanlar veya mevcut bilgiyi peki\u015ftirmek isteyenler i\u00e7in, Polkadot ekosisteminde ak\u0131ll\u0131 s\u00f6zle\u015fme geli\u015ftirmek, ink! ad\u0131 verilen \u00f6zel bir Rust tabanl\u0131 etki alan\u0131na \u00f6zg\u00fc dil (DSL) ile ger\u00e7ekle\u015fir. ink!, geli\u015ftiricilere g\u00fcvenli, performansl\u0131 ve kolayca denetlenebilir ak\u0131ll\u0131 s\u00f6zle\u015fmeler yazma imkan\u0131 sunar. Neden Rust? \u00c7\u00fcnk\u00fc Rust, bellek g\u00fcvenli\u011fi ve performans konusunda e\u015fsiz avantajlar sunar, bu da blok zinciri gibi kritik uygulamalar i\u00e7in ideal bir se\u00e7im olmas\u0131n\u0131 sa\u011flar. ink! ile yaz\u0131lan kod, WebAssembly (Wasm) format\u0131na derlenir ve Polkadot&#8217;un EVM uyumlu olmayan, daha genel ve esnek ak\u0131ll\u0131 s\u00f6zle\u015fme platformlar\u0131nda \u00e7al\u0131\u015f\u0131r. Bu, ink!&#8217;i Ethereum&#8217;daki Solidity&#8217;ye bir alternatif ve Polkadot&#8217;un kendi ak\u0131ll\u0131 s\u00f6zle\u015fme katman\u0131 i\u00e7in birincil dil yapar.<\/p>\n<p>Polkadot&#8217;ta ak\u0131ll\u0131 s\u00f6zle\u015fmelerin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 anlamak i\u00e7in, \u00f6ncelikle Polkadot&#8217;un mimarisine k\u0131saca de\u011finmek gerekir. Polkadot, Relay Chain ad\u0131 verilen ana bir zincir ve bu zincire ba\u011flanan, parachain ad\u0131 verilen \u00f6zelle\u015ftirilmi\u015f blok zincirlerinden olu\u015fur. Ak\u0131ll\u0131 s\u00f6zle\u015fmeler do\u011frudan Relay Chain \u00fczerinde \u00e7al\u0131\u015fmaz; bunun yerine, parachain&#8217;ler veya Substrate tabanl\u0131 ak\u0131ll\u0131 s\u00f6zle\u015fme platformlar\u0131 (\u00f6rne\u011fin Astar, Shiden, Moonbeam) \u00fczerinde konu\u015fland\u0131r\u0131l\u0131r. Substrate, \u00f6zel blok zincirleri olu\u015fturmak i\u00e7in bir \u00e7er\u00e7evedir ve ink! ak\u0131ll\u0131 s\u00f6zle\u015fmeleri, Substrate tabanl\u0131 bir runtime mod\u00fcl\u00fc olan <code>pallet-contracts<\/code> arac\u0131l\u0131\u011f\u0131yla bu zincirlerde y\u00fcr\u00fct\u00fcl\u00fcr. Bu yap\u0131, s\u00f6zle\u015fmelerin daha d\u00fc\u015f\u00fck gaz \u00fccretleri, daha y\u00fcksek i\u015flem hacmi ve belirli bir parachain&#8217;in \u00f6zelle\u015ftirilmi\u015f mant\u0131\u011f\u0131na eri\u015fim gibi avantajlardan faydalanmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Geli\u015ftirme ortam\u0131n\u0131z\u0131 kurmak olduk\u00e7a basittir. \u0130lk olarak, Rust geli\u015ftirme ortam\u0131na ihtiyac\u0131n\u0131z var. Bunu <a href=\"https:\/\/rustup.rs\/\">rustup<\/a> kullanarak kolayca yapabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">\n  curl --proto '=https' --tlsv1.2 -sSf https:\/\/sh.rustup.rs | sh\n  rustup update\n  rustup install nightly\n  rustup component add rust-src --toolchain nightly\n  rustup target add wasm32-unknown-unknown --toolchain nightly\n<\/pre>\n<p><\/code><br \/>\nArd\u0131ndan, ink! ak\u0131ll\u0131 s\u00f6zle\u015fmeleri i\u00e7in gerekli olan <code>cargo contract<\/code> arac\u0131n\u0131 kurman\u0131z gerekir:<\/p>\n<pre><code class=\"language-bash\">\n  cargo install cargo-contract --force --locked\n<\/pre>\n<p><\/code><br \/>\nBu ara\u00e7, ink! projeleri olu\u015fturmak, derlemek, test etmek ve da\u011f\u0131tmak i\u00e7in kullan\u0131l\u0131r. Kurulum tamamland\u0131ktan sonra, ilk ink! projenizi olu\u015fturmak i\u00e7in <code>cargo contract new my_first_contract<\/code> komutunu kullanabilirsiniz.<\/p>\n<p>Bir ink! s\u00f6zle\u015fmesinin temel yap\u0131s\u0131, Rust'\u0131n g\u00fc\u00e7l\u00fc makro sistemini kullanarak belirlenir. Her ink! s\u00f6zle\u015fmesi, <code>#[ink::contract]<\/code> niteli\u011fi ile i\u015faretlenmi\u015f bir ana mod\u00fcl i\u00e7inde yer al\u0131r. Bu mod\u00fcl\u00fcn i\u00e7inde, s\u00f6zle\u015fmenin durumunu saklayan <code>#[ink(storage)]<\/code> niteli\u011fiyle i\u015faretlenmi\u015f bir yap\u0131 bulunur. Bu yap\u0131, bir nevi veritaban\u0131 gibidir ve s\u00f6zle\u015fmenin t\u00fcm \u00f6nemli verilerini bar\u0131nd\u0131r\u0131r. \u00d6rne\u011fin, bizim \u015fiir m\u00fczayedesi s\u00f6zle\u015fmemizde, \u015fiirlerin listesi, aktif m\u00fczayedeler, teklifler gibi bilgiler burada saklanacakt\u0131r. S\u00f6zle\u015fmenin i\u015flevselli\u011fini tan\u0131mlayan metodlar ise <code>#[ink(message)]<\/code> niteli\u011fiyle i\u015faretlenir. Bu metodlar, blok zinciri d\u0131\u015f\u0131ndan \u00e7a\u011fr\u0131labilen ve s\u00f6zle\u015fmenin durumunu de\u011fi\u015ftirebilen veya sorgulayabilen halka a\u00e7\u0131k fonksiyonlard\u0131r. Kurucu (constructor) fonksiyonlar da <code>#[ink(constructor)]<\/code> niteli\u011fiyle i\u015faretlenir ve s\u00f6zle\u015fme ilk kez da\u011f\u0131t\u0131ld\u0131\u011f\u0131nda \u00e7a\u011fr\u0131l\u0131r. Ayr\u0131ca, s\u00f6zle\u015fmede belirli olaylar\u0131n ger\u00e7ekle\u015fti\u011fini bildirmek i\u00e7in <code>#[ink(event)]<\/code> niteli\u011fiyle i\u015faretlenmi\u015f yap\u0131lar tan\u0131mlanabilir. Bu olaylar, d\u0131\u015f uygulamalar\u0131n (frontend) s\u00f6zle\u015fmedeki de\u011fi\u015fiklikleri izlemesine olanak tan\u0131r. ink!'in sa\u011flad\u0131\u011f\u0131 bu yap\u0131sal elemanlar, geli\u015ftiricilere g\u00fc\u00e7l\u00fc ve mod\u00fcler ak\u0131ll\u0131 s\u00f6zle\u015fmeler olu\u015fturma esnekli\u011fi sunar, ayn\u0131 zamanda Rust'\u0131n bellek g\u00fcvenli\u011fi garantileri sayesinde potansiyel g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 minimize eder.<\/p>\n<aside class=\"expert-tip\">\n  Uzman \u0130pucu: ink! s\u00f6zle\u015fmelerinizi geli\u015ftirirken, m\u00fcmk\u00fcn oldu\u011funca fonksiyonlar\u0131 k\u00fc\u00e7\u00fck ve odakl\u0131 tutarak kod okunabilirli\u011fini ve denetlenebilirli\u011fini art\u0131r\u0131n. Ayr\u0131ca, Rust'\u0131n hata i\u015fleme mekanizmalar\u0131ndan (<code>Result<\/code> tipi) faydalanarak s\u00f6zle\u015fmelerinizi daha dayan\u0131kl\u0131 hale getirebilirsiniz.<br \/>\n<\/aside>\n<h3 id=\"siir-muzayedesi-sozlesmesi-icin-temel-yapi-taslari-nelerdir\">\u015eiir M\u00fczayedesi S\u00f6zle\u015fmesi \u0130\u00e7in Temel Yap\u0131 Ta\u015flar\u0131 Nelerdir?<\/h3>\n<p>Bir \u015fiir m\u00fczayedesi ak\u0131ll\u0131 s\u00f6zle\u015fmesi olu\u015ftururken, projemizi olu\u015fturan temel bile\u015fenleri ve onlar\u0131n nas\u0131l etkile\u015fim kuraca\u011f\u0131n\u0131 iyi anlamam\u0131z gerekir. Bu s\u00f6zle\u015fmenin ana hedefi, \u015fairlerin dijital \u015fiirlerini listeleyebilece\u011fi, koleksiyonerlerin bu \u015fiirler i\u00e7in teklif verebilece\u011fi ve belirli bir s\u00fcre sonunda en y\u00fcksek teklifi veren ki\u015finin \u015fiirin dijital sahipli\u011fini kazanaca\u011f\u0131 \u015feffaf ve otomatik bir sistem sunmakt\u0131r. Bu temel i\u015flevselli\u011fi sa\u011flamak i\u00e7in s\u00f6zle\u015fmemizin baz\u0131 kilit \u00f6zelliklere ve veri yap\u0131lar\u0131na sahip olmas\u0131 gerekir.<\/p>\n<p>S\u00f6zle\u015fmemizin en temel durum de\u011fi\u015fkeni (storage), m\u00fczayedeye sunulacak \u015fiirleri ve devam eden m\u00fczayedeleri tutmakt\u0131r. Her bir \u015fiir, benzersiz bir kimlik (ID), ba\u015fl\u0131k, i\u00e7erik, sanat\u00e7\u0131 bilgisi ve listelenip listelenmedi\u011fini belirten bir durum ile temsil edilebilir. Bu, bir t\u00fcr basit NFT (Non-Fungible Token) yap\u0131s\u0131na benzer, ancak burada \"NFT\" terimi yerine \"dijital \u015fiir varl\u0131\u011f\u0131\" terimini kullanmak daha uygun olabilir. Ayr\u0131ca, her bir aktif m\u00fczayede i\u00e7in de ayr\u0131 bir durum kayd\u0131 tutulmal\u0131d\u0131r. Bu kay\u0131t, hangi \u015fiirin m\u00fczayede edildi\u011fini, m\u00fczayedenin ba\u015flang\u0131\u00e7 ve biti\u015f zamanlar\u0131n\u0131, mevcut en y\u00fcksek teklifi ve en y\u00fcksek teklifi vereni, m\u00fczayedenin aktif olup olmad\u0131\u011f\u0131n\u0131 ve sanat\u00e7\u0131n\u0131n \u00f6deme adresini i\u00e7ermelidir. Bu sayede, t\u00fcm m\u00fczayede s\u00fcreci blok zinciri \u00fczerinde \u015feffaf bir \u015fekilde izlenebilir ve y\u00f6netilebilir.<\/p>\n<p>Temel i\u015flevler veya mesajlar, s\u00f6zle\u015fmenin d\u0131\u015f d\u00fcnya ile nas\u0131l etkile\u015fime girece\u011fini belirler. \u0130lk olarak, \u015fairlerin s\u00f6zle\u015fmeye yeni \u015fiirler ekleyebilmesi i\u00e7in bir fonksiyona (<code>add_poem<\/code>) ihtiyac\u0131m\u0131z var. Bu fonksiyon, \u015fiirin metadata's\u0131n\u0131 (ba\u015fl\u0131k, i\u00e7erik vb.) alacak ve onu s\u00f6zle\u015fmenin depolama alan\u0131na kaydedecektir. \u0130kinci olarak, bir \u015fiirin m\u00fczayedesini ba\u015flatmak i\u00e7in bir <code>start_auction<\/code> fonksiyonu gereklidir. Bu fonksiyon, \u015fiir ID'sini, ba\u015flang\u0131\u00e7 fiyat\u0131n\u0131 ve m\u00fczayedenin ne kadar s\u00fcrece\u011fini alarak yeni bir m\u00fczayede kayd\u0131 olu\u015fturacakt\u0131r. En kritik i\u015flevlerden biri, elbette, teklif verme mekanizmas\u0131d\u0131r. <code>place_bid<\/code> fonksiyonu, bir kullan\u0131c\u0131n\u0131n belirli bir m\u00fczayedeye teklif vermesini sa\u011flar. Bu fonksiyonun, teklifin mevcut en y\u00fcksek tekliften y\u00fcksek olup olmad\u0131\u011f\u0131n\u0131 kontrol etmesi ve \u00f6nceki en y\u00fcksek teklif sahibine paras\u0131n\u0131 iade etmesi gibi \u00f6nemli mant\u0131klar\u0131 i\u00e7ermesi gerekir. Son olarak, bir m\u00fczayedenin s\u00fcresi doldu\u011funda, <code>end_auction<\/code> fonksiyonu \u00e7a\u011fr\u0131larak kazanan belirlenmeli ve \u015fiirin sahipli\u011fi en y\u00fcksek teklifi verene aktar\u0131l\u0131rken, elde edilen gelirin sanat\u00e7\u0131ya (ve varsa platforma) aktar\u0131lmas\u0131 sa\u011flanmal\u0131d\u0131r. Bu, sanat\u00e7\u0131ya telif hakk\u0131 gelirlerini do\u011frudan ve g\u00fcvenli bir \u015fekilde alma imkan\u0131 sunar.<\/p>\n<p>S\u00f6zle\u015fmemizde ger\u00e7ekle\u015fen \u00f6nemli olaylar\u0131 bildirmek i\u00e7in olay tan\u0131mlamalar\u0131 (<code>events<\/code>) kullanmak, d\u0131\u015f uygulamalar\u0131n (\u00f6rne\u011fin bir web aray\u00fcz\u00fc) s\u00f6zle\u015fmedeki de\u011fi\u015fikliklere ger\u00e7ek zamanl\u0131 olarak tepki vermesini sa\u011flar. \u00d6rne\u011fin, bir \u015fiir eklendi\u011finde (<code>PoemAdded<\/code>), bir teklif verildi\u011finde (<code>BidPlaced<\/code>) veya bir m\u00fczayede sonu\u00e7land\u0131\u011f\u0131nda (<code>AuctionEnded<\/code>) olaylar yayabiliriz. Bu olaylar, kullan\u0131c\u0131lara anl\u0131k bildirimler g\u00f6ndermek, bir m\u00fczayede panosunu g\u00fcncellemek veya blok zinciri ka\u015fiflerinde s\u00f6zle\u015fme hareketlerini g\u00f6r\u00fcnt\u00fclemek i\u00e7in \u00e7ok \u00f6nemlidir. Bu temel yap\u0131 ta\u015flar\u0131n\u0131 do\u011fru bir \u015fekilde tan\u0131mlayarak ve uygulayarak, sa\u011flam, g\u00fcvenilir ve kullan\u0131c\u0131 dostu bir \u015fiir m\u00fczayedesi ak\u0131ll\u0131 s\u00f6zle\u015fmesi olu\u015fturabiliriz. Her bir bile\u015fenin dikkatli tasar\u0131m\u0131, s\u00f6zle\u015fmenin uzun vadeli ba\u015far\u0131s\u0131 ve g\u00fcvenli\u011fi i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h2 id=\"adim-adim-ink-ile-siir-muzayedesi-akilli-sozlesmesi-gelistirme\">Ad\u0131m Ad\u0131m ink! ile \u015eiir M\u00fczayedesi Ak\u0131ll\u0131 S\u00f6zle\u015fmesi Geli\u015ftirme<\/h2>\n<p>\u015eimdi teorik bilgileri prati\u011fe d\u00f6kelim ve ink! kullanarak bir \u015fiir m\u00fczayedesi ak\u0131ll\u0131 s\u00f6zle\u015fmesi geli\u015ftirmeye ba\u015flayal\u0131m. \u0130lk ad\u0131m, yeni bir ink! projesi olu\u015fturmakt\u0131r. Terminalinizi a\u00e7\u0131n ve a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">\n  cargo contract new poetry_auction\n  cd poetry_auction\n<\/pre>\n<p><\/code><br \/>\nBu komut, sizin i\u00e7in temel bir ink! s\u00f6zle\u015fme yap\u0131s\u0131 olu\u015fturacakt\u0131r. <code>src\/lib.rs<\/code> dosyas\u0131n\u0131 a\u00e7t\u0131\u011f\u0131n\u0131zda, bir boilerplate kod g\u00f6receksiniz. \u015eimdi bu kodu, \u015fiir m\u00fczayedesi mant\u0131\u011f\u0131n\u0131 i\u00e7erecek \u015fekilde de\u011fi\u015ftirelim.<\/p>\n<p>\u00d6ncelikle, s\u00f6zle\u015fmemizin temel durumunu (<code>storage<\/code>) tan\u0131mlayal\u0131m ve \u015fiirler ile m\u00fczayedeler i\u00e7in \u00f6zel veri yap\u0131lar\u0131 (<code>struct<\/code>) olu\u015ftural\u0131m. Bu yap\u0131lar, blok zinciri \u00fczerinde saklanacak verilerin nas\u0131l organize edilece\u011fini belirler.<\/p>\n<pre><code class=\"language-rust\">\n  \/\/ src\/lib.rs\n  #![cfg_attr(not(feature = \"std\"), no_std)]\n  #![allow(clippy::new_without_default)]\n\n  use ink_lang as ink;\n\n  #[ink::contract]\n  mod poetry_auction {\n      use ink_storage::collections::HashMap;\n      use ink_env::CallFlags; \/\/ Para transferleri i\u00e7in\n      use ink_prelude::string::String;\n      use ink_prelude::vec::Vec; \/\/ Gerekirse kullan\u0131labilir\n\n      \/\/\/ S\u00f6zle\u015fme hata t\u00fcrleri\n      #[derive(Debug, PartialEq, Eq, scale::Encode, scale::Decode)]\n      #[cfg_attr(feature = \"std\", derive(ink_primitives::LangError))]\n      pub enum ContractError {\n          \/\/\/ Yetkilendirme hatas\u0131\n          Unauthorized,\n          \/\/\/ \u015eiir bulunamad\u0131\n          PoemNotFound,\n          \/\/\/ M\u00fczayede bulunamad\u0131\n          AuctionNotFound,\n          \/\/\/ M\u00fczayede aktif de\u011fil\n          AuctionNotActive,\n          \/\/\/ Ge\u00e7ersiz m\u00fczayede s\u00fcresi\n          InvalidAuctionTime,\n          \/\/\/ Teklif \u00e7ok d\u00fc\u015f\u00fck\n          BidTooLow,\n          \/\/\/ M\u00fczayede hen\u00fcz bitmedi\n          AuctionNotEnded,\n          \/\/\/ Zaten bitmi\u015f m\u00fczayede\n          AuctionAlreadyEnded,\n          \/\/\/ M\u00fczayede zaten ba\u015flam\u0131\u015f\n          AuctionAlreadyStarted,\n          \/\/\/ Para transferi ba\u015far\u0131s\u0131z oldu\n          TransferFailed,\n          \/\/\/ \u015eiir zaten listelenmi\u015f\n          PoemAlreadyListed,\n      }\n\n      \/\/\/ Ak\u0131ll\u0131 s\u00f6zle\u015fmede kullan\u0131lacak genel Result tipi\n      pub type Result<T> = core::result::Result<T, ContractError>;\n\n      \/\/\/ Bir \u015fiiri temsil eden yap\u0131\n      #[derive(scale::Encode, scale::Decode, scale::TypeInfo)]\n      #[cfg_attr(feature = \"std\", derive(Debug, PartialEq, Eq))]\n      pub struct Poem {\n          id: u32,\n          title: String,\n          content: String,\n          artist: AccountId,\n          is_listed: bool, \/\/ M\u00fczayedede listelenmi\u015f mi?\n      }\n\n      \/\/\/ Bir m\u00fczayedeyi temsil eden yap\u0131\n      #[derive(scale::Encode, scale::Decode, scale::TypeInfo)]\n      #[cfg_attr(feature = \"std\", derive(Debug, PartialEq, Eq))]\n      pub struct Auction {\n          poem_id: u32,\n          start_time: u64, \/\/ M\u00fczayedenin ba\u015flad\u0131\u011f\u0131 blok zaman\u0131\n          end_time: u64,   \/\/ M\u00fczayedenin bitece\u011fi blok zaman\u0131\n          highest_bid: Balance,\n          highest_bidder: AccountId,\n          is_active: bool,\n          artist_payout_address: AccountId,\n          previous_highest_bidder: Option<(AccountId, Balance)>, \/\/ \u00d6nceki en y\u00fcksek teklif sahibinin iade edilecek miktar\u0131\n      }\n\n      \/\/\/ S\u00f6zle\u015fmenin ana depolama yap\u0131s\u0131\n      #[ink(storage)]\n      pub struct PoetryAuction {\n          owner: AccountId,\n          poems: HashMap<u32, Poem>,\n          auction_id_counter: u32,\n          active_auctions: HashMap<u32, Auction>,\n          poem_counter: u32, \/\/ Benzersiz \u015fiir ID'leri i\u00e7in\n      }\n\n      \/\/\/ M\u00fczayede olaylar\u0131\n      #[ink(event)]\n      pub struct PoemAdded {\n          #[ink(topic)]\n          poem_id: u32,\n          #[ink(topic)]\n          artist: AccountId,\n          title: String,\n      }\n\n      #[ink(event)]\n      pub struct AuctionStarted {\n          #[ink(topic)]\n          poem_id: u32,\n          #[ink(topic)]\n          auction_id: u32, \/\/ M\u00fczayede ID'si olmasa da \u015fiir ID'si yeterli olabilir\n          end_time: u64,\n          initial_bid: Balance,\n      }\n\n      #[ink(event)]\n      pub struct BidPlaced {\n          #[ink(topic)]\n          poem_id: u32,\n          #[ink(topic)]\n          bidder: AccountId,\n          amount: Balance,\n          previous_highest_bidder: Option<AccountId>,\n          previous_highest_bid: Balance,\n      }\n\n      #[ink(event)]\n      pub struct AuctionEnded {\n          #[ink(topic)]\n          poem_id: u32,\n          #[ink(topic)]\n          winner: AccountId,\n          final_bid: Balance,\n      }\n\n      impl PoetryAuction {\n          \/\/\/ S\u00f6zle\u015fmenin kurucusu, s\u00f6zle\u015fmeyi da\u011f\u0131tan hesab\u0131 sahibi olarak ayarlar.\n          #[ink(constructor)]\n          pub fn new() -> Self {\n              Self {\n                  owner: Self::env().caller(),\n                  poems: HashMap::new(),\n                  auction_id_counter: 0,\n                  active_auctions: HashMap::new(),\n                  poem_counter: 0,\n              }\n          }\n      }\n<\/pre>\n<p><\/code><br \/>\nYukar\u0131daki kod blo\u011fu, s\u00f6zle\u015fmemizin veri yap\u0131lar\u0131n\u0131 ve bir kurucu fonksiyonunu tan\u0131mlar. <code>Poem<\/code> ve <code>Auction<\/code> yap\u0131lar\u0131, bir \u015fiirin ve bir m\u00fczayedenin temel \u00f6zelliklerini tutar. <code>PoetryAuction<\/code> depolama alan\u0131 ise t\u00fcm \u015fiirleri ve aktif m\u00fczayedeleri i\u00e7erir. Ayr\u0131ca, s\u00f6zle\u015fmemizin olas\u0131 hata durumlar\u0131n\u0131 y\u00f6netmek i\u00e7in bir <code>ContractError<\/code> enum'u ve d\u0131\u015f uygulamalar\u0131n izleyebilece\u011fi olaylar (<code>events<\/code>) tan\u0131mlad\u0131k. \u00d6zellikle <code>HashMap<\/code> kullanarak dinamik olarak \u00f6\u011feler ekleyip \u00e7\u0131karabiliriz.<\/p>\n<p>\u015eimdi, s\u00f6zle\u015fmemizin temel i\u015flevlerini implement edelim:<\/p>\n<pre><code class=\"language-rust\">\n  impl PoetryAuction {\n      \/\/ ... (yukar\u0131daki constructor ve storage tan\u0131mlar\u0131) ...\n\n      \/\/\/ Yeni bir \u015fiiri s\u00f6zle\u015fmeye ekler. Sadece sahibinin (owner) eri\u015fimine a\u00e7\u0131kt\u0131r.\n      #[ink(message)]\n      pub fn add_poem(&mut self, title: String, content: String) -> Result<u32> {\n          let caller = Self::env().caller();\n          if caller != self.owner {\n              return Err(ContractError::Unauthorized);\n          }\n\n          self.poem_counter += 1;\n          let new_poem_id = self.poem_counter;\n          let poem = Poem {\n              id: new_poem_id,\n              title: title.clone(),\n              content,\n              artist: caller,\n              is_listed: false,\n          };\n          self.poems.insert(new_poem_id, poem);\n\n          Self::env().emit_event(PoemAdded {\n              poem_id: new_poem_id,\n              artist: caller,\n              title,\n          });\n\n          Ok(new_poem_id)\n      }\n\n      \/\/\/ Bir \u015fiir i\u00e7in m\u00fczayede ba\u015flat\u0131r. Sadece \u015fiirin sanat\u00e7\u0131s\u0131 veya sahibi ba\u015flatabilir.\n      #[ink(message)]\n      pub fn start_auction(&mut self, poem_id: u32, duration_blocks: u64, initial_bid: Balance) -> Result<()> {\n          let mut poem = self.poems.get_mut(&poem_id).ok_or(ContractError::PoemNotFound)?;\n          if poem.artist != Self::env().caller() && self.owner != Self::env().caller() { \/\/ Sanat\u00e7\u0131 veya sahibi ba\u015flatabilir\n              return Err(ContractError::Unauthorized);\n          }\n          if poem.is_listed {\n              return Err(ContractError::PoemAlreadyListed);\n          }\n          if duration_blocks == 0 {\n              return Err(ContractError::InvalidAuctionTime);\n          }\n          if self.active_auctions.values().any(|auction| auction.poem_id == poem_id && auction.is_active) {\n              return Err(ContractError::AuctionAlreadyStarted);\n          }\n\n          let current_block_timestamp = Self::env().block_timestamp();\n          let end_time = current_block_timestamp + duration_blocks; \/\/ Basitlik i\u00e7in block timestamp kullan\u0131yoruz\n\n          self.auction_id_counter += 1;\n          let new_auction_id = self.auction_id_counter;\n\n          let auction = Auction {\n              poem_id,\n              start_time: current_block_timestamp,\n              end_time,\n              highest_bid: initial_bid,\n              highest_bidder: AccountId::from([0x0; 32]), \/\/ Ba\u015flang\u0131\u00e7ta bo\u015f veya s\u00f6zle\u015fmenin kendi adresi\n              is_active: true,\n              artist_payout_address: poem.artist,\n              previous_highest_bidder: None,\n          };\n\n          self.active_auctions.insert(new_auction_id, auction);\n          poem.is_listed = true; \/\/ \u015eiiri listelenmi\u015f olarak i\u015faretle\n\n          Self::env().emit_event(AuctionStarted {\n              poem_id,\n              auction_id: new_auction_id,\n              end_time,\n              initial_bid,\n          });\n\n          Ok(())\n      }\n\n      \/\/\/ Bir m\u00fczayedeye teklif verir.\n      #[ink(message, payable)]\n      pub fn place_bid(&mut self, poem_id: u32) -> Result<()> {\n          let mut auction_id_to_find = None;\n          for (id, auction) in self.active_auctions.iter() {\n              if auction.poem_id == poem_id && auction.is_active {\n                  auction_id_to_find = Some(*id);\n                  break;\n              }\n          }\n          let auction_id = auction_id_to_find.ok_or(ContractError::AuctionNotFound)?;\n\n          let mut auction = self.active_auctions.get_mut(&auction_id).ok_or(ContractError::AuctionNotFound)?;\n          if !auction.is_active || Self::env().block_timestamp() >= auction.end_time {\n              return Err(ContractError::AuctionNotActive);\n          }\n\n          let caller = Self::env().caller();\n          let current_bid = Self::env().transferred_value();\n\n          if current_bid <= auction.highest_bid {\n              return Err(ContractError::BidTooLow);\n          }\n\n          \/\/ \u00d6nceki en y\u00fcksek teklif sahibine paray\u0131 iade et\n          if auction.highest_bidder != AccountId::from([0x0; 32]) { \/\/ E\u011fer daha \u00f6nce teklif veren varsa\n              let previous_bidder = auction.highest_bidder;\n              let previous_bid = auction.highest_bid;\n              \n              match Self::env().transfer(previous_bidder, previous_bid) {\n                  Ok(_) => {\n                      auction.previous_highest_bidder = Some((previous_bidder, previous_bid));\n                  },\n                  Err(_) => {\n                      \/\/ Transfer ba\u015far\u0131s\u0131z olursa ne yapaca\u011f\u0131m\u0131za karar vermeliyiz.\n                      \/\/ Basit bir senaryoda i\u015flemi geri d\u00f6nd\u00fcrebilir veya hatay\u0131 i\u015fleyebiliriz.\n                      \/\/ Yeniden deneme mekanizmas\u0131 veya manuel kurtarma gerekebilir.\n                      return Err(ContractError::TransferFailed);\n                  }\n              }\n          }\n\n          let old_highest_bid = auction.highest_bid;\n          let old_highest_bidder = auction.highest_bidder;\n\n          auction.highest_bid = current_bid;\n          auction.highest_bidder = caller;\n\n          Self::env().emit_event(BidPlaced {\n              poem_id,\n              bidder: caller,\n              amount: current_bid,\n              previous_highest_bidder: if old_highest_bidder != AccountId::from([0x0; 32]) { Some(old_highest_bidder) } else { None },\n              previous_highest_bid: old_highest_bid,\n          });\n\n          Ok(())\n      }\n\n      \/\/\/ M\u00fczayedeyi sonland\u0131r\u0131r ve kazanan\u0131 belirler.\n      #[ink(message)]\n      pub fn end_auction(&mut self, poem_id: u32) -> Result<()> {\n          let mut auction_id_to_find = None;\n          for (id, auction) in self.active_auctions.iter() {\n              if auction.poem_id == poem_id && auction.is_active {\n                  auction_id_to_find = Some(*id);\n                  break;\n              }\n          }\n          let auction_id = auction_id_to_find.ok_or(ContractError::AuctionNotFound)?;\n          \n          let mut auction = self.active_auctions.get_mut(&auction_id).ok_or(ContractError::AuctionNotFound)?;\n          if !auction.is_active {\n              return Err(ContractError::AuctionAlreadyEnded);\n          }\n          if Self::env().block_timestamp() < auction.end_time {\n              return Err(ContractError::AuctionNotEnded);\n          }\n\n          \/\/ M\u00fczayedeyi devre d\u0131\u015f\u0131 b\u0131rak\n          auction.is_active = false;\n\n          if auction.highest_bidder == AccountId::from([0x0; 32]) {\n              \/\/ Hi\u00e7 teklif verilmediyse, \u015fiiri tekrar listesiz yap\n              if let Some(poem) = self.poems.get_mut(&#038;poem_id) {\n                  poem.is_listed = false;\n              }\n              \/\/ Bu durumda bir kazanan yok, sadece m\u00fczayede pasif hale gelir\n          } else {\n              \/\/ En y\u00fcksek teklifi veren, \u015fiirin yeni sahibi olur\n              if let Some(mut poem) = self.poems.get_mut(&#038;poem_id) {\n                  poem.artist = auction.highest_bidder; \/\/ \u015eiirin sanat\u00e7\u0131s\u0131 art\u0131k kazanan\n                  \/\/ Burada poem.artist'i de\u011fi\u015ftirmek yerine, \u015fiirin orijinal sahibini tutan\n                  \/\/ ve NFT gibi transfer edilebilir bir 'sahip' alan\u0131 olan bir yap\u0131 kullanmak daha iyi olurdu.\n                  \/\/ Basitlik i\u00e7in burada artist'i g\u00fcncelliyoruz.\n              }\n\n              \/\/ Sanat\u00e7\u0131ya \u00f6deme yap\n              let artist_cut = auction.highest_bid; \/\/ Basitlik i\u00e7in t\u00fcm teklifi sanat\u00e7\u0131ya aktar\n              match Self::env().transfer(auction.artist_payout_address, artist_cut) {\n                  Ok(_) => {},\n                  Err(_) => {\n                      \/\/ Kritik hata: Sanat\u00e7\u0131ya \u00f6deme yap\u0131lamad\u0131.\n                      \/\/ Bu durumda i\u015flemi geri almal\u0131 veya manuel m\u00fcdahale i\u00e7in bir mekanizma olmal\u0131.\n                      \/\/ Basitlik i\u00e7in burada bir hata d\u00f6nd\u00fcr\u00fcyoruz.\n                      return Err(ContractError::TransferFailed);\n                  }\n              }\n\n              Self::env().emit_event(AuctionEnded {\n                  poem_id,\n                  winner: auction.highest_bidder,\n                  final_bid: auction.highest_bid,\n              });\n          }\n          Ok(())\n      }\n\n      \/\/\/ \u015eiir detaylar\u0131n\u0131 getirir (view fonksiyonu)\n      #[ink(message)]\n      pub fn get_poem_details(&self, poem_id: u32) -> Result<Poem> {\n          self.poems.get(&poem_id).cloned().ok_or(ContractError::PoemNotFound)\n      }\n\n      \/\/\/ Aktif bir m\u00fczayede varsa detaylar\u0131n\u0131 getirir (view fonksiyonu)\n      #[ink(message)]\n      pub fn get_active_auction_details(&self, poem_id: u32) -> Result<Auction> {\n          let auction_option = self.active_auctions.values().find(|auction| auction.poem_id == poem_id && auction.is_active);\n          auction_option.cloned().ok_or(ContractError::AuctionNotFound)\n      }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kod, temel bir \u015fiir m\u00fczayedesi ak\u0131ll\u0131 s\u00f6zle\u015fmesinin nas\u0131l g\u00f6r\u00fcnebilece\u011fini g\u00f6sterir. <code>add_poem<\/code> fonksiyonu ile \u015fiirler eklenir, <code>start_auction<\/code> ile bir \u015fiir i\u00e7in m\u00fczayede ba\u015flat\u0131l\u0131r. <code>place_bid<\/code> fonksiyonu, g\u00f6nderilen de\u011feri (payable) kullanarak teklifleri y\u00f6netir ve \u00f6nceki en y\u00fcksek teklif sahibine paras\u0131n\u0131 iade eder. <code>end_auction<\/code> ise m\u00fczayedenin biti\u015f zaman\u0131n\u0131 kontrol ederek kazanan\u0131 belirler ve ilgili para transferlerini yapar. Ayr\u0131ca, \u015fiir ve m\u00fczayede detaylar\u0131n\u0131 sorgulamak i\u00e7in <code>get_poem_details<\/code> ve <code>get_active_auction_details<\/code> gibi okuma (<code>view<\/code>) fonksiyonlar\u0131 da ekledik. Bu s\u00f6zle\u015fme basit bir \u00f6rnek te\u015fkil ederken, ger\u00e7ek d\u00fcnya senaryolar\u0131nda daha fazla \u00f6zellik ve g\u00fcvenlik \u00f6nlemi i\u00e7erebilir.<\/p>\n<p><strong>Vaka Analizi: \"Dijital \u015eiir Koleksiyonu Olu\u015fturma ve Sanat\u00e7\u0131 Gelirlerinin \u015eeffafl\u0131\u011f\u0131\"<\/strong><\/p>\n<p>D\u00fc\u015f\u00fcn\u00fcn ki 'Ethereal Dize' ad\u0131nda gen\u00e7 ve yetenekli bir \u015fair, eserlerini dijital d\u00fcnyada hak etti\u011fi de\u011fere ula\u015ft\u0131rmak istiyor. Geleneksel yay\u0131nc\u0131l\u0131k modelleri ona ya \u00e7ok d\u00fc\u015f\u00fck telif \u00fccretleri sunuyor ya da eserleri \u00fczerindeki kontrol\u00fcn\u00fc k\u0131s\u0131tl\u0131yor. 'Ethereal Dize', Polkadot tabanl\u0131 ink! ile geli\u015ftirilmi\u015f bir \u015fiir m\u00fczayedesi platformu kullanarak, en yeni \u015fiiri \"Y\u0131ld\u0131zlar\u0131n F\u0131s\u0131lt\u0131s\u0131\"n\u0131 listeliyor. <code>add_poem<\/code> fonksiyonunu \u00e7a\u011f\u0131rarak \u015fiirin ba\u015fl\u0131\u011f\u0131n\u0131 ve i\u00e7eri\u011fini s\u00f6zle\u015fmeye ekliyor. Ard\u0131ndan, \u015fiiri belirli bir ba\u015flang\u0131\u00e7 teklifi ve 24 saatlik bir s\u00fcre ile <code>start_auction<\/code> fonksiyonu arac\u0131l\u0131\u011f\u0131yla m\u00fczayedeye \u00e7\u0131kar\u0131yor. M\u00fczayede ba\u015flad\u0131\u011f\u0131nda, d\u00fcnya \u00e7ap\u0131ndaki koleksiyonerler, \u015fiirin benzersizli\u011fini ve blok zinciri \u00fczerindeki kal\u0131c\u0131 kayd\u0131n\u0131 takdir ederek teklif vermeye ba\u015fl\u0131yorlar. Her yeni teklif verildi\u011finde, <code>place_bid<\/code> fonksiyonu, \u00f6nceki en y\u00fcksek teklif sahibine hemen fonlar\u0131n\u0131 iade ediyor, bu da koleksiyonerler i\u00e7in g\u00fcvenli ve dinamik bir s\u00fcre\u00e7 sa\u011fl\u0131yor. M\u00fczayede s\u00fcresi doldu\u011funda, 'Ethereal Dize' veya platform y\u00f6neticisi <code>end_auction<\/code> fonksiyonunu \u00e7a\u011f\u0131r\u0131yor. En y\u00fcksek teklifi veren ki\u015fi, \u015fiirin dijital sahipli\u011fini kazan\u0131yor ve \u015fiir s\u00f6zle\u015fme i\u00e7inde o ki\u015finin hesab\u0131na i\u015faretleniyor (veya daha geli\u015fmi\u015f bir NFT mant\u0131\u011f\u0131yla sahiplik transferi ger\u00e7ekle\u015fiyor). En \u00f6nemlisi, \u015fiirin sat\u0131\u015f\u0131ndan elde edilen gelirin tamam\u0131 veya \u00fczerinde anla\u015f\u0131lan y\u00fczdesi, \u015feffaf bir \u015fekilde do\u011frudan 'Ethereal Dize'nin c\u00fczdan\u0131na aktar\u0131l\u0131yor. Bu sayede 'Ethereal Dize', eserlerinin de\u011ferini do\u011frudan belirleyebilir, telif haklar\u0131n\u0131 koruyabilir ve arac\u0131lar olmadan gelir elde edebilir, bu da ona sanat\u0131na odaklanmas\u0131 i\u00e7in daha fazla \u00f6zg\u00fcrl\u00fck tan\u0131r.<\/p>\n<h3 id=\"akilli-sozlesme-guvenligi-ve-ileri-duzey-ipuclari\">Ak\u0131ll\u0131 S\u00f6zle\u015fme G\u00fcvenli\u011fi ve \u0130leri D\u00fczey \u0130pu\u00e7lar\u0131<\/h3>\n<p>Ak\u0131ll\u0131 s\u00f6zle\u015fmeler, blok zincirinin de\u011fi\u015fmez do\u011fas\u0131 gere\u011fi, bir kez da\u011f\u0131t\u0131ld\u0131\u011f\u0131nda kolayca de\u011fi\u015ftirilemezler. Bu durum, onlar\u0131 inan\u0131lmaz derecede g\u00fc\u00e7l\u00fc k\u0131larken, ayn\u0131 zamanda kritik g\u00fcvenlik risklerini de beraberinde getirir. K\u00fc\u00e7\u00fck bir hata veya a\u00e7\u0131k, b\u00fcy\u00fck finansal kay\u0131plara veya s\u00f6zle\u015fmenin tamamen i\u015flevsiz hale gelmesine yol a\u00e7abilir. Bu nedenle, ink! ile ak\u0131ll\u0131 s\u00f6zle\u015fme geli\u015ftirirken g\u00fcvenli\u011fi en \u00f6ncelikli konu olarak ele almak elzemdir. \u0130lk olarak, \"reentrancy\" sald\u0131r\u0131lar\u0131, ak\u0131ll\u0131 s\u00f6zle\u015fme d\u00fcnyas\u0131ndaki en k\u00f6t\u00fc \u015f\u00f6hretli g\u00fcvenlik a\u00e7\u0131klar\u0131ndan biridir. Bu t\u00fcr sald\u0131r\u0131lar, bir s\u00f6zle\u015fmenin ba\u015fka bir s\u00f6zle\u015fmeyle etkile\u015fime girdi\u011finde, ikinci s\u00f6zle\u015fmenin ilk s\u00f6zle\u015fmeyi bitmeden tekrar \u00e7a\u011f\u0131rmas\u0131yla meydana gelir ve fonlar\u0131n defalarca \u00e7ekilmesine olanak tan\u0131r. ink! ve Rust'\u0131n do\u011fas\u0131 gere\u011fi bu t\u00fcr sald\u0131r\u0131lara kar\u015f\u0131 bir nebze daha diren\u00e7li olunsa da, \u00f6zellikle <code>transfer<\/code> veya <code>call<\/code> gibi harici \u00e7a\u011fr\u0131lar yap\u0131l\u0131rken dikkatli olunmal\u0131d\u0131r. En iyi pratik, \"checks-effects-interactions\" desenini uygulamakt\u0131r: \u00f6nce t\u00fcm kontrolleri yap\u0131n, sonra s\u00f6zle\u015fmenin durumunu g\u00fcncelleyin ve en son olarak harici \u00e7a\u011fr\u0131lar\u0131 ger\u00e7ekle\u015ftirin. Bu, s\u00f6zle\u015fme durumunun beklenmedik bir \u015fekilde de\u011fi\u015ftirilmesini \u00f6nler.<\/p>\n<p>\u0130kinci olarak, \"integer overflow\/underflow\" problemleri de s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan g\u00fcvenlik a\u00e7\u0131klar\u0131ndand\u0131r. Bu durumlar, say\u0131sal de\u011fi\u015fkenlerin ta\u015f\u0131yabilece\u011finden daha b\u00fcy\u00fck veya daha k\u00fc\u00e7\u00fck bir de\u011fer ald\u0131\u011f\u0131nda meydana gelir. \u00d6rne\u011fin, bir sayaca s\u00fcrekli olarak 1 eklendi\u011finde ve bu saya\u00e7 maksimum de\u011ferine ula\u015ft\u0131\u011f\u0131nda, bir sonraki ekleme i\u015flemi sayac\u0131n en d\u00fc\u015f\u00fck de\u011ferine s\u0131f\u0131rlanmas\u0131na (overflow) neden olabilir. ink! ve Rust'ta, \u00e7o\u011fu durumda, varsay\u0131lan olarak bu t\u00fcr ta\u015fmalar derleme zaman\u0131nda veya \u00e7al\u0131\u015fma zaman\u0131nda bir panik hatas\u0131na yol a\u00e7ar. Ancak, \u00f6zellikle matematiksel i\u015flemler yaparken ve kullan\u0131c\u0131 girdilerini i\u015flerken bu durumun fark\u0131nda olmak ve g\u00fcvenli matematik k\u00fct\u00fcphaneleri kullanmak veya gerekli kontrolleri yapmak \u00f6nemlidir. \u00d6rne\u011fin, bakiye hesaplamalar\u0131nda dikkatli olunmal\u0131 ve \u00f6zellikle \u00e7\u0131karma i\u015flemlerinde negatif bakiyelere d\u00fc\u015f\u00fclmedi\u011finden emin olunmal\u0131d\u0131r.<\/p>\n<p>Yetkilendirme mekanizmalar\u0131, ak\u0131ll\u0131 s\u00f6zle\u015fme g\u00fcvenli\u011finin temelini olu\u015fturur. <code>only_owner<\/code> veya <code>only_artist<\/code> gibi eri\u015fim kontrol mekanizmalar\u0131, belirli fonksiyonlar\u0131n yaln\u0131zca yetkili hesaplar taraf\u0131ndan \u00e7a\u011fr\u0131labilece\u011fini garantiler. S\u00f6zle\u015fme i\u00e7inde, <code>Self::env().caller()<\/code> fonksiyonunu kullanarak \u00e7a\u011fr\u0131 yapan\u0131n kimli\u011fini alabilir ve bu kimli\u011fi \u00f6nceden tan\u0131mlanm\u0131\u015f yetkili hesaplarla kar\u015f\u0131la\u015ft\u0131rabilirsiniz. \u00d6rne\u011fin, <code>add_poem<\/code> fonksiyonunun yaln\u0131zca s\u00f6zle\u015fme sahibi taraf\u0131ndan \u00e7a\u011fr\u0131labilece\u011finden emin olmak i\u00e7in bir kontrol ekledik. Bu kontroller, s\u00f6zle\u015fmenin istenmeyen ki\u015filer taraf\u0131ndan manip\u00fcle edilmesini \u00f6nler. Hata y\u00f6netimi de kritik \u00f6neme sahiptir. ink!, Rust'\u0131n <code>Result<\/code> enum'unu kullanarak hata i\u015flemeyi te\u015fvik eder. Fonksiyonlar\u0131n\u0131z\u0131n ba\u015far\u0131l\u0131 veya ba\u015far\u0131s\u0131z olabilece\u011fi durumlar\u0131 a\u00e7\u0131k\u00e7a belirtmek ve uygun hata mesajlar\u0131 d\u00f6nd\u00fcrmek, s\u00f6zle\u015fmenizin davran\u0131\u015f\u0131n\u0131 daha \u00f6ng\u00f6r\u00fclebilir hale getirir ve kullan\u0131c\u0131lar\u0131n veya entegre uygulamalar\u0131n hatalar\u0131 daha kolay anlamas\u0131na ve \u00e7\u00f6zmesine yard\u0131mc\u0131 olur. \u00d6rne\u011fin, <code>BidTooLow<\/code> gibi \u00f6zel hata t\u00fcrleri, kullan\u0131c\u0131lara neden tekliflerinin reddedildi\u011fini a\u00e7\u0131k\u00e7a bildirir.<\/p>\n<p>Gaz optimizasyonu, \u00f6zellikle Polkadot gibi bir a\u011fda, her ne kadar gaz \u00fccretleri Ethereum'dan daha d\u00fc\u015f\u00fck ve \u00f6ng\u00f6r\u00fclebilir olsa da, her zaman g\u00f6z \u00f6n\u00fcnde bulundurulmas\u0131 gereken bir konudur. Veri depolama maliyetlidir, bu nedenle gereksiz verileri saklamaktan ka\u00e7\u0131nmak ve veri yap\u0131lar\u0131n\u0131 m\u00fcmk\u00fcn oldu\u011funca kompakt tutmak \u00f6nemlidir. D\u00f6ng\u00fcleri ve karma\u015f\u0131k hesaplamalar\u0131 optimize etmek de gaz t\u00fcketimini azaltabilir. Son olarak, kapsaml\u0131 testler olmadan hi\u00e7bir ak\u0131ll\u0131 s\u00f6zle\u015fme da\u011f\u0131t\u0131lmamal\u0131d\u0131r. ink!, entegre test \u00e7er\u00e7evesi sa\u011flar. <code>#[ink::test]<\/code> niteli\u011fiyle i\u015faretlenmi\u015f test fonksiyonlar\u0131 yazarak s\u00f6zle\u015fmenizin her bir b\u00f6l\u00fcm\u00fcn\u00fcn beklendi\u011fi gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olabilirsiniz. Bu testler, farkl\u0131 senaryolar\u0131 (ba\u015far\u0131l\u0131 i\u015flemler, hata durumlar\u0131, kenar durumlar) kapsayacak \u015fekilde tasarlanmal\u0131d\u0131r. \u00d6rne\u011fin, m\u00fczayedenin biti\u015f zaman\u0131ndan \u00f6nce teklif verilememesi veya biti\u015f zaman\u0131ndan sonra yeni tekliflerin reddedilmesi gibi durumlar\u0131 test etmek, s\u00f6zle\u015fmenizin sa\u011flaml\u0131\u011f\u0131n\u0131 art\u0131r\u0131r. G\u00fcvenli kod yazma prati\u011fi, sadece teknik bilgi gerektirmez; ayn\u0131 zamanda potansiyel k\u00f6t\u00fcye kullan\u0131m senaryolar\u0131n\u0131 hayal etme ve proaktif \u00f6nlemler alma becerisi de gerektirir.<\/p>\n<h2 id=\"mobil-uyumlu-arayuz-icin-html-ve-css-yaklasimlari\">Mobil Uyumlu Aray\u00fcz \u0130\u00e7in HTML ve CSS Yakla\u015f\u0131mlar\u0131<\/h2>\n<p>Ak\u0131ll\u0131 s\u00f6zle\u015fmemizi ba\u015far\u0131yla geli\u015ftirdikten ve Polkadot a\u011f\u0131na da\u011f\u0131tt\u0131ktan sonra, kullan\u0131c\u0131lar\u0131n bu s\u00f6zle\u015fmeyle kolayca etkile\u015fime ge\u00e7ebilece\u011fi bir aray\u00fcze ihtiyac\u0131m\u0131z olacak. Bu aray\u00fcz, \u015fairlerin \u015fiirlerini eklemesine, koleksiyonerlerin m\u00fczayedeleri g\u00f6r\u00fcnt\u00fclemesine ve teklif vermesine olanak tan\u0131mal\u0131d\u0131r. G\u00fcn\u00fcm\u00fcz d\u00fcnyas\u0131nda mobil cihazlar\u0131n yayg\u0131nl\u0131\u011f\u0131 g\u00f6z \u00f6n\u00fcne al\u0131nd\u0131\u011f\u0131nda, geli\u015ftirece\u011fimiz aray\u00fcz\u00fcn mobil uyumlu (responsive) olmas\u0131 kritik \u00f6neme sahiptir. Kullan\u0131c\u0131lar\u0131m\u0131z\u0131n masa\u00fcst\u00fc bilgisayarlar\u0131ndan, tabletlerinden veya ak\u0131ll\u0131 telefonlar\u0131ndan sorunsuz bir deneyim ya\u015fayabilmesi i\u00e7in HTML ve CSS yakla\u015f\u0131mlar\u0131m\u0131z\u0131 dikkatlice planlamal\u0131y\u0131z.<\/p>\n<p>Temel HTML yap\u0131s\u0131, bir web uygulamas\u0131n\u0131n omurgas\u0131n\u0131 olu\u015fturur. \u015eiir listeleme, m\u00fczayede detaylar\u0131n\u0131 g\u00f6sterme, teklif formu ve sanat\u00e7\u0131 profili gibi bile\u015fenler i\u00e7in anlamsal HTML etiketleri (<code><\/p>\n<header><\/code>, <code><\/p>\n<nav><\/code>, <code><main><\/code>, <code><\/p>\n<section><\/code>, <code><\/p>\n<article><\/code>, <code><\/p>\n<footer><\/code>) kullanmak, hem eri\u015filebilirlik hem de SEO a\u00e7\u0131s\u0131ndan \u00f6nemlidir. \u00d6rne\u011fin, bir \u015fiir kart\u0131 i\u00e7in <code><\/p>\n<article><\/code> etiketi i\u00e7inde ba\u015fl\u0131k (<code><\/p>\n<h3><\/code>), sanat\u00e7\u0131 ad\u0131 (<code><\/p>\n<p><\/code>), \u015fiir i\u00e7eri\u011finden bir al\u0131nt\u0131 ve mevcut teklif bilgilerini g\u00f6sterebiliriz. Teklif verme i\u015flemi i\u00e7in bir <code><\/p>\n<form><\/code> etiketi kullanacak, i\u00e7inde <code><input type=\"number\"><\/code> ve <code><button type=\"submit\"><\/code> gibi elemanlara yer verece\u011fiz. Bu elemanlar, Polkadot.js veya benzeri bir JavaScript k\u00fct\u00fcphanesi arac\u0131l\u0131\u011f\u0131yla ak\u0131ll\u0131 s\u00f6zle\u015fmemizle etkile\u015fime ge\u00e7ecektir.<\/p>\n<p>Mobil uyumlulu\u011fun ilk ad\u0131m\u0131, HTML belgemizin <code><head><\/code> b\u00f6l\u00fcm\u00fcne viewport meta etiketini eklemektir:<\/p>\n<pre><code class=\"language-html\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<\/pre>\n<p><\/code><br \/>\nBu etiket, taray\u0131c\u0131ya sayfan\u0131n cihaz\u0131n geni\u015fli\u011fine g\u00f6re \u00f6l\u00e7eklenmesini ve ba\u015flang\u0131\u00e7ta 1.0 oran\u0131nda yak\u0131nla\u015ft\u0131rmay\u0131 emreder. Bu olmadan, mobil cihazlar sayfay\u0131 masa\u00fcst\u00fc g\u00f6r\u00fcn\u00fcm\u00fcnde render etmeye \u00e7al\u0131\u015fabilir ve bu da k\u00f6t\u00fc bir kullan\u0131c\u0131 deneyimine yol a\u00e7ar.<\/p>\n<p>CSS taraf\u0131nda, mobil uyumlulu\u011fu sa\u011flamak i\u00e7in \"mobile-first\" yakla\u015f\u0131m\u0131n\u0131 benimsemek genellikle en iyisidir. Bu, \u00f6nce k\u00fc\u00e7\u00fck ekranlar (mobil cihazlar) i\u00e7in stil yazmak ve daha sonra daha b\u00fcy\u00fck ekranlar i\u00e7in stilleri art\u0131rmak anlam\u0131na gelir. <code>media query<\/code>'ler, belirli ekran boyutlar\u0131na veya cihaz \u00f6zelliklerine g\u00f6re farkl\u0131 CSS kurallar\u0131 uygulaman\u0131z\u0131 sa\u011flar. \u0130\u015fte basit bir \u00f6rnek:<\/p>\n<pre><code class=\"language-html\">\n  <style>\n      \/* Varsay\u0131lan stiller: Mobil cihazlar i\u00e7in *\/\n      body {\n          font-family: Arial, sans-serif;\n          margin: 0;\n          padding: 0;\n          background-color: #f4f4f4;\n      }\n      .container {\n          width: 95%; \/* Mobil cihazlarda daha geni\u015f *\/\n          margin: 0 auto;\n          padding: 10px;\n      }\n      .poem-card {\n          background-color: #fff;\n          border-radius: 8px;\n          padding: 15px;\n          margin-bottom: 15px;\n          box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n          display: flex; \/* Kart i\u00e7eri\u011fini esnek hale getir *\/\n          flex-direction: column; \/* Mobil i\u00e7in dikey d\u00fczen *\/\n      }\n      .bid-form {\n          display: flex;\n          flex-direction: column;\n          gap: 10px;\n          margin-top: 10px;\n      }\n      .bid-form input, .bid-form button {\n          padding: 10px;\n          border-radius: 5px;\n          border: 1px solid #ddd;\n      }\n      .bid-form button {\n          background-color: #6200EE;\n          color: white;\n          border: none;\n          cursor: pointer;\n      }\n\n      \/* Orta boyutlu ekranlar (tabletler) i\u00e7in medya sorgusu *\/\n      @media (min-width: 600px) {\n          .container {\n              width: 80%;\n          }\n          .poem-card {\n              flex-direction: row; \/* Tabletlerde yatay d\u00fczen *\/\n              align-items: center;\n              justify-content: space-between;\n          }\n          .poem-card .content {\n              flex-grow: 1;\n              padding-right: 20px;\n          }\n          .bid-form {\n              flex-direction: row; \/* Tabletlerde yatay form *\/\n              align-items: center;\n          }\n          .bid-form input {\n              flex-grow: 1;\n          }\n      }\n\n      \/* B\u00fcy\u00fck ekranlar (masa\u00fcst\u00fc) i\u00e7in medya sorgusu *\/\n      @media (min-width: 992px) {\n          .container {\n              width: 70%;\n              max-width: 1200px; \/* Maksimum geni\u015flik s\u0131n\u0131rlamas\u0131 *\/\n              padding: 20px;\n          }\n          .poem-card {\n              padding: 20px;\n          }\n      }\n  <\/style>\n<\/pre>\n<p><\/code><br \/>\nYukar\u0131daki \u00f6rnekte, <code>.poem-card<\/code> ve <code>.bid-form<\/code> gibi bile\u015fenlerin nas\u0131l <code>flex-direction<\/code> \u00f6zelli\u011fini kullanarak mobil ve masa\u00fcst\u00fc g\u00f6r\u00fcn\u00fcmleri aras\u0131nda ge\u00e7i\u015f yapt\u0131\u011f\u0131n\u0131 g\u00f6rebilirsiniz. Flexbox (Esnek Kutu Modeli) veya CSS Grid (Izgara Sistemi), modern mobil uyumlu web tasar\u0131m\u0131 i\u00e7in g\u00fc\u00e7l\u00fc ara\u00e7lard\u0131r ve bile\u015fenlerin farkl\u0131 ekran boyutlar\u0131nda d\u00fczenini kolayca ayarlaman\u0131za olanak tan\u0131r. Flexbox, tek boyutlu (sat\u0131r veya s\u00fctun) d\u00fczenler i\u00e7in idealdir, Grid ise iki boyutlu (sat\u0131rlar ve s\u00fctunlar) d\u00fczenler i\u00e7in daha uygundur. Bu yap\u0131lar, web sayfan\u0131z\u0131n i\u00e7eri\u011fini cihaz\u0131n ekran boyutuna g\u00f6re otomatik olarak yeniden d\u00fczenlemesini sa\u011flar, b\u00f6ylece kullan\u0131c\u0131lar her cihazda optimize edilmi\u015f bir deneyim ya\u015far.<\/p>\n<p>Ak\u0131ll\u0131 s\u00f6zle\u015fme ile etkile\u015fimi sa\u011flamak i\u00e7in ise Polkadot.js API gibi k\u00fct\u00fcphaneler kullan\u0131l\u0131r. Bu k\u00fct\u00fcphaneler, bir kullan\u0131c\u0131n\u0131n c\u00fczdan\u0131yla (\u00f6rne\u011fin Polkadot{.js} uzant\u0131s\u0131) ba\u011flant\u0131 kurarak, s\u00f6zle\u015fme \u00fczerinde <code>query<\/code> (veri okuma) ve <code>transaction<\/code> (veri yazma\/durum de\u011fi\u015ftirme) i\u015flemleri yap\u0131lmas\u0131na olanak tan\u0131r. Frontend taraf\u0131nda, React, Vue veya Svelte gibi modern JavaScript framework'lerini kullanarak dinamik ve etkile\u015fimli bir aray\u00fcz olu\u015fturabilirsiniz. Bu framework'ler, kullan\u0131c\u0131 aray\u00fcz\u00fc bile\u015fenlerini daha y\u00f6netilebilir hale getirir ve karma\u015f\u0131k durum y\u00f6netimini kolayla\u015ft\u0131r\u0131r, bu da blok zinciri etkile\u015fimli uygulamalar\u0131n geli\u015ftirilmesini h\u0131zland\u0131r\u0131r.<\/p>\n<h2 id=\"sonuc-dijital-sanatin-geleceginde-ink-ve-polkadotun-rolu\">Sonu\u00e7: Dijital Sanat\u0131n Gelece\u011finde ink! ve Polkadot'un Rol\u00fc<\/h2>\n<p>Bu makalede, Polkadot a\u011f\u0131 \u00fczerinde ink! dilini kullanarak nas\u0131l bir \u015fiir m\u00fczayedesi ak\u0131ll\u0131 s\u00f6zle\u015fmesi geli\u015ftirece\u011fimizi ad\u0131m ad\u0131m inceledik. Dijital sanat\u0131n ve \u00f6zellikle \u015fiirin blok zinciri teknolojisiyle nas\u0131l bulu\u015fabilece\u011fini, sanat\u00e7\u0131lara eserleri \u00fczerinde daha fazla kontrol ve \u015feffaf gelir ak\u0131\u015flar\u0131 sa\u011flayabilece\u011fini ke\u015ffettik. ink!'in Rust tabanl\u0131 g\u00fcvenli ve performansl\u0131 yap\u0131s\u0131 ile Polkadot'un \u00f6l\u00e7eklenebilirlik ve birlikte \u00e7al\u0131\u015fabilirlik avantajlar\u0131n\u0131n, bu t\u00fcr yenilik\u00e7i uygulamalar i\u00e7in g\u00fc\u00e7l\u00fc bir temel olu\u015fturdu\u011funu g\u00f6rd\u00fck. Temel s\u00f6zle\u015fme yap\u0131lar\u0131ndan, g\u00fcvenlik ipu\u00e7lar\u0131na ve mobil uyumlu aray\u00fcz geli\u015ftirmeye kadar pek \u00e7ok konuya de\u011findik.<\/p>\n<p>\u015eiir m\u00fczayedesi, blok zincirinin sadece finansal i\u015flemlerde de\u011fil, ayn\u0131 zamanda k\u00fclt\u00fcrel ve sanatsal alanlarda da d\u00f6n\u00fc\u015ft\u00fcr\u00fcc\u00fc bir etkiye sahip olabilece\u011finin g\u00fczel bir \u00f6rne\u011fidir. Sanat\u00e7\u0131lar, eserlerinin de\u011ferini do\u011frudan belirleyebilir, telif haklar\u0131n\u0131 \u015feffaf bir \u015fekilde y\u00f6netebilir ve k\u00fcresel bir kitleye ula\u015fabilirler. Koleksiyonerler ise, benzersiz dijital sanat eserlerine sahip olman\u0131n yan\u0131 s\u0131ra, sanat\u00e7\u0131lar\u0131 do\u011frudan destekleyerek sanatsal \u00fcretimin s\u00fcrd\u00fcr\u00fclebilirli\u011fine katk\u0131da bulunabilirler. Polkadot ekosisteminin s\u00fcrekli geli\u015fen yap\u0131s\u0131 ve ink!'in sundu\u011fu esneklik, gelecekte \u00e7ok daha karma\u015f\u0131k ve zengin dijital sanat platformlar\u0131n\u0131n ortaya \u00e7\u0131kmas\u0131na olanak tan\u0131yacakt\u0131r. Bu sadece \u015fiirle s\u0131n\u0131rl\u0131 kalmay\u0131p, di\u011fer edebiyat t\u00fcrleri, dijital heykeller, performans sanatlar\u0131 ve daha bir\u00e7ok alana yay\u0131labilecek potansiyele sahiptir. Bu rehberin, kendi dijital sanat projelerinizi geli\u015ftirmek i\u00e7in size ilham vermesini ve Polkadot \u00fczerinde ink! ile yarat\u0131c\u0131l\u0131\u011f\u0131n\u0131z\u0131 serbest b\u0131rakman\u0131z\u0131 umuyoruz.<\/p>\n<h3 id=\"sikca-sorulan-sorular-sss\">S\u0131k\u00e7a Sorulan Sorular (SSS):<\/h3>\n<dl>\n<dt>ink! neden Rust tabanl\u0131d\u0131r?<\/dt>\n<dd>ink!, Rust'\u0131n bellek g\u00fcvenli\u011fi, y\u00fcksek performans\u0131 ve geli\u015ftirici dostu \u00f6zelliklerinden yararlanmak i\u00e7in Rust tabanl\u0131d\u0131r. Bu, ak\u0131ll\u0131 s\u00f6zle\u015fmelerde kritik olan g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 en aza indirmeye ve verimli kod yazmaya yard\u0131mc\u0131 olur.<\/dd>\n<dt>Polkadot'ta gaz \u00fccretleri nas\u0131l \u00e7al\u0131\u015f\u0131r?<\/dt>\n<dd>Polkadot'ta gaz \u00fccretleri, Ethereum'daki gibi do\u011frudan bir \"gas price\" modeli yerine, i\u015flemin karma\u015f\u0131kl\u0131\u011f\u0131na ve kullan\u0131lan kaynaklara (depolama, hesaplama) dayal\u0131d\u0131r. Parachain'e ba\u011fl\u0131 olarak bu \u00fccretler daha d\u00fc\u015f\u00fck ve daha tahmin edilebilir olabilir, bu da kullan\u0131c\u0131 deneyimini iyile\u015ftirir.<\/dd>\n<dt>Ak\u0131ll\u0131 s\u00f6zle\u015fme da\u011f\u0131t\u0131m\u0131 sonras\u0131 g\u00fcncelleme m\u00fcmk\u00fcn m\u00fcd\u00fcr?<\/dt>\n<dd>Evet, ink! ak\u0131ll\u0131 s\u00f6zle\u015fmeleri genellikle \"upgradable proxy\" desenleri kullan\u0131larak g\u00fcncellenebilir. Bu, s\u00f6zle\u015fmenin mant\u0131\u011f\u0131n\u0131 i\u00e7eren bir \"implementation\" s\u00f6zle\u015fmesinin ayr\u0131 oldu\u011fu ve bir \"proxy\" s\u00f6zle\u015fmesinin bu implementation'a i\u015faret etti\u011fi anlam\u0131na gelir. Proxy s\u00f6zle\u015fmesinin i\u015faret etti\u011fi implementation s\u00f6zle\u015fmesi de\u011fi\u015ftirilerek, ana s\u00f6zle\u015fme adresi de\u011fi\u015fmeden g\u00fcncelleme yap\u0131labilir.<\/dd>\n<dt>Bir \u015fiiri NFT olarak nas\u0131l temsil edebilirim?<\/dt>\n<dd>Bir \u015fiiri NFT olarak temsil etmek i\u00e7in, s\u00f6zle\u015fmeniz i\u00e7inde her \u015fiire benzersiz bir ID atayan ve bu ID'yi belirli bir URI (\u00f6rne\u011fin \u015fiirin i\u00e7eri\u011finin veya metadata's\u0131n\u0131n depoland\u0131\u011f\u0131 bir IPFS ba\u011flant\u0131s\u0131) ile ili\u015fkilendiren bir mekanizma olu\u015fturman\u0131z gerekir. Bu yap\u0131, ERC-721 veya ERC-1155 gibi NFT standartlar\u0131na benzer bir \u015fekilde \u00e7al\u0131\u015f\u0131r ve \u015fiirin dijital sahipli\u011fini blok zinciri \u00fczerinde ispatlaman\u0131z\u0131 sa\u011flar.<\/dd>\n<\/dl>\n","protected":false},"excerpt":{"rendered":"Polkadot a\u011f\u0131nda ink! dilini kullanarak e\u015fsiz bir \u015fiir m\u00fczayedesi ak\u0131ll\u0131 s\u00f6zle\u015fmesi geli\u015ftirmek ister misiniz? Bu rehber, temel kavramlardan&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-31261","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Polkadot \u00dczerinde ink! ile \u015eiir M\u00fczayedesi Ak\u0131ll\u0131 S\u00f6zle\u015fmesi Nas\u0131l Olu\u015fturulur?<\/title>\n<meta name=\"description\" content=\"Polkadot a\u011f\u0131nda ink! dilini kullanarak e\u015fsiz bir \u015fiir m\u00fczayedesi ak\u0131ll\u0131 s\u00f6zle\u015fmesi geli\u015ftirmek ister misiniz? Bu rehber, temel kavramlardan ileri d\u00fczey uygulamalara kadar ad\u0131m ad\u0131m size yol g\u00f6sterecek ve dijital sanat\u0131n blok zinciri ile nas\u0131l bulu\u015ftu\u011funu g\u00f6sterecek.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Polkadot \u00dczerinde ink! ile \u015eiir M\u00fczayedesi Ak\u0131ll\u0131 S\u00f6zle\u015fmesi Nas\u0131l Olu\u015fturulur?\" \/>\n<meta property=\"og:description\" content=\"Polkadot a\u011f\u0131nda ink! dilini kullanarak e\u015fsiz bir \u015fiir m\u00fczayedesi ak\u0131ll\u0131 s\u00f6zle\u015fmesi geli\u015ftirmek ister misiniz? Bu rehber, temel kavramlardan ileri d\u00fczey uygulamalara kadar ad\u0131m ad\u0131m size yol g\u00f6sterecek ve dijital sanat\u0131n blok zinciri ile nas\u0131l bulu\u015ftu\u011funu g\u00f6sterecek.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-07T21:01:52+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"30 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Polkadot \u00dczerinde ink! ile \u015eiir M\u00fczayedesi Ak\u0131ll\u0131 S\u00f6zle\u015fmesi Nas\u0131l Olu\u015fturulur?\",\"datePublished\":\"2025-10-07T21:01:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/\"},\"wordCount\":4587,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/\",\"name\":\"Polkadot \u00dczerinde ink! ile \u015eiir M\u00fczayedesi Ak\u0131ll\u0131 S\u00f6zle\u015fmesi Nas\u0131l Olu\u015fturulur?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-07T21:01:52+00:00\",\"description\":\"Polkadot a\u011f\u0131nda ink! dilini kullanarak e\u015fsiz bir \u015fiir m\u00fczayedesi ak\u0131ll\u0131 s\u00f6zle\u015fmesi geli\u015ftirmek ister misiniz? Bu rehber, temel kavramlardan ileri d\u00fczey uygulamalara kadar ad\u0131m ad\u0131m size yol g\u00f6sterecek ve dijital sanat\u0131n blok zinciri ile nas\u0131l bulu\u015ftu\u011funu g\u00f6sterecek.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Polkadot \u00dczerinde ink! ile \u015eiir M\u00fczayedesi Ak\u0131ll\u0131 S\u00f6zle\u015fmesi Nas\u0131l Olu\u015fturulur?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Polkadot \u00dczerinde ink! ile \u015eiir M\u00fczayedesi Ak\u0131ll\u0131 S\u00f6zle\u015fmesi Nas\u0131l Olu\u015fturulur?","description":"Polkadot a\u011f\u0131nda ink! dilini kullanarak e\u015fsiz bir \u015fiir m\u00fczayedesi ak\u0131ll\u0131 s\u00f6zle\u015fmesi geli\u015ftirmek ister misiniz? Bu rehber, temel kavramlardan ileri d\u00fczey uygulamalara kadar ad\u0131m ad\u0131m size yol g\u00f6sterecek ve dijital sanat\u0131n blok zinciri ile nas\u0131l bulu\u015ftu\u011funu g\u00f6sterecek.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/","og_locale":"tr_TR","og_type":"article","og_title":"Polkadot \u00dczerinde ink! ile \u015eiir M\u00fczayedesi Ak\u0131ll\u0131 S\u00f6zle\u015fmesi Nas\u0131l Olu\u015fturulur?","og_description":"Polkadot a\u011f\u0131nda ink! dilini kullanarak e\u015fsiz bir \u015fiir m\u00fczayedesi ak\u0131ll\u0131 s\u00f6zle\u015fmesi geli\u015ftirmek ister misiniz? Bu rehber, temel kavramlardan ileri d\u00fczey uygulamalara kadar ad\u0131m ad\u0131m size yol g\u00f6sterecek ve dijital sanat\u0131n blok zinciri ile nas\u0131l bulu\u015ftu\u011funu g\u00f6sterecek.","og_url":"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-07T21:01:52+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"30 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Polkadot \u00dczerinde ink! ile \u015eiir M\u00fczayedesi Ak\u0131ll\u0131 S\u00f6zle\u015fmesi Nas\u0131l Olu\u015fturulur?","datePublished":"2025-10-07T21:01:52+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/"},"wordCount":4587,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/","url":"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/","name":"Polkadot \u00dczerinde ink! ile \u015eiir M\u00fczayedesi Ak\u0131ll\u0131 S\u00f6zle\u015fmesi Nas\u0131l Olu\u015fturulur?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-07T21:01:52+00:00","description":"Polkadot a\u011f\u0131nda ink! dilini kullanarak e\u015fsiz bir \u015fiir m\u00fczayedesi ak\u0131ll\u0131 s\u00f6zle\u015fmesi geli\u015ftirmek ister misiniz? Bu rehber, temel kavramlardan ileri d\u00fczey uygulamalara kadar ad\u0131m ad\u0131m size yol g\u00f6sterecek ve dijital sanat\u0131n blok zinciri ile nas\u0131l bulu\u015ftu\u011funu g\u00f6sterecek.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/polkadot-uzerinde-ink-ile-siir-muzayedesi-akilli-sozlesmesi-nasil-olusturulur\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Polkadot \u00dczerinde ink! ile \u015eiir M\u00fczayedesi Ak\u0131ll\u0131 S\u00f6zle\u015fmesi Nas\u0131l Olu\u015fturulur?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31261","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31261"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31261\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31261"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31261"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31261"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}