Aptos ağının 18 Ekim'de mainnet lansmanıyla birlikte, Move programlama dili ve ekosistemi sürekli olarak etkisini genişletmektedir. Topluluğu dahil etmek için, Move'da güvenli geliştirme pratiklerini sunmak amacıyla bir dizi makale yayınlayacağız. Sizi örnekler, açıklamalar ve en önemlisi güvenlik pratikleri aracılığıyla Move dünyasına götüreceğiz.
TL;DR
Bu makale size şunları anlatacak:
- bir Aptos uygulamasının nasıl oluşturulacağı ve geliştirileceği;
- bir modülün (yani Move'daki akıllı sözleşmenin) nasıl göründüğü;
- bir modülün yerel ağınızda nasıl derleneceği ve yayınlanacağı;
- modülle nasıl etkileşime geçileceği ve tarayıcıda yayılan olayın nasıl kontrol edileceği.
0x1. Move ve Ekosistemi Hakkında
Move, akıllı sözleşme geliştirmek için tasarlanmış Diem'den (önceki adı Aralık 2020'den önce Libra'ydı) miras alınan bir dildir. Güvenli, hızlı ve esnek olduğu iddia edilmekte olup bir sonraki nesil dil olmayı hedeflemektedir. Ancak Aptos ve Sui gibi yeni tanıtılan projeler, orijinal Move'u doğrudan benimsememiş; kendi ihtiyaçlarına hizmet etmek için bazı değişiklikler yapılmıştır.
Aksi belirtilmedikçe, fikirler diğer Move tabanlı projeler için de genel geçer olduğundan, ağırlıklı olarak Aptos bağlamındaki geliştirme pratiklerine odaklanacağız. Ayrıca Move programlama dili hakkında temel bir anlayış için MoveBook'u zaten incelediğinizi varsayıyoruz.
0x2. Ortamı Hazırlamak
0x2.1 Aptos Araç Zinciri
Aptos, Move'u zaten CLI'sine entegre etmiştir. Bu nedenle, ilgili araç zincirini yüklemek için CLI kurulumunu takip etmeniz önerilir. Kurulum tamamlandıktan sonra terminale aptos yazın ve aşağıdaki çıktıyı görmeniz gerekir:
$ aptos
aptos 1.0.1
Aptos Labs <[email protected]>
Command Line Interface (CLI) for developing and interacting with the Aptos blockchain
USAGE:
aptos <SUBCOMMAND>
OPTIONS:
-h, --help Print help information
-V, --version Print version information
SUBCOMMANDS:
account Tool for interacting with accounts
config Tool for interacting with configuration of the Aptos CLI tool
genesis Tool for setting up an Aptos chain Genesis transaction
governance Tool for on-chain governance
help Print this message or the help of the given subcommand(s)
info Show build information about the CLI
init Tool to initialize current directory for the aptos tool
key Tool for generating, inspecting, and interacting with keys
move Tool for Move related operations
node Tool for operations related to nodes
stake Tool for manipulating stake and stake pools
0x2.2 Yerel Test Ağı ve Hesap
Aptos, geliştirme ve dağıtım için birçok ağ (yani mainnet, testnet, devnet ve yerel testnet) sağlar. Bu makalede yerel testnet'i kullanacağız.
Yerel testnet'i başlatmak için aşağıdaki komutu yazın:
$ aptos node run-local-testnet --with-faucet --force-restart
Şu çıktıyı görmeniz gerekir:
......
Aptos is running, press ctrl-c to exit
Faucet is running. Faucet endpoint: 0.0.0.0:8081
Şimdi aşağıdaki komutu yazarak hesabınızı oluşturabilirsiniz (önceki terminal penceresini ön planda tutmak istiyorsanız muhtemelen başka bir terminal penceresinde):
$ aptos init
Bu komut, bazı özellikleri belirtmenizi gerektiren etkileşimli bir kabuk açar. Burada local ağını seçiyoruz. Bundan sonra, mevcut dizinde varsayılan hesap yapılandırmanızı içeren bir .aptos klasörü oluşturulacaktır. Dosyayı kontrol edin ve account adresinizi kopyalayın (örn., c0d8xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx14bd).
İpucu#1: Hesap yapılandırma dosyanızı güvende tutun! Özel anahtarınız içinde yazılıdır!
0x3. İlk Hello World Programı
Hello World programı, kod yazmayı öğrenmenin ilk adımı olarak her zaman kullanılır. Move uygulamaları geliştirme yöntemini göstermek için bu geleneği takip etmek istiyoruz.
0x3.1 Paketi Hazırlamak
Beğendiğiniz bir dizin seçin ve aşağıdaki komutu yazın:
$ aptos move init --framework-local-dir "../../aptos-core/aptos-move/framework/aptos-framework" --name hello
Bu komut, belirtilen konumda (yani geliştirme çalışma alanında) yeni bir Move paketi oluşturacaktır. Aptos çerçevesindeki bazı kütüphane fonksiyonları gerekli olduğundan, Aptos çerçevesinin yerel dizini belirtilir (göreli yolun farklı bir konum için değiştirilmesi gerekebilir); alternatif olarak, Aptos çerçevesi için git revizyonu veya dalı da --framework-git-rev kullanılarak belirtilebilir.
Şimdi dizininizde bir Move.toml dosyası görebilirsiniz. Bu dosya yalnızca bazı bağımlılık yapılandırmalarını listelemekle kalmaz, aynı zamanda paket adını ve sürümünü de açıklar. Bunun yanı sıra, Move kaynak kodunu depolamak için kullanılan sources adlı bir klasör de mevcuttur. sources dizininde bir .move dosyası oluşturduktan sonra çalışma alanı kullanıma hazır olacaktır.
[package]
name = 'hello'
version = '1.0.0'
[dependencies.AptosFramework]
local = '../../aptos-core/aptos-move/framework/aptos-framework'
[addresses]
BlockSec="c0d8xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx14bd"
Move.toml'un son satırında, hesap adresini (az önce oluşturulan) BlockSec ile ilişkilendiriyoruz. Bu, bu paketteki modülü yayımlamak (yani akıllı sözleşmeyi dağıtmak) için kullanılır (daha sonra ele alınacaktır). Yukarıdaki adresin yalnızca bir yer tutucu olduğunu ve kendi hesap adresinizle değiştirmeniz GEREKTİĞİNİ unutmayın.
0x3.2 Modülü Hazırlamak
Aşağıda, doğrudan move dosyasına (örn., hello.move) yerleştirilebilecek basit ama eksiksiz bir örnek modül bulunmaktadır. Aşağıda, Move ile diğer programlama dilleri arasındaki farkı açıklamak için kodu inceleyeceğiz. Bunlara oldukça aşina iseniz bu bölümü atlayabilirsiniz.
module BlockSec::hello{
use aptos_framework::account;
use aptos_framework::event;
use std::signer;
use std::string::{String, utf8};
struct SecEventStore has key{
event_handle: event::EventHandle<String>,
}
public entry fun say_hello_script(account: &signer) acquires SecEventStore{
say_hello(account);
}
public fun say_hello(account: &signer) acquires SecEventStore{
let address_ = signer::address_of(account);
if(!exists<SecEventStore>(address_)){
move_to(account, SecEventStore{event_handle: account::new_event_handle(account)});
};
event::emit_event<String>(&mut borrow_global_mut<SecEventStore>(address_).event_handle, utf8(b"Hello World!"));
}
}
Burada BlockSec adresine yayımlanacak hello adlı bir modül tanımlıyoruz. Bu modülün giriş fonksiyonu say_hello_script olarak adlandırılmıştır ve say_function fonksiyonunu çağıracaktır. Bu modülün (say_hello fonksiyonunda) "Hello World!" mesajıyla bir olay yayımlamak için kullanıldığını anlamak kolaydır. Ancak, açıkça açıklanması gereken bazı ayrıntılar hâlâ mevcuttur.
Özellikle, aptos_framework ad alanındaki event::emit_event fonksiyonunu kullanabilmek için bir event::EventHandle yapısına ihtiyacımız var; çünkü emit_event fonksiyonu aşağıdaki bildirimine sahiptir:
/// Emit an event with payload `msg` by using `handle_ref`'s key and counter.
public fun emit_event<T: drop + store>(handle_ref: &mut EventHandle<T>, msg: T)
struct EventHandle<phantom T: drop + store> has store {
/// Total number of events emitted to this event stream.
counter: u64,
/// A globally unique ID for this event stream.
guid: GUID,
}
EventHandle'ın key yeteneğine sahip olmadığına dikkat edin; bu, onu başka bir yapıda saklamamız gerektiği anlamına gelir. Bu nedenle EventHandle'ı saklamak için SecEventStore adlı bir yapı tanımlıyoruz:
struct SecEventStore has key{
event_handle: event::EventHandle<String>,
}
İpucu#2: Move'da bir yapının yeteneklerini göz önünde bulundurmalıyız. Yalnızca
**_key_**yeteneğinin**_move_to_**yapılabileceğini unutmayın. Bir modül yalnızca**_store_**yeteneğine sahip bir yapı döndürüyorsa ve bunu global depolama alanında korumak istiyorsanız, sarmalayıcı olarak yeni bir yapı tanımlamayı düşünün.
Basitlik adına, mesajı temsil etmek için String kullanıyoruz. Dolayısıyla say_hello fonksiyonunun son adımı şudur:
event::emit_event<String>(&mut borrow_global_mut<SecEventStore>(address_).event_handle, utf8(b"Hello World!"));
İpucu#3: Move,
Stringtürünü yerel olarak desteklemez. Standart kütüphane, bayt vektörünü**_String_**'e dönüştürme yeteneği sağlar. Daha fazla ayrıntı için GitHub depolarındaki kaynak kodu kontrol edin.
Her yeni kullanıcının bir SecEventStore ile kayıt yaptırmasını sağlamak için, önce exists fonksiyonu aracılığıyla kullanıcı hesabındaki yapı varlığını kontrol etmemiz gerekir. Kullanıcı kaynağa sahip değilse, fonksiyon bir tane oluşturacak ve kullanıcı hesabına taşıyacaktır.
if(!exists<SecEventStore>(address_)){
move_to(account, SecEventStore{event_handle: account::new_event_handle(account)});
};
0x3.3 Modülü Derlemek ve Yayımlamak
Modül hazır olduğunda, aşağıdaki komutla derleyebiliriz:
$ aptos move compile
Compiling, may take a little while to download git dependencies...
INCLUDING DEPENDENCY AptosFramework
INCLUDING DEPENDENCY AptosStdlib
INCLUDING DEPENDENCY MoveStdlib
BUILDING hello
{
"Result": [
"c0d8xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx14bd::hello"
]
}
Gerekirse test de edebiliriz:
$ aptos move test
INCLUDING DEPENDENCY AptosFramework
INCLUDING DEPENDENCY AptosStdlib
INCLUDING DEPENDENCY MoveStdlib
BUILDING hello
Running Move unit tests
Test result: OK. Total tests: 0; passed: 0; failed: 0
{
"Result": "Success"
}
Artık modülü Aptos ağına dağıtabiliriz. Bir kullanıcı yalnızca kendi kontrolündeki hesaplara modül yayımlayabileceğinden, hesabı BlockSec ile ilişkilendirdiğimizi hatırlayın. Ayrıca musluk, gas ücretlerini ödemek için hesabı zaten bazı APT'lerle fonlamıştır. Geriye kalan tek şey, Move paketindeki modülü aşağıdaki gibi Aptos ağına yayımlamaktır:
$ aptos move publish --package-dir ./ --profile default
Compiling, may take a little while to download git dependencies...
INCLUDING DEPENDENCY AptosFramework
INCLUDING DEPENDENCY AptosStdlib
INCLUDING DEPENDENCY MoveStdlib
BUILDING hello
package size 1271 bytes
Do you want to submit a transaction for a range of [672200 - 1008300] Octas at a gas unit price of 100 Octas? [yes/no] >
yes
{
"Result":
...
}
Bu da etkileşimli bir kabuktur ve Result içeriği atlanmıştır.
0x3.4 Modülle Etkileşim
Modülün olayı yayımlamasını sağlamak için aşağıdaki komutu yazmanız yeterlidir:
$ aptos move run --function-id default::hello::say_hello_script
Do you want to submit a transaction for a range of [34500 - 51700] Octas at a gas unit price of 100 Octas? [yes/no] >
yes
{
"Result": {
"transaction_hash": "0x9af16532de5e79803c823fe28e3251703927d93809274b76972d8e83c6fcd433",
...
}
}
Bir giriş fonksiyonu olarak say_hello_script fonksiyonu doğrudan çağrılabilir. Ayrıca bir betik yazarak say_hello fonksiyonunu betiğinizde çağırabilirsiniz.
İpucu#4: Daha iyi bir etkileşim deneyimi için bazı giriş fonksiyonları tanımlamak iyi bir pratiktir. Ayrıca kullanıcıların projenizle etkileşime geçmesi için bazı betikler de geliştirebilirsiniz.
Geleneksel Web2 Hello World programının aksine, yayımlanan olay kabukta gösterilmeyecektir. Aptos gezgini'ni kontrol edin ve local ağını seçin.

Ardından kabuktan transaction_hash değerini kopyalayıp arama çubuğuna yapıştırın; işlem ayrıntılarını göreceksiniz.

Son olarak Events'e tıklayın; Aptos ağı size selamlarını iletecektir.

0x4. Sırada Ne Var?
Hello World programı, Move uygulamaları geliştirmek için yalnızca küçük bir adımdır. Gelecek makale serisinde, Aptos üzerinde güvenli Move uygulamaları geliştirme hakkında daha fazla bilgi sunacağız. Takipte kalın!
BlockSec Hakkında
BlockSec, 2021 yılında küresel çapta tanınmış bir grup güvenlik uzmanı tarafından kurulan öncü bir blok zinciri güvenlik şirketidir. Şirket, kitlesel benimsemesini kolaylaştırmak amacıyla gelişmekte olan Web3 dünyasının güvenliğini ve kullanılabilirliğini artırmaya kendini adamıştır. Bu doğrultuda BlockSec; akıllı sözleşme ve EVM zinciri güvenlik denetimi hizmetleri, güvenlik geliştirme ve tehditleri proaktif olarak engelleme için Phalcon platformu, fon takibi ve soruşturma için MetaSleuth platformu ve web3 geliştiricilerinin kripto dünyasında verimli şekilde gezinmesi için MetaSuites eklentisi sunmaktadır.
Bugüne kadar şirket, MetaMask, Uniswap Foundation, Compound, Forta ve PancakeSwap gibi 300'den fazla saygın müşteriye hizmet vermiş; Matrix Partners, Vitalbridge Capital ve Fenbushi Capital gibi önde gelen yatırımcılardan iki tur finansmanda onlarca milyon ABD doları almıştır.
Resmi web sitesi: https://blocksec.com/
Resmi Twitter hesabı: https://twitter.com/BlockSecTeam



