top of page
  • תמונת הסופר/תRon

ביטקוין: מערכת שיתופית לכסף אלקטרוני

מה זה ביטקוין? BTC, איך הוא עובד, מה נמצא מאחוריו ולמה אנשים קונים אותו?

תשובות לכל השאלות תמצאו במאמר הבא.



בקצרה, גרסה שיתופית לחלוטין של כסף אלקטרוני תאפשר לשלוח תשלומים מקוונים

ישירות מצד אחד לשני מבלי לעבור דרך מוסד כספי. חתימות דיגיטליות מהוות חלק

מהפיתרון, אולם עיקר התועלת תאבד אם צד שלישי נאמן עדיין דרוש כדי למנוע ניצול

כפול. אנו מציעים פיתרון לבעיית הניצול הכפול המשתמש ברשת שיתופית. הרשת מייצרת

חותמות זמן עבור פעולות על ידי גיבובן לשרשרת מתמשכת של הוכחת עבודה, ובכך

מנהלת רישום שאינו נתון לשינוי ללא שחזור הוכחת העבודה. השרשרת הארוכה ביותר

משמשת לא רק כהוכחה של סדר האירועים שנצפו, אלא גם הוכחה שהיא הגיעה מהריכוז

הגדול ביותר של כוח חישובי. כל עוד מרבית כוח החישוב נשלט על ידי צמתים שאינם

משתפים פעולה כדי לתקוף את הרשת, הם ייצרו את השרשרת הארוכה ביותר ויעלו בקצב

על תוקפים. הרשת עצמה דורשת מבנה מזערי. הודעות מופצות על בסיס מיטב המאמצים,

וצמתים יכולים לעזוב את הרשת ולהצטרף אליה כרצונם, ולקבל את שרשרת הוכחת

העבודה הארוכה ביותר כהוכחה של מה שקרה בזמן היעדרותם.


1. מבוא לקריפטו

מסחר באינטרנט כיום מסתמך באופן כמעט בלעדי על מוסדות כספיים המשמשים כצד שלישי נאמן

לעיבוד תשלומים אלקטרוניים. המערכת עובדת באופן משביע רצון עבור רוב העסקאות, אך עם זאת,

היא עדיין סובלת מהחולשות הטבועות במודל מבוסס האמון. פעולות שהן לחלוטין בלתי-ניתנות

לביטול אינן באמת אפשריות, מכיוון שהמוסד הכספי אינו יכול להימנע מגישור מחלוקות. עלות

הגישור מעלה את עלויות הפעולה, מה שמגביל את הגודל המעשי המזערי לעסקה ומונע את האפשרות

לעסקאות אגביות קטנות, ויש עלות רחבה יותר באובדן היכולת לבצע תשלומים בלתי-ניתנים לביטול

עבור שירותים בלתי-ניתנים לביטול. האפשרות לביטול מרחיבה את הצורך באמון. סוחרים חייבים

להיזהר מלקוחותיהם, ולהטריח אותם לספק יותר מידע מאשר היה נחוץ אחרת. הם משלימים בלית

ברירה עם אחוז מסוים של הונאה, הנתפש כבלתי-נמנע. ניתן להימנע מהעלויות האלו ומחוסר

הוודאות בתשלומים על ידי שימוש במטבע גשמי, אך אין בנמצא מנגנון לבצע תשלומים על גבי ערוץ

תקשורת ללא צד נאמן.

נחוצה מערכת תשלומים אלקטרוניים המבוססת על הוכחה קריפטוגרפית במקום אמון,

המאפשרת לכל שני צדדים החפצים בדבר לבצע פעולה זה עם זה באופן ישיר ללא צורך בצד שלישי

נאמן. פעולות שמבחינה חישובית אין זה מעשי להפוך אותן יגנו על מוכרים מפני הונאה, וניתן בקלות

לממש מנגנוני השלשה שגרתיים בכדי להגן על קונים. במאמר זה, אנו מציעים פיתרון לבעיית הניצול

הכפול המשתמש בשרת חותמות-זמן שיתופי מבוזר בשביל ליצור הוכחה חישובית של הסדר

הכרונולוגי של פעולות. המערכת בטוחה כל עוד הצמתים הישרים שולטים יחד ביותר עוצמת חישוב

מכל קבוצת צמתים תוקפים המשתפים פעולה.


