**Apa yang dimaksud dengan kontrak yang telah dikompilasi? **
Kontrak yang telah dikompilasi adalah metode kompromi yang digunakan dalam EVM untuk menyediakan fungsi pustaka yang lebih kompleks (biasanya digunakan untuk operasi kompleks seperti enkripsi dan hashing). Ini juga dapat dipahami sebagai kontrak khusus, dan fungsi ini tidak cocok untuk menulis opcode. Mereka cocok untuk kontrak yang sederhana tetapi sering digunakan, atau kontrak yang ditetapkan secara logis tetapi intensif secara komputasi. Kontrak yang telah dikompilasi diimplementasikan menggunakan kode klien node, dan karena tidak memerlukan EVM, kontrak berjalan dengan cepat. Ini juga lebih murah bagi pengembang daripada menggunakan fungsi yang berjalan langsung di EVM.
Seperti dapat dilihat dari kode berikut, fungsi run dalam kontrak evm.go memiliki dua cabang: cabang pertama adalah membuat instance parameter indeks melalui indeks yang telah dikompilasi untuk menentukan kontrak yang telah dikompilasi, dan cabang kedua adalah untuk menentukan kontrak yang telah dikompilasi. kontrak jika itu bukan kontrak yang telah dikompilasi EVM itu akan dipanggil.
// run menjalankan kontrak yang diberikan dan menangani menjalankan prekompilasi dengan fallback ke penerjemah kode byte.
func run(evm *EVM, contract *Contract, input []byte, readOnly bool) ([]byte, error) {
jika contract.CodeAddr != nil {
precompiles := PrecompiledContractsHomestead
if evm.ChainConfig().IsByzantium(evm.BlockNumber) {
precompiles = PrecompiledContractsByzantium
}
if p := prekompilasi[*contract.CodeAddr]; p != nihil {
kembalikan RunPrecompiledContract(p, masukan, kontrak)
}
}
untuk _, interpreter := range evm.interpreters {
if interpreter.CanRun(contract.Code) {
if evm.interpreter != juru bahasa {
// Pastikan penunjuk juru bahasa diatur kembali
// ke nilai saat ini saat kembali.
tunda func(i Penerjemah) {
evm.interpreter = i
}(evm.interpreter)
evm.interpreter = penerjemah
}
return interpreter.Run(contract, input, readOnly)
}
}
mengembalikan nihil, ErrNoCompatibleInterpreter
}
Jika dinyatakan secara grafis, logika spesifiknya adalah sebagai berikut:
Jadi, di manakah hambatan dari kontrak yang telah dikompilasi sebelumnya?
Ethereum saat ini memiliki delapan kontrak yang telah dikompilasi:
ECRecover - Pulihkan alamat yang sesuai melalui tanda tangan
SHA256 - Menghitung hash SHA256
RIPEMD160 - Hitung hash RIPEMD160
Identitas - mengembalikan nilai asli dari data input
ModExp - Melakukan Eksponensial Modulo
ECAdd - Penambahan Titik Kurva Eliptik
ECMul - Perkalian Titik Kurva Eliptik
ECPairing - operasi pemasangan, memverifikasi titik kurva elips
Anda dapat melihat bahwa kontrak terkompilasi pertama hingga keempat menyediakan tanda tangan dasar, hash, dan fungsi enkripsi lainnya, dan kontrak kelima hingga kedelapan menyediakan operasi kurva eliptik, yang terkait dengan zk-snark.
Jadi pertanyaannya adalah, mengapa prekompilasi Ethereum hanya mendukung delapan kontrak yang telah dikompilasi? Bukankah kontrak yang telah dikompilasi mengurangi konsumsi gas? Dan mengapa tidak langsung menanamkan ECS (kerangka dari keseluruhan rantai permainan) ke dalam kontrak Ethereum yang telah dikompilasi sebelumnya?
Sebenarnya, ada tiga alasan utama:
Ketergantungan yang berlebihan pada kontrak yang telah dikompilasi akan mengurangi tingkat desentralisasi seluruh platform:
Pertama-tama, kode kontrak yang telah dikompilasi perlu diintegrasikan ke dalam kode node klien, yang meningkatkan kompleksitas klien. Kedua, node verifikasi dapat menyaring perhitungan kontrak yang telah dikompilasi untuk alasan keamanan, sehingga sebagian besar permintaan untuk kontrak yang telah dikompilasi diselesaikan oleh node penuh. Saat ini, hanya ada 4000-6000 node penuh Ethereum di dunia, dan Ada 500.000 verifikasi node, yang memang jauh lebih terpusat daripada kontrak yang tidak dikompilasi sebelumnya.
Penambahan dan modifikasi kontrak yang telah dikompilasi membutuhkan peningkatan hard fork, yang tidak mudah untuk dikembangkan secara fleksibel.
Dukungan untuk kontrak yang telah dikompilasi memerlukan proses EIP. Sebagai contoh: EIP-196 menambahkan dua kontrak yang telah dikompilasi, ECADD() dan ECMUL(), pada kurva alt_bn128. EIP-197 menambahkan fungsi Pairing pada kurva alt_bn128. Pada dasarnya, ini untuk membuat privasi tersedia di Ethereum untuk mendapatkan dukungan, dan seluruh proses EIP panjang dan elegan, dan menunggu EIP berlalu bukanlah masalah yang realistis.
Sulit untuk berinteraksi dan menggabungkan kontrak yang telah dikompilasi, dan skalabilitasnya buruk.
Ini tidak banyak untuk dijelaskan, ini sangat intuitif.
Peran apa yang dimainkan oleh kontrak yang telah dikompilasi di seluruh permainan berantai?
Kontrak yang telah dikompilasi melewatkan EVM dan mengeksekusi langsung melalui node, yang dapat meningkatkan efisiensi komputasi, tetapi pada saat yang sama mengurangi tingkat desentralisasi seluruh rantai. Prekompilasi logika inti dari game yang sering digunakan dapat mengoptimalkan performa game tersebut. Jenis permainan yang berbeda memiliki logika kunci yang berbeda. Oleh karena itu, untuk rantai khusus dari jenis permainan tertentu, desain prakompilasinya dapat sangat mengoptimalkan kebutuhan jenis permainan ini. Selama proses iterasi game, kombinasi kontrak terkompilasi yang paling efisien akan dioptimalkan secara bertahap.
Lihat Asli
Halaman ini mungkin berisi konten pihak ketiga, yang disediakan untuk tujuan informasi saja (bukan pernyataan/jaminan) dan tidak boleh dianggap sebagai dukungan terhadap pandangannya oleh Gate, atau sebagai nasihat keuangan atau profesional. Lihat Penafian untuk detailnya.
Full Chain Game 101: Kontrak yang Telah Dikompilasi
**Apa yang dimaksud dengan kontrak yang telah dikompilasi? **
Kontrak yang telah dikompilasi adalah metode kompromi yang digunakan dalam EVM untuk menyediakan fungsi pustaka yang lebih kompleks (biasanya digunakan untuk operasi kompleks seperti enkripsi dan hashing). Ini juga dapat dipahami sebagai kontrak khusus, dan fungsi ini tidak cocok untuk menulis opcode. Mereka cocok untuk kontrak yang sederhana tetapi sering digunakan, atau kontrak yang ditetapkan secara logis tetapi intensif secara komputasi. Kontrak yang telah dikompilasi diimplementasikan menggunakan kode klien node, dan karena tidak memerlukan EVM, kontrak berjalan dengan cepat. Ini juga lebih murah bagi pengembang daripada menggunakan fungsi yang berjalan langsung di EVM.
Seperti dapat dilihat dari kode berikut, fungsi run dalam kontrak evm.go memiliki dua cabang: cabang pertama adalah membuat instance parameter indeks melalui indeks yang telah dikompilasi untuk menentukan kontrak yang telah dikompilasi, dan cabang kedua adalah untuk menentukan kontrak yang telah dikompilasi. kontrak jika itu bukan kontrak yang telah dikompilasi EVM itu akan dipanggil.
// run menjalankan kontrak yang diberikan dan menangani menjalankan prekompilasi dengan fallback ke penerjemah kode byte. func run(evm *EVM, contract *Contract, input []byte, readOnly bool) ([]byte, error) { jika contract.CodeAddr != nil { precompiles := PrecompiledContractsHomestead if evm.ChainConfig().IsByzantium(evm.BlockNumber) { precompiles = PrecompiledContractsByzantium } if p := prekompilasi[*contract.CodeAddr]; p != nihil { kembalikan RunPrecompiledContract(p, masukan, kontrak) } } untuk _, interpreter := range evm.interpreters { if interpreter.CanRun(contract.Code) { if evm.interpreter != juru bahasa { // Pastikan penunjuk juru bahasa diatur kembali // ke nilai saat ini saat kembali. tunda func(i Penerjemah) { evm.interpreter = i }(evm.interpreter) evm.interpreter = penerjemah } return interpreter.Run(contract, input, readOnly) } } mengembalikan nihil, ErrNoCompatibleInterpreter }
Jika dinyatakan secara grafis, logika spesifiknya adalah sebagai berikut:
Jadi, di manakah hambatan dari kontrak yang telah dikompilasi sebelumnya?
Ethereum saat ini memiliki delapan kontrak yang telah dikompilasi:
Anda dapat melihat bahwa kontrak terkompilasi pertama hingga keempat menyediakan tanda tangan dasar, hash, dan fungsi enkripsi lainnya, dan kontrak kelima hingga kedelapan menyediakan operasi kurva eliptik, yang terkait dengan zk-snark.
Jadi pertanyaannya adalah, mengapa prekompilasi Ethereum hanya mendukung delapan kontrak yang telah dikompilasi? Bukankah kontrak yang telah dikompilasi mengurangi konsumsi gas? Dan mengapa tidak langsung menanamkan ECS (kerangka dari keseluruhan rantai permainan) ke dalam kontrak Ethereum yang telah dikompilasi sebelumnya?
Sebenarnya, ada tiga alasan utama:
Pertama-tama, kode kontrak yang telah dikompilasi perlu diintegrasikan ke dalam kode node klien, yang meningkatkan kompleksitas klien. Kedua, node verifikasi dapat menyaring perhitungan kontrak yang telah dikompilasi untuk alasan keamanan, sehingga sebagian besar permintaan untuk kontrak yang telah dikompilasi diselesaikan oleh node penuh. Saat ini, hanya ada 4000-6000 node penuh Ethereum di dunia, dan Ada 500.000 verifikasi node, yang memang jauh lebih terpusat daripada kontrak yang tidak dikompilasi sebelumnya.
Dukungan untuk kontrak yang telah dikompilasi memerlukan proses EIP. Sebagai contoh: EIP-196 menambahkan dua kontrak yang telah dikompilasi, ECADD() dan ECMUL(), pada kurva alt_bn128. EIP-197 menambahkan fungsi Pairing pada kurva alt_bn128. Pada dasarnya, ini untuk membuat privasi tersedia di Ethereum untuk mendapatkan dukungan, dan seluruh proses EIP panjang dan elegan, dan menunggu EIP berlalu bukanlah masalah yang realistis.
Ini tidak banyak untuk dijelaskan, ini sangat intuitif.
Peran apa yang dimainkan oleh kontrak yang telah dikompilasi di seluruh permainan berantai?
Kontrak yang telah dikompilasi melewatkan EVM dan mengeksekusi langsung melalui node, yang dapat meningkatkan efisiensi komputasi, tetapi pada saat yang sama mengurangi tingkat desentralisasi seluruh rantai. Prekompilasi logika inti dari game yang sering digunakan dapat mengoptimalkan performa game tersebut. Jenis permainan yang berbeda memiliki logika kunci yang berbeda. Oleh karena itu, untuk rantai khusus dari jenis permainan tertentu, desain prakompilasinya dapat sangat mengoptimalkan kebutuhan jenis permainan ini. Selama proses iterasi game, kombinasi kontrak terkompilasi yang paling efisien akan dioptimalkan secara bertahap.