برقراری ارتباط با شبکه csc از طریق web3.py

با سلام خدمت جامعه توسعه دهندگان بلاکچین و قرار داد های هوشمند

در یکی از تاپیک ها یکی از دوستان پرسشی مبنی بر این داشتن که چطور در شبکه های اتریومی با نود ارتباط قرار کرد

در این تاپیک قصد دارم که نحوه ارتباط با یک Node_RPC و همچنین ساخت یک ابزار کوچک رو با همدیگه بررسی کنیم

در اینجا من از شبکه CSC استفاده میکنم چون همونطور که گفتم رایگان و در دسترس هست و تقریبا هرکاری که اینجا میکنید تو اتریوم و شبکه های سازگار اتریومی یکسانه پس موقعیت خوبی برای ساخت و ساز و تست هستش

f4b1ed867f903661437779f548a5978e9a817f6b_2_690x192

Web3.py

درواقع ابزار Web3.X یک پیاده سازی نرم افزاری متشکل از کتابخونه ای مختلف در زمینه های شبکه و رمزنگاری هستش که به ما اجازه ارتباط و تعامل با شبکه بلاکچین مورد نظرمون رو میده

نکته اینجاست که شما با web3.x مستقیما با شبکه ارتباط برقرار نمیکنید بلکه با یک نود ارتباط برقرار میکنید و اون نود هم تراکنش شما رو در شبکه پخش یا به اصطلاح BroadCast میکنه

نصب Web3.py

برای نصب web3.py باید مثل نصب بقیه کتابخونه های پایتونی از pip کمک بگیریم برای همین terminal رو باز میکنیم و دستور زیر رو مینویسیم :

pip install web3

در مرحله بعد باید این کتابخونه رو در سر خط اسکریپت خودمون ایمپورت کنیم:

from web3 import Web3

حالا نیاز داریم که به اسکریپتمون بفهمونیم که داده ها باید به کدوم provider ارسال بشن:

from web3.middleware import geth_poa_middleware
provider = Web3.HTTPProvider("https://testnet-rpc.coinex.net")
w3 = Web3(provider)

همونطور که میبینید من شبکه تست رو برای نوشتن اسکریپت خودم انتخاب کردم

خیلی خب!
حالا تونستیم به نود وصل بشیم بیاید یک ولت CLI-Based بنویسیم

در اینجا ما میخوایم یک کیف پول غیر حضانتی تحت کامند لاین توسعه بدیم که میتونه بالانس مارو نشون بده و تراکنش رو ارسال کنه

اول با ساخت کیف پول شروع میکنیم :yum:

    account = w3.eth.account.create();

دستور فوق برای ما یک کیف پول رندوم تولید میکنه که میتونید کلید خصوصی و ادرس خودمون رو به این شکل تفکیک کنیم:

account.privateKey.hex()
account.address

نکته: با هربار اجرای این کد یک جفت کلید خصوصی و عمومی جدا تولید میشه که اگر میخوایم همیشه از کیف پولمون استفاده کنیم توصیه میکنم که اون رو در یک فایل ( بهتره json ) ذخیره کنیم:

def create_account():
    global account
    account = w3.eth.account.create();
    with open('config.json', 'r+') as config:
        data = json.load(config)
        data["privatekey"] = account.privateKey.hex()
        data["address"] = account.address
        config.seek(0)
        config.write(json.dumps(data))
        config.truncate()
    print("your account has been created \n")

ساخت تراکنش
حالا که جفت کلید خصوصی و عمومیمون رو ساختیم میتونیم یک تراکنش ایجاد کنیم. به طور کلی تراکنش های اتریومی چنین ساختاری دارند:
1 - ادرس گیرنده
2 - nounce
3 - مقدار
4 - میزان کارمزد ( اپشنال هست و در صورت بلاتغییر موندن اون توسط شبکه تنظیم میشه )

بیاید یک تراکنش در قالب بالا بسازیم :

def send_transaction():
    with open('config.json', 'r') as config:
        json_load = json.load(config)
    nonce = w3.eth.getTransactionCount(json_load['address'])

    tx = {
        'nonce': nonce,
        'to': input("Enter recipient address: "),
        'value': w3.toWei(float(input("Enter amount: ")), 'ether'),
        'gas': 2000000,
        'gasPrice': w3.eth.gas_price
    }

    signed_tx = w3.eth.account.sign_transaction(tx,json_load['privatekey'])

    tx_hash = w3.eth.sendRawTransaction(signed_tx.rawTransaction)

    print("Congratulation! your transaction was successful \n TX Hash is : "+ w3.toHex(tx_hash)+"\n")

بریم کد رو بشکنیم و ببینیم یعنی چی :smiley:
در اینجا من اول کلید عمومی و خصوصی رو از فایلی که اونها رو در اون ذخیره کرده بودم میخونم :

    with open('config.json', 'r') as config:
        json_load = json.load(config)
    nonce = w3.eth.getTransactionCount(json_load['address'])

بعدش یک تراکنش در قالبی که گفتیم ساختم:

    tx = {
        'nonce': nonce,
        'to': input("Enter recipient address: "),
        'value': w3.toWei(float(input("Enter amount: ")), 'ether'),
        'gas': 2000000,
        'gasPrice': w3.eth.gas_price
    }

و در اخر اون رو با کلید خصوصی ای که داشتیم امضا کردم و هش تراکنش رو به کاربر دادم:

 signed_tx = w3.eth.account.sign_transaction(tx,json_load['privatekey'])

    tx_hash = w3.eth.sendRawTransaction(signed_tx.rawTransaction)

    print("Congratulation! your transaction was successful \n TX Hash is : "+ w3.toHex(tx_hash)+"\n")

حالا کیف پول ما این قابلیت رو داره که یک تراکنش (‌البته در اینجا ارسال اتر !) رو انجام بده

بیاین بریم ببینیم چطور میشه بعد انجام تراکنش از بالانس کیف پول خودمون و میزان دارایی موجودمون اطلاع پیدا کنیم

    with open('config.json', 'r') as config:
	    json_load = json.load(config)
    balance = float(w3.eth.get_balance(json_load['address']))
    print(" \n Your balance is: " + str(w3.eth.get_balance(json_load['address'])) )

ادرس کیف پولم رو از فایلی که ادرس رو در اون ذخیره کرده بودم میخونم و با get_balance() و پاس دادن ادرسم به اون به عنوان پارامتر بالانس کیف پولم رو در پاسخ پرینت میکنه

حالا بر فرض اگر خواستم از کلید خصوصیم خروجی بگیرم یا به اصطلاح اونو export کنم تا توی کیف پول دیگه ای استفاده کنم چطور؟

    with open('config.json', 'r') as config:
	    json_load = json.load(config)
    print("Your privatekey is: "+json_load['privatekey'])
    print("Your address is: "+json_load['address'])

کافیه هر دو مقدار کلید خصوصی و ادرسم رو از فایلی که اونارو توش ذخیره کرده بودم بخونم و اونهارو روی صفحه پرینت کنم

به همین راحتی :smiley:

حالا شما هر ایده ای که داشته باشید میتونید با خلاقیت خودتون پیاده سازی کنید.

برای اشنایی با دستورات بیشتر و توابع web3 میتونید به مستنداتش مراجعه کنید:

https://web3py.readthedocs.io/

قصد دارم در تایپک های نحوه استفاده از web3 در پیاده سازی اون در زبان های PHP و java script رو باهم بررسی کنیم