来源:
在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的“我的项目”页面,并查看所有你有权访问的项目。
密钥: