來源:
在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的“我的專案”頁面,並檢視所有你有權訪問的專案。
金鑰: