Ini adalah versi revisi dari Original Complication panduan yang merinci penggunaan Monotone dalam pengembangan I2P. Untuk petunjuk dasar, lihat quick-start guide .

I2P memiliki model pengembangan terdistribusi. Kode sumber direplikasi di repositori Monotone ("MTN") yang dikelola secara independen. Pengembang dengan hak komit dapat mendorong perubahan mereka ke repositori (sebuah perjanjian lisensi perlu ditandatangani sebelum hak komit diberikan).

Beberapa kualitas penting Monotone adalah: terdistribusi kontrol versi, otentikasi kriptografi, kontrol akses, ukurannya yang kecil, hanya sedikit dependensi, penyimpanan proyek dalam file database SQLite terkompresi, dan memiliki kemampuan untuk melanjutkan usaha sinkronisasi yang terganggu.

Mengoperasikan Klien Monotone

Membuat Kunci Monotone

Kunci transport memberi anda kemampuan untuk mendorong perubahan anda ke server repositori Monotone. Untuk melakukan commit code ke Monotone (pada dasarnya menandatangani kode Anda), sebuah commit key juga diperlukan. Tidak ada server Monotone yang ada di I2P saat ini membutuhkan kunci untuk membaca (atau menarik) kode sumbernya.

Tanpa kunci transport, seseorang tidak bisa:

    • menarik kode dari server yang tidak mengizinkan global read access
    • mendorong kode ke server manapun
    • menjalankan server Monotone

    Tanpa commit key, seseorang tidak bisa:

      • komit kode apapun

      Jika anda hanya ingin mengambil kode dari MTN, silakan lompat ke bagian selanjutnya Jika anda ingin menghasilkan kunci, baca berikut ini.

      Sesuai konvensi, kunci diberi nama seperti alamat e-mail, namun e-mail yang sesuai tidak perlu ada Misalnya, kunci anda mungkin diberi nama:

      • yourname@mail.i2p
      • yourname-transport@mail.i2p

      Monotone menyimpan kunci di bawah $HOME/.monotone/keys pada file teks yang diberi nama identik dengan kuncinya. Contohnya:

      • /home/complication/.monotone/keys/complication@mail.i2p

      Untuk menghasilkan kunci transportasi dan komit, masukkan perintah berikut pada sebuah prompt:

      • $ mtn genkey yourname-transport@someplace
      • $ mtn genkey yourname@someplace

      Monotone akan meminta password untuk melindungi kunci Anda. Anda sangat dianjurkan untuk menyetel password untuk commit key. Banyak pengguna akan membiarkan password kosong untuk kunci transport, terutama yang menjalankan Server monotone.

      Memberi kepercayaan dan inisialisasi repositori anda

      Model keamanan monotone membantu untuk memastikan bahwa tak seorang pun dapat dengan mudah meniru pengembang tanpa diketahui. Karena para pengembang dapat membuat kesalahan dan menjadi bocor identitasnya, hanya manual review dapat memastikan kualitas kode. Model kepercayaan monotone akan memastikan bahwa anda membaca diffs tepat. Ini tidak menggantikan pembacaan diffs.

      Repositori monotone adalah sebuah file tunggal (database SQLite terkompresi) yang berisi semua kode sumber proyek dan sejarah.

      Setelah mengimpor kunci para pengembang ke Monotone dan menyiapkan trust evaluation hook, Monotone akan mencegah kode yang tidak dipercaya diperiksa ke dalam workspace anda. Ada beberapa perintah yang tersedia untuk membersihkan kode yang tidak dipercaya dari workspace anda tetapi dalam praktiknya mereka sudah tidak diperlukan karena kebijakan akses push diterapkan.

      Repositori bisa memiliki banyak cabang. Sebagai contoh, repositori kami memiliki beberapa cabang utama:

      • i2p.i2p — I2P router dan program-program terkait
      • i2p.www — Website proyek I2P proyek
      • i2p.syndie — Syndie, alat forum terdistribusikan

      Sesuai dengan konvensi, repositori I2P monotone dinamai i2p.mtn . Sebelum menarik kode sumber dari server, database untuk repositori anda akan perlu diinisialisasi. Untuk menginisialisasi repositori lokal, Ubah ke dalam direktori yang anda inginkan i2p.mtndirektori file dan cabang disimpan dan melakukan perintah:

      • $ mtn --db="i2p.mtn" db init

      Mendapatkan dan menerapkan kunci pengembang

      Kunci yang digunakan oleh pengembang untuk melakukan commit code sangat penting bagi kepercayaan evaluasi di Monotone. Transport key milik para pengembang lain hanya diperlukan untuk operator server monotone.

      Commit key milik pengembang disediakan GPG-signed pada halaman lain.

      Untuk mengimpor kunci pengembang setelah memverifikasi keaslian mereka, salin semua kunci ke file yang baru. Buat file ini (misalnya keys.txt ) di direktori yang sama di mana i2p.mtn berada. Impor key-nya dengan perintah:

      • $ mtn --db="i2p.mtn" read < keys.txt

      Catatan: jangan menambahkan kunci $HOME/.monotone/keys secara manual.

      Menyiapkan trust evaluation hooks

      Kebijakan kepercayaan monotone default terlalu lemah untuk persyaratan kami: setiap commit dipercaya secara default. Ini tidak bisa diterima di pengembangan I2P.

      Ubahan ke direktori $HOME/.monotone lalu buka file monotonercdengan text editor. Copy dan paste kedua fungsi ini ke dalam file ini:

      -- This implements a list of trusted signers.
      -- It is used on checkout and update.
      -- It is not used for repo sync/push/pull.
      -- If you do not include this function in ~/.monotone/monotonerc, the
      -- default is to trust everybody, which is probably a bad thing
      -- in an anonymous network.
      -- Update the list below to reflect the signers YOU trust.
      --
      -- ref: http://www.monotone.ca/docs/Trust-Evaluation-Hooks.html
      -- Modified to use key identities instead of key names, since
      -- monotone allows duplicate key names, so any key-name-based
      -- trust system is insecure.
      
      --
      --  Modified from intersection() to use key identities instead of key names, since
      --  monotone allows duplicate key names.
      --
      --  a: table of ID structures (see above)
      --  b: table of hex IDs
      --
      function keyintersection(a,b)
          local s={}
          local t={}
          for k,v in pairs(a) do s[v.id] = 1 end
          for k,v in pairs(b) do if s[v] ~= nil then table.insert(t,v) end end
          return t
      end
      
      --
      -- from mtn source project.hh and lua_hooks.cc:
      -- signers is a table of integers (starting with 1) to the following ID structure:
      -- struct ID
      -- {
      --   id: (key_id in key_identity_info) hex of revision id hash;
      --   given_name: (given_name in key_identity_info) // name given when creating the key
      --   name: (official_name in key_identity_info) // name returned by hooks or (once implented) policy
      -- };
      -- id: hex of revision id hash;
      -- name: cert_name
      -- val: cert_value
      --
      function get_revision_cert_trust(signers, id, name, val)
         local trusted_signers = {
      		"5bc185cfd680eb512fdb9626b9fb4298e136215e",	--  BlubMail@mail.i2p
      		"f6706ac205e6b5d7a7e3ea4244ab0ef497f0a099",	--  cervantes@mail.i2p
      		"690f278ff6c6157cbaf23b0d602b6d6dcf368313",	--  complication@mail.i2p
      		"eb4ac08d5ddbb2bd73889f86c1211424025a6f07",	--  dev@robertfoss.se
      		"aae785027c240ebbb0a883fd8ebcf8d6ecee4104",	--  dev@welterde.de
      		"86478595288d1b96b58f0c8cd8a8971bc430f8fd",	--  dg2@mail.i2p
      		-- completed dev agreement 2013-07 but never checked in anything
      		--"5f75b8f0769770edc3267c21ddc9a00ddae31394",	--  digit@mail.i2p
      		"4ebaace9973913416af92ee8d0fb93d64753df4c",	--  dream@mail.i2p
      		"7e498ae94c9c322404adfc61b16bed388095906b",	--  duck@mail.i2p
      		"6c728b0ffed3c2bf7fb0f3c583b30f966d9bacd5",	--  echelon2@mail.i2p
      		"0e4e7ebebafbdf4cdacc45a47ba155b1215d8e8b",	--  forget@mail.i2p
      		"f332b3d3b11b2efdae220cea75b9d5ba9ec3b52d",	--  hamada@mail.i2p
      		"e246444b4fe69ba599e13403c4ab931066de902f",	--  hiddenz@mail.i2p
      		"a61146ee69ddb9fcf3b82b19a62b8114b60d367e",	--  HungryHobo@mail.i2p
      		"4844b1fd45f5a68744fa28d2f3e3b61a3cf83b95",	--  kytv@mail.i2p
      		"6b2acfc9fe2f69b796631a514660fd7bdd237e2d",	--  laziestgravy@mail.i2p
      		"c9b970f5e8917eada663d4c6b22096617021c95c",	--  m1xxy@mail.i2p
      		"3be64909d6ab7c3d7afe16f20f24e672708b576b",	--  magma@mail.i2p
      		"2977a6f4e11819a3f928783175caadc0071fc4de",	--  mathiasdm@mail.i2p
      		"de9d196e8057e1629178edbfa1ed754c648d7340",	--  meeh@mail.i2p
      		"2a0bba98558d7a9d7e4b1bd807789601252c0024",	--  mkvore-commit@mail.i2p
      		"6ade4b7a9a6425194f482ab351950e4230dbbc85",	--  neutron@mail.i2p
      		"bc74b49fd8a20513b2745a3d13414b7e9818dd18",	--  Oldaris@mail.i2p
      		"3fb8d1ee1e82981a8076ddbcbf4d18f372b8bba7",	--  privateer@mail.i2p
      		"e3815f0c985663182534fbd7d6a2bf93204a0bd0",	--  russiansponsor@mail.i2p
      		"2ef1ae1e73a30e1afc0b4a7af89b4380b3dd46b7",	--  slumlord@mail.i2p
      		"1092773c40f5813b9179d52a8ab7b499b9554da3",	--  sponge@mail.i2p
      		"01265f0c817b24548478341fb75e672720a78b21",	--  str4d@mail.i2p
      		"38fe2aa37e1eb9a300a2061ef153265c48031c6b",	--  walking@mail.i2p
      		"a0eb78d437efad120dd9edcd776a327ec2c2adde",	--  zab@mail.i2p
      		"2158706490e62a17c8140b6e9eabca965b681bc7",	--  zab2@mail.i2p
      		"56810cd6434ab33593260e188b32bb83e4e9a139",	--  z3r0fox@mail.i2p
      		"896e399990704373125f782ae2ee19b6611ac612"	--  zzz@mail.i2p
         }
         local t = keyintersection(signers, trusted_signers)
         if t == nil then return false end
         if #t>= 1 then return true end
         return false
      end
      

      Fungsi pertama menentukan persimpangan antara dua set, di dalam kasus kita revision's signers dan trusted signers.

      Fungsi kedua menentukan kepercayaan dalam revisi tertentu, dengan memanggil fungsi dengan "signers" dan "trusted" sebagai argument. Jika persimpangannya bernilai null, revisi tidak dapat dipercaya. Jika persimpangannya tidak kosong, revisi dapat dipercaya. Jika tidak, revisinya tidak terpercaya.

      Informasi lebih lanjut tentang Trust Evaluation Hooks dapat ditemukan dalam dokumentasi resmi monotone.

      Menarik cabang i2p.i2p , i2p.www dan i2p.syndie

      I2P disebarkan dengan tunnel yang dikonfigurasi untuk menunjuk ke server Monotone milik proyek I2P. Pastikan bahwa tunnel telah dimulai di dalam I2PTunnel sebelum mencoba menarik source code dari 127.0.0.1:8998.

      Masukkan direktori di mana Anda menginisialisasi i2p.mtn . Tergantung apakah anda hanya ingin sumber kode I2P atau juga sumber kode untuk situs I2P atau Syndie, anda dapat melakukan operasi pull dengan cara yang berbeda.

      Jika Anda hanya ingin source code I2P:

      • $ mtn --db="i2p.mtn" -k "" pull "mtn://127.0.0.1:8998?i2p.i2p"

      Jika anda ingin semua cabang:

      • $ mtn --db="i2p.mtn" -k "" pull "mtn://127.0.0.1:8998?i2p.*"
      Jika transfer berhenti sebelum sampai tuntas, ulangi saja perintah pull untuk melanjutkan transfer.

      Melakukan pulling seperti contoh di atas dilakukan secara anonim dengan menspesifikasikan transport key kosong. Jika semua orang menarik secara anonim akan lebih sulit bagi penyerang yang meraih kendali atas server untuk secara selektif memberikan data yang dimodifikasi ke beberapa orang.

      Memastikan bahwa evaluasi kepercayaan berfungsi

      Untuk memverifikasi bahwa evaluasi kepercayaan berfungsi:

      • Buat cadangan file monotonerc anda.
      • Modifikasi monotonerc dengan menetapkan variabel trusted_signers dengan cara berikut:
               local trusted_signers = {}
          
      • Dengan monotonerc dikonfigurasikan seperti di atas, Monotone tidak akan lagi mempercayai semua pihak. Konfirmasikan ini dengan mengubah ke direktori tempat i2p.mtn dibuat dan mencoba checkout cabang I2P:
        • $ mtn --db="i2p.mtn" co --branch="i2p.i2p"

        Sebuah direktori bernama i2p.i2p seharusnya tidak muncul. Anda seharusnya menjumpai banyak pesan error seperti:

            mtn: warning: trust function disliked 1 signers
            of branch cert on revision 523c15f6f50cad3bb002f830111fc189732f693b
            mtn: warning: trust function disliked 1 signers
            of branch cert on revision 8ac13edc2919dbd5bb596ed9f203aa780bf23ff0
            mtn: warning: trust function disliked 1 signers
            of branch cert on revision 8c4dd8ad4053baabb102a01cd3f91278142a2cd1
            mtn: misuse: branch 'i2p.i2p' is empty
          

        Jika anda puas dengan hasilnya, restore backup-nya monotonerc yang dibuat di atas. Jika anda tidak membuat backup seperti yang disarankan, baca kembali Menyiapkan trust evaluation hooks .

        Periksa wroking copy dari versi terbaru

        Jika sebuah cabang sudah di-check out, lompat ke berikutnya bagian.

        Ubah ke direktori tempat i2p.mtn berada. Di sana lakukan hal ini:

        • $ mtn --db="i2p.mtn" co --branch="i2p.i2p"

        Checkout seharusnya selesai tanpa pesan error dan sebuah direktori bernama i2p.i2p seharusnya muncul di direktori saat ini. Selamat! Anda telah berhasil checkout source code I2P terbaru, siap untuk dikompilasi.

        Perbarui working copy anda ke versi terbaru

        Jika anda belum melakukan ini, tarik kode dari server ke server lokal anda Repository Monotone. Untuk mencapai hal ini, ganti ke direktori di mana i2p.mtn berada dan lakukan perintah:

        • $ mtn --db="i2p.mtn" -k "" pull "mtn://127.0.0.1:8998?i2p.i2p"

        Sekarang ganti ke direktori i2p.i2p anda, dan di sana lakukan perintah:

        • $ mtn update

        Selama tidak ada error … Selamat! Anda telah berhasil update ke source code I2P terbaru. Kode tersebut seharusnya siap dikompilasi

        Mengoperasikan Server Monotone

        Mendapatkan dan menerapkan transport key milik pengembang

        Sebagai operator server, anda mungkin ingin memberikan akses push ke pengembang tertentu.

        Memberikan akses push dan pull

        Secara default, server Monotone menolak semua akses.

        Untuk memberikan akses pull ke semua klien, tetapkan hal berikut di $HOME/.monotone/read-permissions:

            pattern "*"
            allow "*"
        

        Tidak ada yang tidak dapat mendorong kode ke server anda tanpa izin diberikan secara eksplisit. Memberikan akses push:

        • Tambahkan nama transport key milik pengguna ke $HOME/.monotone/write-permissions , seperti
              zzz-transport@mail.i2p 
              complication-transport@mail.i2p
          
          satu key per baris.
        • Impor transport key ke database anda. Prosedur untuk mengimpor transportasi key sama dengan mengimpor commit key yang dijelaskan di bagian Memperoleh dan menerapkan kunci pengembang .

        Menjalankan Monotone d dalam mode server

        Database terpisah harus digunakan untuk server Monotone anda karena monotone akan mengunci database saat disajikan kepada orang lain. Buat salinan database pengembangan anda, lalu mulai server dengan:

        • $ mtn serve --bind="127.0.0.1:8998" --db="i2p.mtn" --key "myserver-transport@mail.i2p"
        Jika kunci anda dilindungi dengan passphrase, Monotone mungkin meminta passphrase saat klien pertama terhubung Anda bisa mengatasinya dengan menghubungkan koneksi klien pertama ke server Anda (atau dengan menghapus password dari transport key anda).

        Supaya server anda agar dapat diakses orang lain dengan I2P, anda akan perlu untuk membuat server tunnel untuk itu. Gunakan jenis tunnel profil "Standar" dan "Bulk".

        Perbedaan di dalam Debian GNU / Linux

        Debian (dan distro lain) telah mengintegrasi Monotone ke framework dari daemons/services mereka. Walau server Monotone masih dapat dijalankan dengan "cara yang biasa" pada sistem Debian, melakukan hal itu "Debian way" mungkin lebih mudah.

        Permission diberikan dengan mengedit file /etc/monotone/read-permissions dan /etc/monotone/write-permissions. Anda juga perlu mengedit /etc/default/monotone untuk membuat monotone dimulai secara otomatis saat boot atau untuk menyesuaikan host, port, atau lokasi database.