Derleyicinin Kullanımı
Komut Satırı Derleyicisinin Kullanımı
Not
Bu bölüm, komut satırı modunda kullanılsa bile solcjs için geçerli değildir.
Temel Kullanım
Solidity deposunun(repository) derleme kaynaklarından biri de Solidity komut satırı derleyicisi olan solc
dur. solc --help
komutunu kullanmak size tüm seçeneklerin açıklamalarını verir. Derleyici, soyut bir sözdizimi ağacı (parse tree) üzerinde basit binary ve assembly’den gaz kullanımı tahminlerine kadar çeşitli çıktılar üretebilir. Sadece tek bir dosyayı derlemek istiyorsanız, solc --bin sourceFile.sol
şeklinde çalıştırdığınızda binary dosyayı yazdıracaktır. Eğer solc``un daha gelişmiş çıktı çeşitlerinden bazılarını elde etmek istiyorsanız, ``solc -o outputDirectory --bin --ast-compact-json --asm sourceFile.sol
kullanarak her öğeyi ayrı dosyalara çıktı olarak vermesini söylemek muhtemelen daha iyi bir seçenek olacaktır.
Optimize Edici Seçenekleri
Sözleşmenizi deploy etmeden önce, solc --optimize --bin sourceFile.sol
kullanarak
derleme yaparken optimize ediciyi etkinleştirmelisiniz. Standart olarak optimize edici,
sözleşmenin ömrü boyunca 200 kez çağrıldığını varsayarak sözleşmeyi optimize edecektir
(daha spesifik olarak, her bir işlem kodunun yaklaşık 200 kez çalıştırıldığını varsayar).
İlk sözleşme dağıtımının daha ucuz olmasını ve daha sonraki fonksiyon yürütmelerinin(executions)
daha pahalı olmasını istiyorsanız, --optimize-runs=1
olarak ayarlayın. Çok sayıda
işlem bekliyorsanız ve daha yüksek dağıtım maliyeti ve çıktı boyutunu önemsemiyorsanız,
--optimize-runs
değerini yüksek bir sayıya ayarlayın. Bu parametrenin aşağıdaki
değerler üzerinde etkileri vardır (bu durum gelecekte değişebilir):
fonksiyon gönderim prosedüründeki binary aramasının boyutu
büyük sayılar veya dizeler gibi sabitlerin saklanma şekli
Base Path ve Import Remapping
Komut satırı derleyicisi içe aktarılan dosyaları dosya sisteminden otomatik olarak
okuyacaktır, ancak aşağıdaki şekilde prefix=path
kullanarak path redirects
sağlamanız da mümkündür:
solc github.com/ethereum/dapp-bin/=/usr/local/lib/dapp-bin/ file.sol
This essentially instructs the compiler to search for anything starting with
github.com/ethereum/dapp-bin/
under /usr/local/lib/dapp-bin
.
İçe aktarmaları aramak için dosya sistemine erişirken, :ref:` ./ veya ../ <direct-imports>`
ile başlamayan dizinler, --base-path
ve --include-path
seçenekleri kullanılarak
belirtilen dizinlere (veya temel yol belirtilmemişse geçerli çalışma dizinine) bağlı
olarak değerlendirilir. Ayrıca, dizinin bu seçenekler aracılığıyla eklenen kısmı
sözleşme metadatasında görünmeyecektir.
Güvenlik nedeniyle derleyicinin hangi dizinlere erişebileceği konusunda kısıtlamaları
vardır. Komut satırında belirtilen kaynak dosyaların dizinlerine ve
yeniden eşlemelerin hedef yollarına dosya okuyucu tarafından erişilmesine otomatik
olarak izin verilir, ancak diğer her şey varsayılan olarak reddedilir. İlave yollara
(ve bunların alt dizinlerine) --allow-paths /sample/path,/another/sample/path
anahtarıyla izin verilebilir. --base-path
ile belirtilen yol içindeki her şeye
her zaman izin verilir.
Yukarıda anlatılanlar, derleyicinin içe aktarma yollarını nasıl ele aldığının basitleştirilmiş halidir. Örneklerle birlikte ayrıntılı bir açıklama ve uç noktaların tartışılması için lütfen path resolution bölümüne bakın.
Kütüphane Bağlantıları (Library Linking)
Sözleşmeleriniz libraries kullanıyorsa, bytecode’un __$53aea86b7d70b31448b230b20ae141a537$__
şeklinde alt dizeler içerdiğini fark edeceksiniz. Bunlar gerçek kütüphane adresleri
için yer tutuculardır. Yer tutucu, tam nitelikli kütüphane adının keccak256 hash’inin
hex encoding’inin 34 karakterlik bir önekidir. Bayt kodu dosyası, yer tutucuların
hangi kütüphaneleri temsil ettiğini belirlemeye yardımcı olmak için sonunda // <placeholder> -> <fq library name>
şeklinde satırlar da içerecektir. Tam nitelikli kütüphane adının, kaynak dosyasının
yolu ve :
ile ayrılmış kütüphane adı olduğunu unutmayın. Bir bağlayıcı olarak
solc
kullanabilirsiniz, yani bu noktalarda sizin için kütüphane adreslerini ekleyecektir:
Her kütüphane için bir adres sağlamak üzere komutunuza --libraries "file.sol:Math=0x123456789012345678901234567890 file.sol:Heap=0xabCD567890123456789012345678901234567890"
ekleyin (ayırıcı olarak virgül veya boşluk kullanın) veya dizeyi bir dosyada saklayın (satır başına bir kütüphane) ve --libraries fileName
kullanarak solc
çalıştırın.
Not
Solidity 0.8.1’den itibaren =
kütüphane ve adres arasında ayırıcı olarak kabul etmektedir ve :
ayırıcı olarak kullanımdan kaldırılmıştır. Gelecekte kaldırılacaktır. Şu anda -libraries "file.sol:Math:0x1234567890123456789012345678901234567890 file.sol:Heap:0xabCD567890123456789012345678901234567890"
da çalışacaktır.
Eğer solc
--standard-json
seçeneği ile çağrılırsa, standart girişte bir JSON girdisi (aşağıda açıklandığı gibi) bekleyecek ve standart çıkışta bir JSON çıktısı döndürecektir. Bu, daha karmaşık ve özellikle otomatikleştirilmiş kullanımlar için önerilen arayüzdür. İşlem her zaman “başarılı” durumda sonlanacak ve hataları JSON çıktısı aracılığıyla bildirecektir. --base-path
seçeneği de standart-json modunda işlenir.
Eğer solc
--link
seçeneği ile çağrılırsa, tüm girdi dosyaları yukarıda verilen __$53aea86b7d70b31448b230b20ae141a537$__
-formatında bağlanmamış binaryler (hex-encoded) olarak yorumlanır ve yerinde bağlanır (eğer girdi stdin`den okunuyorsa, stdout`a yazılır). Bu durumda --libraries
dışındaki tüm seçenekler göz ardı edilir (-o
dahil).
Uyarı
Sözleşme meta verilerini güncellemediğinden, oluşturulan bayt kodu üzerinde kütüphaneleri manuel olarak bağlamak önerilmez. Metadata derleme sırasında belirtilen kütüphanelerin bir listesini içerdiğinden ve bayt kodu bir metadata hash’i içerdiğinden, bağlama işleminin ne zaman yapıldığına bağlı olarak farklı binary dosyaları elde edersiniz.
Derleyiciye standart-JSON arayüzünü kullanıyorsanız solc
seçeneğinin --libraries
seçeneğini veya libraries
anahtarını kullanarak bir sözleşme derlendiğinde
derleyiciden kütüphaneleri bağlamasını istemelisiniz.
Not
Kütüphane yer tutucusu eskiden kütüphanenin hash’i yerine kütüphanenin kendisinin
tam nitelikli adı olurdu. Bu biçim hala solc --link
tarafından desteklenmektedir
ancak derleyici artık bu biçimin çıktısını vermeyecektir. Bu değişiklik, tam nitelikli
kütüphane adının yalnızca ilk 36 karakteri kullanılabildiğinden, kütüphaneler arasında
bir çakışma olasılığını azaltmak için yapılmıştır.
EVM Sürümünün Hedefe Ayarlanması
Sözleşme kodunuzu derlerken, belirli özelliklerden veya davranışlardan kaçınmak için derlenecek Ethereum sanal makine sürümünü belirtebilirsiniz.
Uyarı
Hatalı EVM sürümü için derleme yapmak yanlış, garip ve başarısız davranışlara neden olabilir. Lütfen, özellikle özel bir zincir çalıştırıyorsanız, uyumlu EVM sürümlerini kullandığınızdan emin olun.
Komut satırında, EVM sürümünü aşağıdaki gibi seçebilirsiniz:
solc --evm-version <VERSION> contract.sol
ref:standart JSON arayüzü <compiler-api>`de, `”settings”`` alanında "evmVersion"
anahtarını kullanın:
{
"sources": {/* ... */},
"settings": {
"optimizer": {/* ... */},
"evmVersion": "<VERSION>"
}
}
Hedef Seçenekleri
Aşağıda hedef EVM sürümlerinin bir listesi ve her sürümde derleyiciyle ilgili yapılan değişiklikler yer almaktadır. Her sürüm arasında geriye dönük uyumluluk garanti edilmez.
homestead
(en eski sürüm)
tangerineWhistle
Gaz tahmini ve optimize edici ile ilgili diğer hesaplara erişim için gaz maliyeti arttı.
Harici aramalar için varsayılan olarak gönderilen tüm gaz. Daha önce belirli bir miktarın tutulması gerekiyordu.
spuriousDragon
Gaz tahmini ve optimize edici ile ilgili
exp
işlem kodu için gaz maliyeti arttı.
byzantium
Assembly’de
returndatacopy
,returndatasize
vestaticcall
işlem kodları mevcuttur.staticcall
işlem kodu, kütüphane dışı görünüm veya pure fonksiyonları çağırırken kullanılır, bu da fonksiyonların EVM seviyesinde durumu değiştirmesini engeller, yani geçersiz tip dönüşümleri kullandığınızda bile geçerlidir.Fonksiyon çağrılarından dönen dinamik verilere erişmek mümkündür.
revert
işlem kodu tanıtıldı, bu darevert()
işleminin gaz israfına yol açmayacağı anlamına geliyor.
constantinople
Assembly’de
create2
,extcodehash
,shl
,shr
vesar
işlem kodları mevcuttur.Shifting operatörleri shifting opcodes kullanır ve bu nedenle daha az gaza ihtiyaç duyar.
petersburg
Derleyici istanbul’da olduğu gibi aynı şekilde davranır.
istanbul
Assembly’de
chainid
veselfbalance
opcode’ları mevcuttur.
berlin
SLOAD
,*CALL
,BALANCE
,EXT*
veSELFDESTRUCT
için gaz maliyetleri arttı. Bu maliyetler derleyici bu tür operasyonlarda soğuk gaz maliyetlerini varsayar. Bu, gaz tahmini için geçerlidir ve optimize edicidir.
Derleyici JSON Girdisi ve Çıktısı Tanımı
Özellikle daha karmaşık ve otomatik kurulumlar için Solidity derleyicisi ile arayüz oluşturmanın önerilen yolu JSON-girdi-çıktı arayüzüdür. Aynı arayüz derleyicinin tüm dağıtımları tarafından sağlanır.
Alanlar genellikle değişikliğe tabidir, bazıları isteğe bağlıdır (belirtildiği gibi), ancak yalnızca geriye dönük uyumlu değişiklikler yapmaya çalışıyoruz.
Derleyici API’si JSON formatında bir girdi bekler ve derleme sonucunu JSON formatında bir çıktı olarak verir. Standart hata çıktısı kullanılmaz ve hatalar olsa bile işlem her zaman “başarılı” durumda sonlandırılır. Hatalar her zaman JSON çıktısının bir parçası olarak rapor edilir.
Aşağıdaki alt bölümlerde format bir örnek üzerinden açıklanmaktadır. Yorumlara elbette izin verilmez ve burada yalnızca açıklama amacıyla kullanılır.
Girdi Açıklaması
{
// Gerekli: Kaynak kod dili. Şu anda "Solidity" ve "Yul" desteklenmektedir.
"language": "Solidity",
// Gerekli
"sources":
{
// Buradaki anahtarlar kaynak dosyaların "global" isimleridir,
// içe aktarmalar yeniden eşlemeler yoluyla diğer dosyaları kullanabilir (aşağıya bakın).
"myFile.sol":
{
// Opsiyonel: kaynak dosyanın keccak256 hash'i
// URL'ler aracılığıyla içe aktarılmışsa alınan içeriği doğrulamak için kullanılır.
"keccak256": "0x123...",
// Gerekli ("content" kullanılmadığı sürece, aşağıya bakın): Kaynak dosyaya giden URL(ler).
// URL(ler) bu sırayla içe aktarılmalı ve sonuç keccak256 hash'iyle
// (varsa) kontrol edilmelidir. Hash eşleşmezse veya URL(ler)den hiçbiri başarıyla
// sonuçlanmazsa, bir hata oluşmalıdır.
// Komut satırı arayüzü kullanılarak yalnızca dosya sistemi yolları desteklenir.
// JavaScript arayüzü ile URL, kullanıcı tarafından sağlanan okuma geri çağrısına aktarılır,
// böylece geri çağrı tarafından desteklenen herhangi bir URL kullanılabilir.
"urls":
[
"bzzr://56ab...",
"ipfs://Qma...",
"/tmp/path/to/file.sol"
// Dosyalar kullanılıyorsa, dizinleri komut satırına şu yolla eklenmelidir
// `--allow-paths <path>`.
]
},
"destructible":
{
// Opsiyonel: kaynak dosyanın keccak256 hash'i
"keccak256": "0x234...",
// Gerekli ("urls" kullanılmadığı sürece): kaynak dosyanın gerçek içeriği
"content": "contract destructible is owned { function shutdown() { if (msg.sender == owner) selfdestruct(owner); } }"
}
},
// Opsiyonel
"settings":
{
// Opsiyonel: Belirtilen aşamadan sonra derlemeyi durdurun. Şu anda burada sadece "parsing" geçerlidir
"stopAfter": "parsing",
// Opsiyonel: Yeniden eşlemelerin sıralanmış listesi
"remappings": [ ":g=/dir" ],
// Opsiyonel: Optimize edici ayarları
"optimizer": {
// Varsayılan olarak devre dışıdır.
// NOT: enabled=false hala bazı optimizasyonları açık bırakır. Aşağıdaki yorumlara bakın.
// UYARI: 0.8.6 sürümünden önce 'enabled' anahtarını atlamak, false olarak ayarlamakla eşdeğer
// değildi ve aslında tüm optimizasyonları devre dışı bırakıyordu.
"enabled": true,
// Kodu kaç kez çalıştırmayı planladığınıza göre optimize edin.
// Düşük değerler ilk dağıtım maliyeti için daha fazla optimizasyon sağlarken, yüksek
// değerler yüksek frekanslı kullanım için daha fazla optimizasyon sağlayacaktır.
"runs": 200,
// Optimize edici bileşenleri ayrıntılı olarak açın veya kapatın.
// Yukarıdaki "enabled" anahtarı, burada değiştirilebilecek iki
// varsayılan değer sağlar. Eğer "details" verilmişse, "enabled" atlanabilir.
"details": {
// Ayrıntı verilmediğinde peephole optimizer her zaman açıktır,
// kapatmak için ayrıntıları kullanın.
"peephole": true,
// Ayrıntı verilmediğinde inliner her zaman açıktır,,
// kapatmak için ayrıntıları kullanın.
"inliner": true,
// Kullanılmayan jumpdest kaldırıcı, ayrıntı verilmediğinde her zaman açıktır,
// kapatmak için ayrıntıları kullanın.
"jumpdestRemover": true,
// Bazen değişmeli işlemlerde değişmezleri yeniden sıralar.
"orderLiterals": false,
// Yinelenen kod bloklarını kaldırır
"deduplicate": false,
// Ortak alt ifade eliminasyonu, bu en karmaşık adımdır ancak
// aynı zamanda en büyük kazancı sağlayabilir.
"cse": false,
// Koddaki değişmez sayıların ve dizelerin gösterimini optimize edin.
"constantOptimizer": false,
// Yeni Yul optimize edici. Çoğunlukla ABI coder v2 ve inline assembly kodu
// üzerinde çalışır.
// Global optimizer ayarı ile birlikte etkinleştirilir ve
// buradan devre dışı bırakılabilir.
// Solidity 0.6.0'dan önce bu anahtar aracılığıyla etkinleştirilmesi gerekiyordu.
"yul": false,
// Yul optimize edici için ayarlama seçenekleri.
"yulDetails": {
// Değişkenler için yığın yuvalarının tahsisini iyileştirin, yığın yuvalarını erken boşaltabilir.
// Yul optimize edici etkinleştirilirse varsayılan olarak etkinleştirilir.
"stackAllocation": true,
// Uygulanacak optimizasyon adımlarını seçin.
// İsteğe bağlıdır, atlanırsa optimize edici varsayılan sırayı kullanır.
"optimizerSteps": "dhfoDgvulfnTUtnIf..."
}
}
},
// Derlenecek EVM sürümü.
// Tip denetimini ve kod üretimini etkiler. Yerleşim yeri olabilir,
// tangerineWhistle, spuriousDragon, byzantium, constantinople, petersburg, istanbul or berlin
"evmVersion": "byzantium",
// Opsiyonel: Derleme işlem hattını Yul ara temsilinden geçecek şekilde değiştirin.
// Bu varsayılan olarak yanlıştır.
"viaIR": true,
// Opsiyonel: Hata ayıklama ayarları
"debug": {
// Revert (ve require) sebep string' lerine nasıl işlem yapılır. Ayarlar
// "default", "strip", "debug" ve "verboseDebug" şeklindedir.
// "default" derleyici tarafından oluşturulan revert stringlerini enjekte etmez ve kullanıcı tarafından sağlananları tutar.
// "strip" tüm revert stringlerini (mümkünse, yani değişmezler kullanılıyorsa) yan etkilerini koruyarak kaldırır
// "debug" derleyici tarafından oluşturulan dahili geri dönüşler için stringler enjekte eder, şimdilik ABI kodlayıcıları V1 ve V2 için uygulanmaktadır.
// "verboseDebug" kullanıcı tarafından sağlanan revert stringlerine daha fazla bilgi ekler (henüz uygulanmadı)
"revertStrings": "default",
// Opsiyonel: Üretilen EVM assembly ve Yul kodundaki yorumlara ne kadar ekstra
// hata ayıklama bilgisi ekleneceği. Mevcut bileşenler şunlardır:
// - `location`: Orijinal Solidity dosyasındaki ilgili öğenin konumunu belirten
// `@src <index>:<start>:<end>` biçimindeki ek açıklamalar, burada:
// - `<index>`, `@use-src` ek açıklamasıyla eşleşen dosya dizinidir,
// - `<start>` o konumdaki ilk baytın indeksidir,
// - `<end>` bu konumdan sonraki ilk baytın indeksidir.
// - `snippet`: `@src` ile belirtilen konumdan tek satırlık bir kod parçacığı.
// Parçacık alıntılanır ve ilgili `@src` ek açıklamasını takip eder.
// - `*`: Her şeyi talep etmek için kullanılabilecek joker karakter değeri.
"debugInfo": ["location", "snippet"]
},
// Metadata ayarları (isteğe bağlı)
"metadata": {
// URL'leri değil, yalnızca gerçek içeriği kullan (varsayılan olarak false)
"useLiteralContent": true,
// Bayt koduna eklenen metadata hash'i için verilen hash yöntemini kullanın.
// Metadata hash'i "none" seçeneği ile bayt kodundan kaldırılabilir.
// Diğer seçenekler "ipfs" ve "bzzr1 "dir.
// Seçenek atlanırsa, varsayılan olarak "ipfs" kullanılır.
"bytecodeHash": "ipfs"
},
// Kütüphanelerin adresleri. Tüm kütüphaneler burada verilmezse,
// çıktı verileri farklı olan bağlantısız nesnelerle sonuçlanabilir.
"libraries": {
// En üst düzey anahtar, kütüphanenin kullanıldığı kaynak dosyanın adıdır.
// Yeniden eşlemeler kullanılıyorsa, bu kaynak dosya yeniden eşlemeler
// uygulandıktan sonraki genel yolla eşleşmelidir.
// Bu anahtar boş bir string ise, bu global bir seviyeyi ifade eder.
"myFile.sol": {
"MyLib": "0x123123..."
}
},
// Dosya ve sözleşme adlarına göre istenen çıktıları
// seçmek için aşağıdakiler kullanılabilir.
// Bu alan atlanırsa, derleyici yükler ve tür denetimi yapar,
// ancak hatalar dışında herhangi bir çıktı üretmez.
// Birinci seviye anahtar dosya adı, ikinci seviye anahtar ise sözleşme adıdır.
// Boş bir sözleşme adı, bir sözleşmeye bağlı olmayan ancak AST gibi
// tüm kaynak dosyaya bağlı olan çıktılar için kullanılır.
// Sözleşme adı olarak bir yıldız, dosyadaki tüm sözleşmeleri ifade eder.
// Benzer şekilde, dosya adı olarak bir yıldız tüm dosyalarla eşleşir.
// Derleyicinin üretebileceği tüm çıktıları seçmek için
// "outputSelection: { "*": { "*": [ "*" ], "": [ "*" ] } }"
// ancak bunun derleme sürecini gereksiz yere yavaşlatabileceğini unutmayın.
//
// Mevcut çıktı türleri aşağıdaki gibidir:
//
// Dosya seviyesi (sözleşme adı olarak boş dize gerekir):
// ast - Tüm kaynak dosyaların AST'si
//
// Sözleşme seviyesi (sözleşme adına veya "*" işaretine ihtiyaç duyar):
// abi - ABI
// devdoc - Geliştirici dokümantasyonu (natspec)
// userdoc - Kullanıcı dokümantasyonu (natspec)
// metadata - Metadata
// ir - Optimizasyondan önce kodun Yul ara temsili
// irOptimized - Optimizasyon sonrası ara temsil
// storageLayout - Sözleşmenin durum değişkenlerinin yuvaları, ofsetleri ve türleri.
// evm.assembly - Yeni assembly formatı
// evm.legacyAssembly - JSON'daki eski tarz assembly formatı
// evm.bytecode.functionDebugData - Fonksiyon düzeyinde hata ayıklama bilgileri
// evm.bytecode.object - Bytecode objesi
// evm.bytecode.opcodes - Opcodes listesi
// evm.bytecode.sourceMap - Kaynak eşlemesi (hata ayıklama için yararlı)
// evm.bytecode.linkReferences - Bağlantı referansları (bağlantısı olmayan nesne ise)
// evm.bytecode.generatedSources - Derleyici tarafından oluşturulan kaynaklar
// evm.deployedBytecode* - Deployed bytecode (evm.bytecode'un sahip olduğu tüm seçeneklere sahiptir)
// evm.deployedBytecode.immutableReferences - AST kimliklerinden değişmezlere referans veren bayt kodu aralıklarına eşleme
// evm.methodIdentifiers - Fonksiyon hash'lerinin listesi
// evm.gasEstimates - Fonksiyon gazı tahminleri
// ewasm.wast - WebAssembly S-expressions biçiminde Ewasm
// ewasm.wasm - WebAssembly binary formatında Ewasm
//
// Bir `evm`, `evm.bytecode`, `ewasm`, vb. kullanmanın bu çıktının her
// hedef parçasını seçeceğini unutmayın. Ayrıca, `*` her şeyi istemek için joker karakter olarak kullanılabilir.
//
"outputSelection": {
"*": {
"*": [
"metadata", "evm.bytecode" // Her bir sözleşmenin metadata ve bytecode çıktılarını etkinleştirin.
, "evm.bytecode.sourceMap" // Her bir sözleşmenin kaynak eşleme çıktısını etkinleştirin.
],
"": [
"ast" // Her bir dosyanın AST çıktısını etkinleştirin.
]
},
// Def dosyasında tanımlanan MyContract'ın abi ve opcodes çıktısını etkinleştirin.
"def": {
"MyContract": [ "abi", "evm.bytecode.opcodes" ]
}
},
// ModelChecker nesnesi deneyseldir ve değişikliklere tabidir.
"modelChecker":
{
// Hangi sözleşmelerin konuşlandırılmış sözleşme olarak analiz edilmesi gerektiğini seçin.
"contracts":
{
"source1.sol": ["contract1"],
"source2.sol": ["contract2", "contract3"]
},
// Bölme ve modulo işlemlerinin nasıl şifreleneceğini seçin.
// `false` kullanıldığında, bunlar slack değişkenlerle çarpılarak
// değiştirilir. Bu varsayılandır.
// CHC motorunu kullanıyorsanız ve Horn çözücü olarak Spacer kullanmıyorsanız
// (örneğin Eldarica kullanıyorsanız) burada `true` kullanılması önerilir.
// Bu seçeneğin daha ayrıntılı bir açıklaması için Biçimsel Doğrulama bölümüne bakın.
"divModNoSlacks": false,
// Hangi model denetleyici motorunun kullanılacağını seçin: all (varsayılan), bmc, chc, none.
"engine": "chc",
// Kullanıcıya hangi tür değişmezlerin rapor edileceğini seçin: contract, reentrancy.
"invariants": ["contract", "reentrancy"],
// Kanıtlanmamış tüm hedeflerin çıktısının alınıp alınmayacağını seçin. Varsayılan değer `false`dir.
"showUnproved": true,
// Varsa, hangi çözücülerin kullanılması gerektiğini seçin.
// Çözücülerin açıklaması için Biçimsel Doğrulama bölümüne bakın.
"solvers": ["cvc4", "smtlib2", "z3"],
// Hangi hedeflerin kontrol edilmesi gerektiğini seçin: constantCondition,
// underflow, overflow, divByZero, balance, assert, popEmptyArray, outOfBounds.
// Seçenek belirtilmezse, Solidity >=0.8.7 için underflow/overflow
// hariç tüm hedefler varsayılan olarak kontrol edilir.
// Hedeflerin açıklaması için Biçimsel Doğrulama bölümüne bakın.
"targets": ["underflow", "overflow", "assert"],
// Her SMT sorgusu için milisaniye cinsinden zaman aşımı.
// Bu seçenek verilmezse, SMTChecker varsayılan olarak
// deterministik bir kaynak sınırı kullanacaktır.
// Verilen zaman aşımının 0 olması, herhangi bir sorgu için kaynak/zaman kısıtlaması olmadığı anlamına gelir.
"timeout": 20000
}
}
}
Çıktı Açıklaması
{
// Opsiyonel: herhangi bir hata/uyarı/bilgi ile karşılaşılmadıysa mevcut değildir
"errors": [
{
// Opsiyonel: Kaynak dosya içindeki konum.
"sourceLocation": {
"file": "sourceFile.sol",
"start": 0,
"end": 100
},
// Opsiyonel: Diğer yerler (örn. çelişkili beyanların olduğu yerler)
"secondarySourceLocations": [
{
"file": "sourceFile.sol",
"start": 64,
"end": 92,
"message": "Other declaration is here:"
}
],
// Zorunlu: Hata türü, örneğin "TypeError", "InternalCompilerError", "Exception", vb.
// Türlerin tam listesi için aşağıya bakınız.
"type": "TypeError",
// Zorunlu: Hatanın kaynaklandığı bileşen, örneğin "general", "ewasm", vb.
"component": "general",
// Zorunlu (" error", "warning" veya "info", ancak bunun gelecekte genişletilebileceğini lütfen unutmayın)
"severity": "error",
// İsteğe bağlı: hatanın nedeni için benzersiz kod
"errorCode": "3141",
// Zorunlu
"message": "Invalid keyword",
// Opsiyonel: kaynak konumu ile biçimlendirilmiş mesaj
"formattedMessage": "sourceFile.sol:100: Invalid keyword"
}
],
// Bu, dosya düzeyinde çıktıları içerir.
// OutputSelection ayarları ile sınırlandırılabilir/filtrelenebilir.
"sources": {
"sourceFile.sol": {
// Kaynak tanımlayıcısı (kaynak eşlemelerinde kullanılır)
"id": 1,
// AST objesi
"ast": {}
}
},
// Bu, sözleşme düzeyindeki çıktıları içerir.
// OutputSelection ayarları ile sınırlandırılabilir/filtrelenebilir.
"contracts": {
"sourceFile.sol": {
// Kullanılan dilde sözleşme adı yoksa, bu alan boş bir dizeye eşit olmalıdır.
"ContractName": {
// Ethereum Sözleşmesi ABI'si. Boşsa, boş bir dizi olarak gösterilir.
// bkz. https://docs.soliditylang.org/en/develop/abi-spec.html
"abi": [],
// Metadata Çıktısı belgelerine bakın (serileştirilmiş JSON stringi)
"metadata": "{/* ... */}",
// Kullanıcı dokümantasyonu (natspec)
"userdoc": {},
// Geliştirici dokümantasyonu (natspec)
"devdoc": {},
// Ara temsil (string)
"ir": "",
// Depolama Düzeni belgelerine bakın.
"storageLayout": {"storage": [/* ... */], "types": {/* ... */} },
// EVM'ye ilişkin çıktılar
"evm": {
// Assembly (string)
"assembly": "",
// Eski tarz assembly (object)
"legacyAssembly": {},
// Bytecode ve ilgili ayrıntılar.
"bytecode": {
// Fonksiyonlar düzeyinde veri hata ayıklama.
"functionDebugData": {
// Şimdi derleyicinin dahili ve kullanıcı tanımlı fonksiyonlarını içeren bir fonksiyon kümesini takip edin.
// Kümenin eksiksiz olması gerekmez.
"@mint_13": { // Fonksiyonun dahili adı
"entryPoint": 128, // Fonksiyonun başladığı byte offset bytecode (isteğe bağlı)
"id": 13, // Fonksiyon tanımının AST ID'si veya derleyiciye dahili fonksiyonlar için null (isteğe bağlı)
"parameterSlots": 2, // Fonksiyon parametreleri için EVM yığın yuvası sayısı (isteğe bağlı)
"returnSlots": 1 // Dönüş değerleri için EVM yığın yuvası sayısı (isteğe bağlı)
}
},
// Hex string olarak bytecode.
"object": "00fe",
// Opcodes listesi (string)
"opcodes": "",
// Bir string olarak kaynak eşlemesi. Kaynak eşleme tanımına bakın.
"sourceMap": "",
// Derleyici tarafından oluşturulan kaynakların dizisi. Şu anda yalnızca
// tek bir Yul dosyası içerir.
"generatedSources": [{
// Yul AST
"ast": {/* ... */},
// Metin halindeki kaynak dosya (yorum içerebilir)
"contents":"{ function abi_decode(start, end) -> data { data := calldataload(start) } }",
// Kaynak dosya ID'si, kaynak referansları için kullanılır, Solidity kaynak dosyalarıyla aynı "ad alanı"
"id": 2,
"language": "Yul",
"name": "#utility.yul"
}],
// Verilirse, bu bağlantısız bir nesnedir.
"linkReferences": {
"libraryFile.sol": {
// Baytların bayt kodu içindeki ofsetleri.
// Bağlantı, burada bulunan 20 baytın yerini alır.
"Library1": [
{ "start": 0, "length": 20 },
{ "start": 200, "length": 20 }
]
}
}
},
"deployedBytecode": {
/* ..., */ // Yukarıdaki ile aynı düzen.
"immutableReferences": {
// AST ID 3 ile değişmeze iki referans vardır, her ikisi de 32 bayt uzunluğundadır. Bir tanesi
// bytecode offset 42'de, diğeri bytecode offset 80'de.
"3": [{ "start": 42, "length": 32 }, { "start": 80, "length": 32 }]
}
},
// Fonksiyon hash'lerinin listesi
"methodIdentifiers": {
"delegate(address)": "5c19a95c"
},
// Fonksiyon gaz tahminleri
"gasEstimates": {
"creation": {
"codeDepositCost": "420000",
"executionCost": "infinite",
"totalCost": "infinite"
},
"external": {
"delegate(address)": "25000"
},
"internal": {
"heavyLifting()": "infinite"
}
}
},
// Ewasm ile ilgili çıktılar
"ewasm": {
// S-expressions biçimi
"wast": "",
// Binary formatı (hex string)
"wasm": ""
}
}
}
}
}
Hata Türleri
JSONError
: JSON girdisi gerekli biçime uymuyor, örneğin girdi bir JSON nesnesi değil, dil desteklenmiyor vb.IOError
: Çözümlenemeyen URL veya sağlanan kaynaklardaki hash uyuşmazlığı gibi IO ve içe aktarma işleme hataları.ParserError
: Kaynak kodu dil kurallarına uygun değil.DocstringParsingError
: Yorum bloğundaki NatSpec etiketleri ayrıştırılamıyor.SyntaxError
: Sözdizimsel hata, örneğincontinue
birfor
döngüsünün dışında kullanılmıştır.DeclarationError
: Geçersiz, çözümlenemeyen veya çakışan tanımlayıcı adları. ör.Identifier not found
TypeError
: Geçersiz tür dönüşümleri, geçersiz atamalar vb. gibi tür sistemi içindeki hatalar.UnimplementedFeatureError
: Özellik derleyici tarafından desteklenmiyor, ancak gelecek sürümlerde desteklenmesi bekleniyor.InternalCompilerError
: Derleyicide tetiklenen dahili hata - bu bir sorun olarak raporlanmalıdır.Exception
: Derleme sırasında bilinmeyen hata - bu bir sorun olarak raporlanmalıdır.CompilerError
: Derleyici yığınının geçersiz kullanımı - bu bir sorun olarak raporlanmalıdır.FatalError
: Ölümcül hata doğru şekilde işlenmedi - bu bir sorun olarak raporlanmalıdır.Warning
: Derlemeyi durdurmayan, ancak mümkünse ele alınması gereken bir uyarı.Info
: Derleyicinin kullanıcının yararlı bulabileceğini düşündüğü, ancak tehlikeli olmayan ve mutlaka ele alınması gerekmeyen bilgiler.
Derleyici Araçları
solidity-upgrade
solidity-upgrade
sözleşmelerinizi dil değişikliklerine yarı otomatik olarak
yükseltmenize yardımcı olabilir. Her son sürüm için gerekli tüm değişiklikleri
uygulamasa ve uygulayamasa da, aksi takdirde çok sayıda tekrarlayan manuel ayarlama
gerektirecek olanları hala desteklemektedir.
Not
‘’solidity-upgrade’’ işin büyük bir kısmını gerçekleştirir, ancak sözleşmelerinizin büyük olasılıkla daha fazla manuel ayarlamaya ihtiyacı olacaktır. Dosyalarınız için bir sürüm kontrol sistemi kullanmanızı öneririz. Bu, yapılan değişikliklerin gözden geçirilmesine ve sonunda geri alınmasına yardımcı olur.
Uyarı
solidity-upgrade
tam veya hatasız olarak kabul edilmez, bu nedenle lütfen
dikkatli kullanın.
Nasıl Çalışır?
Solidity kaynak dosya(lar)ını solidity-upgrade [files]
’a aktarabilirsiniz. Bunlar,
geçerli kaynak dosyanın dizini dışındaki dosyalara referans veren import
ifadesini
kullanıyorsa, --allow-paths [directory]
seçeneğini geçerek dosyaların okunmasına
ve içe aktarılmasına izin verilen dizinleri belirtmeniz gerekir. Eksik dosyaları
--ignore-missing
seçeneğini geçerek yok sayabilirsiniz.
solidity-upgrade
, libsolidity
tabanlıdır ve kaynak dosyalarınızı ayrıştırabilir,
derleyebilir ve analiz edebilir ve içlerinde uygulanabilir kaynak yükseltmeleri bulabilir.
Kaynak yükseltmeleri, kaynak kodunuzda yapılan küçük metinsel değişiklikler olarak
kabul edilir. Bunlar, verilen kaynak dosyaların bellek içi gösterimine uygulanır.
İlgili kaynak dosyası varsayılan olarak güncellenir, ancak herhangi bir dosyaya
yazmadan tüm yükseltme işlemini simüle etmek için --dry-run
geçebilirsiniz.
Yükseltme işleminin iki aşaması vardır. İlk aşamada kaynak dosyalar ayrıştırılır
ve kaynak kodu bu seviyede yükseltmek mümkün olmadığından, hatalar toplanır ve
--verbose
geçilerek günlüğe kaydedilebilir. Bu noktada kaynak yükseltmesi mevcut
değildir.
İkinci aşamada, tüm kaynaklar derlenir ve tüm etkinleştirilmiş yükseltme analizi modülleri derleme ile birlikte çalıştırılır. Varsayılan olarak, mevcut tüm modüller etkinleştirilir. Daha fazla ayrıntı için lütfen available modules belgesini okuyun.
Bu, kaynak yükseltmeleri ile düzeltilebilecek derleme hatalarına neden olabilir. Hiçbir
hata oluşmazsa, hiçbir kaynak yükseltmesi bildirilmez ve işiniz biter. Hatalar oluşursa
ve bazı yükseltme modülleri bir kaynak yükseltmesi bildirirse, ilk bildirilen uygulanır
ve verilen tüm kaynak dosyaları için derleme yeniden tetiklenir. Kaynak yükseltmeleri
rapor edildiği sürece önceki adım tekrarlanır. Eğer hala hatalar oluşuyorsa, --verbose
komutunu geçerek bunları günlüğe kaydedebilirsiniz. Herhangi bir hata oluşmazsa, sözleşmeleriniz
günceldir ve derleyicinin en son sürümüyle derlenebilir.
Kullanılabilir Yükseltme Modülleri
Modül |
Versiyon |
Açıklama |
---|---|---|
|
0.5.0 |
Constructor’’lar artık |
|
0.5.0 |
Public fonksiyon görünürlüğü artık zorunlu,
varsayılan değer |
|
0.6.0 |
Bir sözleşme tüm fonksiyonlarını uygulamıyorsa
|
|
0.6.0 |
Bir arayüz dışında uygulaması olmayan
fonksiyonlar |
|
0.6.0 |
Bir fonksiyon veya modifier geçersiz kılınırken,
yeni |
|
0.7.0 |
Aşağıdaki sözdizimi kullanımdan kaldırılmıştır:
|
|
0.7.0 |
|
|
0.7.0 |
Constructor’ların görünürlüğünü kaldırır. |
Daha fazla ayrıntı için lütfen 0.5.0 release notes, 0.6.0 release notes, 0.7.0 release notes ve 0.8.0 release notes bölümlerini okuyun.
Özet bilgi(Synopsis)
Usage: solidity-upgrade [options] contract.sol
Allowed options:
--help Show help message and exit.
--version Show version and exit.
--allow-paths path(s)
Allow a given path for imports. A list of paths can be
supplied by separating them with a comma.
--ignore-missing Ignore missing files.
--modules module(s) Only activate a specific upgrade module. A list of
modules can be supplied by separating them with a comma.
--dry-run Apply changes in-memory only and don't write to input
file.
--verbose Print logs, errors and changes. Shortens output of
upgrade patches.
--unsafe Accept *unsafe* changes.
Hata Raporları / Özellik Talepleri
Bir hata bulduysanız veya bir özellik isteğiniz varsa, lütfen Github’da bir sorun gönderin.
Örnek
Source.sol
içinde aşağıdaki sözleşmeye sahip olduğunuzu varsayın:
pragma solidity >=0.6.0 <0.6.4;
// This will not compile after 0.7.0
// SPDX-License-Identifier: GPL-3.0
contract C {
// BENİDÜZELT: constructor görünürlüğünü kaldırın ve sözleşmeyi abstract hale getirin
constructor() internal {}
}
contract D {
uint time;
function f() public payable {
// BENİDÜZELT: now'u block.timestamp olarak değiştirin
time = now;
}
}
contract E {
D d;
// BENİDÜZELT: constructor görünürlüğünü kaldır
constructor() public {}
function g() public {
// BENİDÜZELT: .value(5) => {value: 5} olarak değiştirin
d.f.value(5)();
}
}
Gerekli Değişiklikler
Yukarıdaki sözleşme 0.7.0’dan itibaren derlenmeyecektir. Sözleşmeyi mevcut Solidity
sürümüyle güncel hale getirmek için aşağıdaki yükseltme modüllerinin çalıştırılması
gerekir: constructor-visibility
, now
ve dotsyntax
. Daha fazla ayrıntı için
lütfen available modules belgelendirmesini okuyun.
Yükseltmenin Çalıştırılması
Yükseltme modüllerinin --modules
argümanı kullanılarak açıkça belirtilmesi önerilir.
solidity-upgrade --modules constructor-visibility,now,dotsyntax Source.sol
Yukarıdaki komut aşağıda gösterildiği gibi tüm değişiklikleri uygular. Lütfen bunları dikkatlice inceleyin (pragmaların manuel olarak güncellenmesi gerekecektir).
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
abstract contract C {
// BENİDÜZELT: constructor görünürlüğünü kaldırın ve sözleşmeyi abstract hale getirin
constructor() {}
}
contract D {
uint time;
function f() public payable {
// BENİDÜZELT: now'u block.timestamp olarak değiştirin
time = block.timestamp;
}
}
contract E {
D d;
// BENİDÜZELT: constructor görünürlüğünü kaldır
constructor() {}
function g() public {
// FIXME: change .value(5) => {value: 5}
d.f{value: 5}();
}
}