2. פעולות

אנו מגדירים מטבע אלקטרוני כשרשרת של חתימות דיגיטליות. כל בעלים מעביר את המטבע לבא

הקודמת והמפתח הציבורי של (transaction) של הפעולה (Hash) אחריו על ידי חתימת גיבוב

הבעלים הבאים, והוספת אלו לסוף המטבע. מקבל תשלום יכול לאמת את החתימות בכדי לוודא את

שרשרת הבעלות

הבעיה היא כמובן שמקבל התשלום אינו יכול לודא שאף אחד מהבעלים לא שילם באמצעות המטבע

פיתרון נפוץ הוא להכניס סמכות מרכזית הזוכה לאמון, .(double-spend , פעמיים (ניצול כפול

מטבעה, שבודקת כל פעולה כנגד ניצול כפול. לאחר כל פעולה, המטבע חייב לחזור אל המטבעה כדי

להנפיק מטבע חדש, ורק על מטבעות שהונפקו ישירות מהמטבעה סומכים שלא עברו ניצול כפול.

הבעיה בפיתרון זה הוא שהגורל של המערכת הכספית בכללותה תלוי בחברה המפעילה את המטבעה,

היות וכל פעולה חייבת לעבור דרכם, בדיוק כמו בבנק.

אנו זקוקים לדרך בה מקבל התשלום יוכל לדעת שהבעלים הקודמים לא חתם על אף פעולה

מוקדמת יותר. לצרכים שלנו, הפעולה המוקדמת ביותר היא הקובעת, כך שאיננו דואגים מנסיונות

מאוחרים יותר לניצול כפול. הדרך היחידה לאשר את העדר פעולה היא להיות מודע לכל הפעולות.

במודל מבוסס המטבעה, המטבעה מודעת לכל הפעולות ומחליטה איזו הגיעה קודם. כדי להשיג זאת

ללא צד נאמן, חובה להכריז על פעולות באופן פומבי [ 1], ונחוצה מערכת להסכמה בין משתתפים לגבי

היסטוריה יחידה של הסדר בו הן התקבלו. מקבל התשלום זקוק להוכחה שבזמן בו כל פעולה

התבצעה, רוב הצמתים הסכימו כי היא היתה הראשונה שהתקבלה.


3. שרת חותמות זמן

שרת חותמות-זמן .(timestamp server) הפיתרון אותו אנו מציעים מתחיל עם שרת חותמות-זמן

של פריטים הזקוקים לחותמת זמן והפצתו באופן נרחב, (block) פועל על ידי לקיחת גיבוב של גוש

ראה [ 2-5 ]). חותמת הזמן מוכיחה שבהכרח הנתונים היו קיימים באותו ) Usenet- למשל בעיתון או ב

זמן, אחרת לא היו יכולים להיות כלולים בגיבוב. כל חותמת-זמן מכילה את חותמת-הזמן הקודמת

בגיבוב שלה, מה שיוצר שרשרת בה כל חותמת-זמן נוספת מתגברת את אלו שבאו לפניה.

4. הוכחת עבודה

בכדי לממש שרת חותמות-זמן על בסיס שיתופי (Proof-of-work) , אנו נצטרך מערכת הוכחת עבודה

הוכחת העבודה כרוכה .Usenet- של אדם בק [ 6], במקום פרסומים בעיתון או ב Hashcash- בדומה ל

הגיבוב מתחיל במספר מסוים של ,SHA-256 בחיפוש אחר ערך שכאשר הוא עובר גיבוב, למשל עם

סיביות אפס. הכמות הממוצעת של העבודה הדרושה היא מעריכית במספר סיביות האפס הדרושות,

והיא יכולה להתאמת תוך ביצוע גיבוב בודד.

בשביל רשת חותמות-הזמן שלנו, אנו מממשים את הוכחת העבודה על ידי הגדלת מספר חד-פעמי

בגוש עד שנמצא ערך המעניק לגיבוב של הגוש את המספר הדרוש של סיביות אפס. לאחר (nonce)

שהמאמץ החישובי הושקע בשביל לגרום לגוש לספק את הוכחת העבודה, לא ניתן לשנות אותו מבלי

לבצע את העבודה מחדש. מאחר וגושים מאוחרים יותר משורשרים אחריו, העבודה הדרושה כדי

