關於Solidity指令碼相關環境配置及指令碼資料的查詢

青禾与共發表於2024-06-06

來源:

在solidity安全中心做題時,有些題需要透過指令碼進行計算,可以是JavaScript也可以是python的指令碼,solidity安全方面初次接觸可能不清楚該如何執行solidity的相關指令碼。下面我來分開說說JavaScript 和 Python 對應的環境配置

python篇:

首先確保你的電腦中存在Python環境

Python安裝:可以去搜尋別的博文
python的官方下載地址:https://www.python.org/downloads/
根據自己的需求進行選擇Windows Linux等版本

確認安裝完成後,Win+R輸入cmd開啟命令列 輸入
pip install web3
去安裝web3 模組

WARNING:如果中途提示有檔案需要C++的編譯工具才能安裝完成的話

需要安裝個這個:Microsoft Visual C++ 或者安裝好c++的相關環境
官網地址:https://learn.microsoft.com/zh-cn/cpp/windows/latest-supported-vc-redist?view=msvc-170

Javascript 篇:

1. 確保已安裝Node.js和npm
首先,你需要在你的系統上安裝Node.js。Node.js的安裝包通常會附帶npm。
2. 初始化Node.js專案
在你的專案資料夾中開啟命令列(終端或命令提示符)。
輸入npm init -y來初始化一個新的Node.js專案,這將會生成一個預設的package.json檔案。
3. 安裝web3.js
在命令列中輸入npm install web3來安裝web3.js庫。npm將會自動下載並安裝web3.js及其依賴項。
4. 測試web3.js是否安裝成功
建立一個名為main.js的檔案,並新增以下程式碼:

const { Web3 } = require('web3');  
 
const web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));  
  
 
console.log("Version:", web3.version);

在命令列中執行node main.js。如果一切正常,你應該能看到列印出的web3版本資訊,這表示web3.js已成功安裝並執行

下面是Solidity的指令碼的示例(js版本和Python版本):
**Python版本: **

from web3 import Web3, HTTPProvider  
  
# 假設你已經有了私鑰、地址和合約地址  
PRIVATE_KEY = 'YOUR_PRIVATE_KEY'  # 請替換為你的私鑰  
CONTRACT_ADDRESS = 'YOUR_CONTRACT_ADDRESS'  # 請替換為你的合約地址  
INFURA_PROJECT_ID = 'YOUR_INFURA_PROJECT_ID'  # 如果你使用Infura,請替換為你的專案ID  
  
# 連線到Infura節點(或其他以太坊節點)  
w3 = Web3(HTTPProvider('https://mainnet.infura.io/v3/' + INFURA_PROJECT_ID))  
  
# 載入賬戶  
account = w3.eth.account.privateKeyToAccount(PRIVATE_KEY)  
w3.eth.defaultAccount = account.address  
  
# 載入合約ABI和地址  
# ABI(Application Binary Interface)是從Solidity編譯器獲取的,描述了合約的介面  
with open('SimpleStorage.abi', 'r') as file:  
    abi = json.load(file)  
  
# 建立合約例項  
contract = w3.eth.contract(address=CONTRACT_ADDRESS, abi=abi)  
  
# 呼叫合約的get函式  
stored_data = contract.functions.get().call()  
print(f"Stored Data: {stored_data}")  
  
# 呼叫合約的set函式  
transaction_hash = contract.functions.set(12345).transact({'from': account.address})  
print(f"Transaction Hash: {transaction_hash.hex()}")  
  
# 等待交易被挖礦並確認  
w3.eth.waitForTransactionReceipt(transaction_hash)  
  
# 再次呼叫get函式來確認資料已更改  
updated_stored_data = contract.functions.get().call()  
print(f"Updated Stored Data: {updated_stored_data}")                

JavaScript版本:

const Web3 = require('web3');  
const fs = require('fs');  
  
// 假設你已經有了私鑰、地址和合約地址  
const PRIVATE_KEY = 'YOUR_PRIVATE_KEY'; // 請替換為你的私鑰  
const CONTRACT_ADDRESS = 'YOUR_CONTRACT_ADDRESS'; // 請替換為你的合約地址  
const INFURA_PROJECT_ID = 'YOUR_INFURA_PROJECT_ID'; // 如果你使用Infura,請替換為你的專案ID  
  
// 連線到Infura節點(或其他以太坊節點)  
const web3 = new Web3(new Web3.providers.HttpProvider('https://mainnet.infura.io/v3/' + INFURA_PROJECT_ID));  
  
// 載入賬戶  
const account = web3.eth.accounts.privateKeyToAccount(PRIVATE_KEY);  
  
// 載入合約ABI和地址  
// ABI(Application Binary Interface)是從Solidity編譯器獲取的,描述了合約的介面  
const abi = JSON.parse(fs.readFileSync('SimpleStorage.abi', 'utf8'));  
  
// 建立合約例項  
const contract = new web3.eth.Contract(abi, CONTRACT_ADDRESS);  
  
// 呼叫合約的get函式  
contract.methods.get().call().then(storedData => {  
    console.log('Stored Data:', storedData);  
  
    // 呼叫合約的set函式  
    contract.methods.set(12345).send({ from: account.address }, (err, txHash) => {  
        if (err) {  
            console.error('Transaction failed:', err);  
        } else {  
            console.log('Transaction Hash:', txHash);  
  
            // 等待交易被挖礦並確認(這裡只是一個簡單的列印,你可能需要實現更復雜的邏輯)

相關資料的查詢:
ABI:
合約地址大家應該會找
專案的地址查詢:如果你是該Infura專案的協作者或具有適當的訪問許可權,你可以登入到Infura的“我的專案”頁面,並檢視所有你有權訪問的專案。
金鑰:

相關文章