关于Solidity脚本相关环境配置及脚本数据的查找

来源:

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

posted @ 2024-06-06 23:08  青禾与共  阅读(2)  评论(0编辑  收藏  举报