לשנות גוש תכלול ביצוע מחדש של כל הגושים שלאחריו.

הוכחת העבודה גם פותרת את בעיית קביעת הייצוג בקבלת החלטות מבוססת רוב. אם הרוב היה

כל מי שמסוגל להקצות כתובות רבות היה יכול לחתור תחתיו. ,"IP מבוסס על "קול לכל כתובת

הוכחת עבודה היא למעשה "קול לכל מעבד". החלטת הרוב מיוצגת על ידי השרשרת הארוכה ביותר,

בה מושקע מאמץ הוכחת העבודה הרב ביותר. אם רוב עוצמת החישוב נשלטת על ידי צמתים ישרים,

השרשרת הישרה תצמח בקצב המהיר ביותר ותשיג כל שרשרת מתחרה. בכדי לשנות גוש מהעבר,

תוקף יצטרך לבצע מחדש את הוכחת העבודה של הגוש וכל הגושים לאחריו, ואז להדביק את הפער

ולעלות על העבודה של הצמתים הישרים. מאוחר יותר נראה שההסתברות שתוקף איטי יותר ידביק

את הפער קטנה באופן מעריכי ככל שגושים עוקבים מתווספים.

בכדי לפצות על הגדילה במהירות החומרה והשתנות ברמת העניין בהפעלת צמתים לאורך זמן,

דרגת הקושי של הוכחת העבודה נקבעת על ידי ממוצע נע השם למטרה מספר ממוצע מסוים של

גושים לשעה. אם הם נוצרים מהר מדי, דרגת הקושי עולה.


5. רשת

השלבים בהפעלת הרשת הם כדלקמן:

1) פעולות חדשות משודרות לכל הצמתים.

2) כל צומת אוסף פעולות חדשות לתוך גוש.

3) כל צומת עובד על מציאת הוכחת עבודה קשה לגוש שלו.

4) כשצומת מוצא הוכחת עבודה, הוא משדר אותו לכל הצמתים.

5) צמתים מסכימים עם הגוש רק אם כל הפעולות בו הן תקינות ולא נוצלו כבר.

6) צמתים מבטאים את הסכמתם עם גוש בעצם זה שהם עובדים על יצירת הגוש הבא בשרשרת,

תוך שימוש בגיבוב של הבלוק שהתקבל בתור הגיבוב הקודם.


צמתים תמיד מתייחסים לשרשרת הארוכה ביותר כאל השרשרת הנכונה וימשיכו לעבוד על הארכתה.

אם שני צמתים משדרים גרסאות שונות של הגוש הבא בו-זמנית, חלק מהצמתים יקבלו את האחד או

השני תחילה. במקרה זה, הם יעבדו על הראשון שהם קיבלו, אבל ישמרו את הענף השני למקרה שהוא

יהפך לארוך יותר. התיקו יישבר כשהוכחת העבודה הבאה תימצא ואחד מהענפים יהפך לארוך יותר;

הצמתים שעבדו על הענף האחר יעברו לענף הארוך יותר.


שידורים של פעולות חדשות לא צריכים בהכרח להגיע לכל הצמתים. כל עוד הם מגיעים לצמתים

רבים, הם ייכנסו לתוך גוש בחלוף זמן לא רב. שידורי גוש הם גם סובלניים לגבי הודעות שנשמטו. אם

צומת לא מקבל גוש, הוא יבקש אותו כשהוא מקבל את הגוש הבא ומבין שהוא החמיץ אחד.


6. תמריץ

על פי המוסכמה, הפעולה הראשונה בכל גוש היא פעולה מיוחדת שמתחילה מטבע חדש בבעלותו של

יוצר הגוש. זה מוסיף תמריץ לצמתים לתמוך ברשת, ומעניק דרך ראשונית להפיץ מטבעות למחזור,

מאחר ואין סמכות מרכזית היכולה להנפיק אותם. התוספת הקבועה של מטבעות חדשים מקבילה

לכורי זהב המוציאים משאבים כדי להוסיף זהב למחזור. במקרה שלנו, המשאבים הם זמן מעבד

ואנרגיה חשמלית.

התמריץ יכול גם להיות ממומן על ידי עמלות פעולה. אם ערך הפלט של פעולה נמוך מערך הקלט,

ההפרש הוא עמלת פעולה שמתווספת לערך התמריץ של הגוש המכיל את הפעולה. לאחר שמספר

קבוע מראש של מטבעות נכנס למחזור, התמריץ יכול לעבור באופן בלעדי לעמלות פעולה ולהיות נקי

לחלוטין מאינפלציה.

התמריץ יכול לעזור בעידוד צמתים להישאר ישרים. אם תוקף חמדן מסוגל לכנוס יותר כוח חישוב

מכל הצמתים הישרים, הוא יצטרך לבחור בין שימוש בו כדי להונות אנשים בגניבת התשלומים שלו

בחזרה, או שימוש בו ליצור מטבעות חדשים. מתקבל על הדעת שיהיה זה רווחי יותר בעיניו לשחק לפי

הכללים, כללים אלו שחוננים אותו ביותר מטבעות חדשים מאשר כל שאר המשתתפים ביחד, מאשר

לרופף את המערכת ואת תקפות ההון של עצמו.


7. שחרור נפח כונן

מהרגע בו הפעולה האחרונה במטבע קבורה תחת מספיק גושים, הפעולות המנוצלות לפניה יכולות

להיזרק כדי לחסוך בנפח כונן. כדי לסייע בכך מבלי לשבור את גיבוב הגוש, הפעולות מגובבות בעץ

7]), באופן שרק השורש כלול בגיבוב הגוש. גושים ישנים יכולים ][2][ ראה [ 5 ,Merkle Tree) מרקל

לעבור צמצום על ידי גדימת ענפים מהעץ. אין צורך לשמור את הגיבובים הפנימיים.

כותרת גוש ללא פעולות תתפוס בערך 80 בתים. אם אנו מניחים שגושים נוצרים כל 10 דקות, מדובר

2GB 4.2 לשנה. בהינתן שמערכות מחשב טיפוסיות נמכרות עם MB = 365 * 24 * 6 * ב- 80 בתים

1.2 לשנה, לא אמורה להיות בעיית GB זיכרון נכון לשנת 2008 , וחוק מור צופה צמיחה עכשווית של

אחסון גם אם חובה לשמור את כותרות הגושים בזיכרון.


8. אימות מפושט של פעולות

ניתן לאמת פעולות מבלי להפעיל צומת רשת מלא. משתמש צריך רק לשמור עותק של כותרות הגושים

של שרשרת הוכחות העבודה הארוכה ביותר, אותו הוא יכול לקבל על ידי שאילתות לצמתים ברשת עד

שהוא משוכנע שיש לו את השרשרת הארוכה ביותר, ולהשיג את ענף המרקל המקשר את הפעולה לגוש

בו יש לה חותמת זמן. הוא לא יכול לבדוק את הפעולה בעצמו, אבל על ידי קישורה למקום בשרשרת,

הוא יכול לראות שצומת ברשת הסכים איתה, וגושים שמתווספים אחריה מהווים אישוש נוסף

שהרשת מסכימה איתה.

בתור שכזה, האימות הוא אמין כל עוד צמתים ישרים שולטים ברשת, אבל הוא פגיע יותר אם

תוקף גובר על הרשת. בעוד צמתים ברשת יכולים לאמת פעולות בעצמם, השיטה המפושטת יכולה

ללכת שולל אחר פעולות בדיוניות של תוקף כל עוד הוא יכול להמשיך לגבור על הרשת. אסטרטגיה

אחת להגן מפני זה היא לקבל התרעות מצמתים ברשת כשהם חושפים גוש לא קביל, ולהניע את

התוכנה של המשתמש להוריד את הגוש המלא והפעולות החשודות כדי לאשר את חוסר העקביות

שלהן. עסקים שמקבלים תשלומים באופן תדיר כנראה ירצו עדיין להפעיל צמתים משל עצמם לצורך

מידה רבה יותר של אבטחה בלתי-תלויה ואימות מהיר יותר.


9. צירוף ופיצול ערך

אף על פי שהיה אפשר לטפל במטבעות באופן פרטני, יהיה זה מסורבל לקיים פעולה נפרדת לכל אגורה

בהעברה. כדי לאפשר לערך לעבור צירוף ופיצול, פעולות מכילות קלטים ופלטים מרובים. באופן רגיל

יהיו או קלט אחד מפעולה קודמת גדולה יותר או קלטים מרובים המצרפים כמויות קטנות יותר, ולכל

היותר שני פלטים: אחד בשביל התשלום, ואחד בשביל להחזיר את העודף, אם קיים, בחזרה אל

השולח.

ראוי לציין שהסתעפות, בה כל פעולה תלויה במספר פעולות, ופעולות אלה תלויות ברבות נוספות,

אינה בעיה כאן. לעולם אין צורך להפיק עותק שלם העומד בפני עצמו של ההיסטוריה של פעולה.


10. פרטיות

המודל הבנקאי המסורתי משיג רמה מסוימת של פרטיות בכך שהוא מגביל את הגישה למידע לצדדים

המעורבים ולצד השלישי הנאמן. ההכרח בהכרזת כל הפעולות באופן פומבי מוציא מכלל חשבון את

השיטה הזאת, אבל עדיין ניתן לשמור על פרטיות על ידי שבירת זרימת המידע במקום אחר: שמירת

האלמוניות של מפתחות ציבוריים. הציבור יכול לראות שמישהו שולח כמות מסוימת למישהו אחר,

אך ללא מידע המקשר את הפעולה לגורם כלשהו. דומה הדבר לרמת המידע המשחררות בורסות מניות,

בהן הזמן והגודל של פעולות פרטניות, ה"פסנוע", מוצג באופן גלוי, אך מבלי לומר מי היו הצדדים.

כאמצעי הגנה נוסף, יש להשתמש בזוג מפתחות חדש לכל פעולה כדי למנוע מהם להיות מקושרים

לבעלים משותף. מידה מסוימת של קישור היא עדיין בלתי-נמנעת עם פעולות מרובות קלטים,

שבהכרח חושפות שהקלטים שלהן היו שייכים לאותו בעלים. הסיכון הוא שאם הבעלים של מפתח

נחשף, קישור יכול לחשוף פעולות נוספות ששייכות לאותו בעלים.


11. חישובים

אנו בוחנים תרחיש בו תוקף מנסה ליצור שרשרת חלופית מהר יותר מהשרשרת הישרה. גם אם הדבר

מתבצע, המערכת אינה נפתחת לשינויים שרירותיים, כמו יצירת ערך יש מאין או לקיחת כסף

שמעולם לא היה שייך לתוקף. צמתים לא יסכימו לקבל פעולה בלתי-קבילה כתשלום, וצמתים ישרים

לעולם לא יסכימו עם גוש המכיל אותן. תוקף יכול רק לנסות לשנות אחת מהפעולות שלו כדי לקחת

בחזרה כסף שהוא הוציא לאחרונה.

ניתן לאפיין את המירוץ בין השרשרת הישרה ושרשרת של תוקף בתור הילוך אקראי בינומי.

, מאורע ההצלחה הוא שהשרשרת הישרה מתארכת בגוש אחד, מה שמגדיל את ההובלה בשיעור +1

. ומאורע הכישלון הוא שהשרשרת של התוקף מתארכת בגוש חד, מה שמפחית את הפער בשיעור -1

ההסתברות שתוקף ידביק את הפער מגרעון נתון מקביל לבעיית מפולת המהמר. נניח כי מהמר עם

אשראי בלתי-מוגבל מתחיל עם גירעון ומשחק בניסיון להגיע לאיזון מספר נסיונות היכול להיות

אינסופי. אנו יכולים לחשב את ההסתברות שהוא יגיע אי-פעם לאיזון, כלומר שהתוקף ידביק אי-פעם

את הפער עם השרשרת הישרה, כדלקמן [8]


ההסתברות שצומת ישר ימצא את הגוש הבא = p

ההסתברות שהתוקף ימצא את הגוש הבא = q

qz = גושים z ההסתברות שהתוקף ידביק אי-פעם את הפער מפיגור של


בהנתן ההנחה כי p>q, ההסתברות קטנה באופן מעריכי ככל שגדל מספר הגושים איתם התוקף צריך להדביר את הפער. היות והסיכויים פועלים נגדו, אם אין לו את המזל בזינוק קדימה בתחילה, הסיכויים שלו נהיים אפסיים ככל שהפיגור שלו גדל. עתה נבחן כמה המקבל של פעולה חדשה צריך להמתין כדי להיות בטוח במידה מספיקה שהשולח

אינו יכול לשנות את הפעולה. אנו מניחים שהשולח הוא תוקף הרוצה לגרום למקבל להאמין לזמן-מה

שהוא שילם לו, ואז להחליף את הפעולה כדי לשלם בחזרה לעצמו. המקבל יקבל התרעה כשזה יקרה,

אך התוקף מקווה שזה יהיה מאוחר מדי.

המקבל יוצר זוג מפתחות חדש ונותן את המפתח הציבורי לשלוח זמן קצר לפני החתימה. זה מונע

מהתוקף להכין שרשרת גושים מבעוד מועד על ידי עבודה רצופה עליה עד שיש לו מספיק מזל כדי

להוביל במידה מספקת, ואז לבצע את הפעולה באותו הרגע. ברגע בו הפעולה נשלחת, השולח הלא-

ישר מתחיל לעבוד בחשאי על שרשרת מקבילה המכילה גרסה חלופית של הפעולה שלו.

גושים שורשרו לאחריו. הוא לא יודע את מידת z - המקבל מחכה עד שהפעולה התווספה לגוש ו

ההתקדמות המדויקת של התוקף, אבל בהנחה שהגושים הישרים לקחו פרק זמן ממוצע לכל גוש,

ההתקדמות האפשרית של התוקף היא משתנה פואסון עם תוחלת:


.z מהרצת מספר תוצאות, אנו יכולים לראות שההסתברות קטנה באופן מעריכי עם



12. סיכום

הצענו מערכת לעסקאות אלקטרוניות שאינה מסתמכת על אמון. התחלנו עם המסגרת הרגילה של

מטבעות העשויים מחתימות דיגיטליות, המספקת שליטה חזקה בבעלות, אך אינה שלמה ללא דרך

למנוע ניצול כפול. כדי לפתור זאת, בצענו רשת שיתופית המשתמשת בהוכחת עבודה כדי לנהל רישום

של היסטוריה פומבית של פעולות, שבמהרה הופכת לבלתי-מעשית מבחינה חישובית להשתנות על ידי

תוקף אם צמתים ישרים שולטים במרבית כוח החישוב. הרשת עמידה מעצם הפשטות חסרת המבנה

שלה. צמתים עובדים בו-זמנית עם מעט תיאום. הם אינם צריכים להזדהות, היות והודעות אינן

מנותבות למקום מסוים וצריכות להימסר רק על בסיס מיטב המאמצים. צמתים יכולים לעזוב את

הרשת ולהצטרף אליה מחדש כרצונם, תוך קבלת שרשרת הוכחת העבודה כהוכחה למה שקרה

בהיעדרם. הם מצביעים עם עוצמת חישוב, ומביעים את הסכמתם עם גושים תקינים בעבודה על

המשכתם, ודוחים גושים בלתי-קבילים בסירוב לעבוד עליהם. ניתן לאכוף כל כלל או תמריץ שיידרש

עם מנגנון ההסכמה הכללית הזה.



הפניות:

[1] W. Dai, "b-money," http://www.weidai.com/bmoney.txt, 1998.

[2] H. Massias, X.S. Avila, and J.-J. Quisquater, "Design of a secure timestamping service with minimal

trust requirements," In 20th Symposium on Information Theory in the Benelux, May 1999.

[3] S. Haber, W.S. Stornetta, "How to time-stamp a digital document," In Journal of Cryptology, vol 3, no

2, pages 99-111, 1991.

[4] D. Bayer, S. Haber, W.S. Stornetta, "Improving the efficiency and reliability of digital time-stamping,"

In Sequences II: Methods in Communication, Security and Computer Science, pages 329-334, 1993.

[5] S. Haber, W.S. Stornetta, "Secure names for bit-strings," In Proceedings of the 4th ACM Conference

on Computer and Communications Security, pages 28-35, April 1997.

[6] A. Back, "Hashcash - a denial of service counter-measure,"

http://www.hashcash.org/papers/hashcash.pdf, 2002.

[7] R.C. Merkle, "Protocols for public key cryptosystems," In Proc. 1980 Symposium on Security and

Privacy, IEEE Computer Society, pages 122-133, April 1980.

[8] W. Feller, "An introduction to probability theory and its applications," 1957.

Hebrew translation by: Meni Rosenfeld


אם גם אתם רוצים ללמוד לסחור בשוק המטורף הזה וכמובן להרוויח אז הצטרפו אלינו >> קורס מסחר בקריפטו

bottom of page