当前位置: 首页 > news >正文

区块链交易

文章目录

    • 交易
    • 准备
    • 合约和代码逻辑
      • 合约
      • compile.js
      • index.js
    • 运行

交易

项目来自https://github.com/Dapp-Learning-DAO/Dapp-Learning/blob/main/basic/02-web3js-transaction/README-cn.md

本项目包含对交易进行签名,发送,接收交易回执,验证交易执行结果。也提供了事件监听的逻辑代码。

准备

需要安装web3.js

其他和上一个项目环境一样,需要准备私钥和项目id。参考 上一篇。

合约和代码逻辑

合约

pragma solidity ^0.8.0;contract Incrementer {uint256 public number;event Increment(uint256 value);event Reset();constructor(uint256 _initialNumber) {number = _initialNumber;}function increment(uint256 _value) public {require(_value > 0, "increment value should be positive number");number = number + _value;emit Increment(_value);}function reset() public {number = 0;emit Reset();}function getNumber() public view returns (uint256) {return number;}
}

compile.js

const fs = require('fs');
const solc = require('solc');// 以 utf8 方式加载合约
const source = fs.readFileSync('Incrementer.sol', 'utf8');// 编译合约
const input = {language: 'Solidity',sources: {'Incrementer.sol': {content: source,},},settings: {outputSelection: {'*': {'*': ['*'],},},},
};const tempFile = JSON.parse(solc.compile(JSON.stringify(input)));
const contractOfIncrementer =tempFile.contracts['Incrementer.sol']['Incrementer'];// 导出合约数据,可以使用 console 打印 contractFile 中的具体内容信息
module.exports = contractOfIncrementer;

index.js

const Web3 = require('web3');
const fs = require('fs');
const contractOfIncrementer = require('./compile');require('dotenv').config();
const privatekey = process.env.PRIVATE_KEY;function sleep(ms) {return new Promise((resolve) => setTimeout(resolve, ms));
}/*-- Define Provider --
*/
// Provider
const providerRPC = {development: 'https://sepolia.infura.io/v3/' + process.env.INFURA_ID,moonbase: 'https://rpc.testnet.moonbeam.network',
};
const web3 = new Web3(providerRPC.development); //Change to correct network// Create account with privatekey
const account = web3.eth.accounts.privateKeyToAccount(privatekey);
const account_from = {privateKey: privatekey,accountAddress: account.address,
};// Get abi & bin
const bytecode = contractOfIncrementer.evm.bytecode.object;
const abi = contractOfIncrementer.abi;/*
*
*
*   -- Verify Deployment --
**/
const Trans = async () => {console.log('============================ 1. Deploy Contract');console.log(`Attempting to deploy from account ${account.address}`);// Create Contract Instanceconst deployContract = new web3.eth.Contract(abi);// Create Deployment Txconst deployTx = deployContract.deploy({data: bytecode,arguments: [5],});// Sign Txconst createTransaction = await web3.eth.accounts.signTransaction({data: deployTx.encodeABI(),gas: 8000000,},account_from.privateKey);// Get Transaction Receiptconst createReceipt = await web3.eth.sendSignedTransaction(createTransaction.rawTransaction);console.log(`Contract deployed at address: ${createReceipt.contractAddress}`);const deployedBlockNumber = createReceipt.blockNumber;/***** -- Verify Interface of Increment --***/// Create the contract with contract addressconsole.log();console.log('============================ 2. Call Contract Interface getNumber');let incrementer = new web3.eth.Contract(abi, createReceipt.contractAddress);console.log(`Making a call to contract at address: ${createReceipt.contractAddress}`);let number = await incrementer.methods.getNumber().call();console.log(`The current number stored is: ${number}`);// Add 3 to Contract Public Variableconsole.log();console.log('============================ 3. Call Contract Interface increment');const _value = 3;let incrementTx = incrementer.methods.increment(_value);// Sign with Pklet incrementTransaction = await web3.eth.accounts.signTransaction({to: createReceipt.contractAddress,data: incrementTx.encodeABI(),gas: 8000000,},account_from.privateKey);// Send Transactoin and Get TransactionHashconst incrementReceipt = await web3.eth.sendSignedTransaction(incrementTransaction.rawTransaction);console.log(`Tx successful with hash: ${incrementReceipt.transactionHash}`);number = await incrementer.methods.getNumber().call();console.log(`After increment, the current number stored is: ${number}`);/***** -- Verify Interface of Reset --***/console.log();console.log('============================ 4. Call Contract Interface reset');const resetTx = incrementer.methods.reset();const resetTransaction = await web3.eth.accounts.signTransaction({to: createReceipt.contractAddress,data: resetTx.encodeABI(),gas: 8000000,},account_from.privateKey);const resetcReceipt = await web3.eth.sendSignedTransaction(resetTransaction.rawTransaction);console.log(`Tx successful with hash: ${resetcReceipt.transactionHash}`);number = await incrementer.methods.getNumber().call();console.log(`After reset, the current number stored is: ${number}`);/***** -- Listen to Event Increment --***/console.log();console.log('============================ 5. Listen to Events');console.log(' Listen to Increment Event only once && continuouslly');// sepolia don't support http protocol to event listen, need to use websocket// more details , please refer to  https://medium.com/blockcentric/listening-for-smart-contract-events-on-public-blockchains-fdb5a8ac8b9aconst web3Socket = new Web3('wss://sepolia.infura.io/ws/v3/' + process.env.INFURA_ID);// listen to  Increment event only onceincrementer.once('Increment', (error, event) => {console.log('I am a onetime event listner, I am going to die now');});// listen to Increment event continuouslyweb3Socket.eth.subscribe('logs',{address: createReceipt.contractAddress,topics: []},(error,result) => {if(error){console.error(error)}}).on("data", (event) => {console.log("New event: ", event);}).on("error", (error) => {console.error("Error: ", error);});for (let step = 0; step < 3; step++) {incrementTransaction = await web3.eth.accounts.signTransaction({to: createReceipt.contractAddress,data: incrementTx.encodeABI(),gas: 8000000,},account_from.privateKey);await web3.eth.sendSignedTransaction(incrementTransaction.rawTransaction);console.log("Waiting for events")await sleep(3000);if (step == 2) {// clear all the listenersweb3Socket.eth.clearSubscriptions();console.log('Clearing all the events listeners !!!!');}}/***** -- Get past events --***/console.log();console.log('============================ 6. Going to get past events');const pastEvents = await incrementer.getPastEvents('Increment', {fromBlock: deployedBlockNumber,toBlock: 'latest',});pastEvents.map((event) => {console.log(event);});/***** -- Check Transaction Error --***/console.log();console.log('============================ 7. Check the transaction error');incrementTx = incrementer.methods.increment(0);incrementTransaction = await web3.eth.accounts.signTransaction({to: createReceipt.contractAddress,data: incrementTx.encodeABI(),gas: 8000000,},account_from.privateKey);await web3.eth.sendSignedTransaction(incrementTransaction.rawTransaction).on('error', console.error);
};Trans().then(() => process.exit(0)).catch((error) => {console.error(error);process.exit(1);});

运行

============================ 1. Deploy Contract
Attempting to deploy from account 0x953bAac08Cad29A4E354F0833c404Ed528775B68
Contract deployed at address: 0xadD95f6bD6A0Fbd1423Bde9272dB999946A09369============================ 2. Call Contract Interface getNumber
Making a call to contract at address: 0xadD95f6bD6A0Fbd1423Bde9272dB999946A09369
The current number stored is: 5============================ 3. Call Contract Interface increment
Tx successful with hash: 0xf9121315472943c6c316c600072798813317563ee3994cfc2334ba20a453a4a1
After increment, the current number stored is: 8============================ 4. Call Contract Interface reset
Tx successful with hash: 0xda76d0a839a40acfb654a37b7afe133c44cd81873f91d51ddfcff2b6052c2e0b
After reset, the current number stored is: 0============================ 5. Listen to EventsListen to Increment Event only once && continuouslly
I am a onetime event listner, I am going to die now
New event:  {address: '0xadD95f6bD6A0Fbd1423Bde9272dB999946A09369',blockHash: '0x9e8d04cff3f2236eed7bf662036657963cf7475b0e350f77a396e89a4935de2c',blockNumber: 7947790,data: '0x0000000000000000000000000000000000000000000000000000000000000003',logIndex: 353,removed: false,topics: ['0x51af157c2eee40f68107a47a49c32fbbeb0a3c9e5cd37aa56e88e6be92368a81'],transactionHash: '0xdc7dfda876800b365e70374b8f8f9f39d8603bebe89f961109f65229b93524d6',transactionIndex: 189,id: 'log_7432a4a4'
}
Waiting for events
New event:  {address: '0xadD95f6bD6A0Fbd1423Bde9272dB999946A09369',blockHash: '0x9ec619f890cdd8e0ab6a3e0bae4846351f81f6b81125fddd444c8e7a2598d970',blockNumber: 7947792,data: '0x0000000000000000000000000000000000000000000000000000000000000003',logIndex: 343,removed: false,topics: ['0x51af157c2eee40f68107a47a49c32fbbeb0a3c9e5cd37aa56e88e6be92368a81'],transactionHash: '0x4956140582e6e0d62885e0646ad0642b6ae060fd4658d0374cd555799fa3a843',transactionIndex: 181,id: 'log_a193869e'
}
Waiting for events
New event:  {address: '0xadD95f6bD6A0Fbd1423Bde9272dB999946A09369',blockHash: '0xd8967836b9d85763611be4489042896b149b45b82f3404d530ad60a2cb8ca378',blockNumber: 7947793,blockTimestamp: '0x67dd0eb8',data: '0x0000000000000000000000000000000000000000000000000000000000000003',logIndex: 248,removed: false,topics: ['0x51af157c2eee40f68107a47a49c32fbbeb0a3c9e5cd37aa56e88e6be92368a81'],transactionHash: '0x35163a22db0cffeeab3e2c4f6ca6f6a3f5e622982514ea98a6f99b3abc0e5d74',transactionIndex: 169,id: 'log_97159c2a'
}
Waiting for events
Clearing all the events listeners !!!!============================ 6. Going to get past events
{removed: false,logIndex: 413,transactionIndex: 214,transactionHash: '0xf9121315472943c6c316c600072798813317563ee3994cfc2334ba20a453a4a1',blockHash: '0xdc82eb994a9884606ad817309a509f923aa4c9eb1444e1fdf0531f29919d67ca',blockNumber: 7947788,address: '0xadD95f6bD6A0Fbd1423Bde9272dB999946A09369',id: 'log_95b8ba97',returnValues: Result { '0': '3', value: '3' },event: 'Increment',signature: '0x51af157c2eee40f68107a47a49c32fbbeb0a3c9e5cd37aa56e88e6be92368a81',raw: {data: '0x0000000000000000000000000000000000000000000000000000000000000003',topics: ['0x51af157c2eee40f68107a47a49c32fbbeb0a3c9e5cd37aa56e88e6be92368a81']}
}
{removed: false,logIndex: 353,transactionIndex: 189,transactionHash: '0xdc7dfda876800b365e70374b8f8f9f39d8603bebe89f961109f65229b93524d6',blockHash: '0x9e8d04cff3f2236eed7bf662036657963cf7475b0e350f77a396e89a4935de2c',blockNumber: 7947790,address: '0xadD95f6bD6A0Fbd1423Bde9272dB999946A09369',id: 'log_7432a4a4',returnValues: Result { '0': '3', value: '3' },event: 'Increment',signature: '0x51af157c2eee40f68107a47a49c32fbbeb0a3c9e5cd37aa56e88e6be92368a81',raw: {data: '0x0000000000000000000000000000000000000000000000000000000000000003',topics: ['0x51af157c2eee40f68107a47a49c32fbbeb0a3c9e5cd37aa56e88e6be92368a81']}
}
{removed: false,logIndex: 343,transactionIndex: 181,transactionHash: '0x4956140582e6e0d62885e0646ad0642b6ae060fd4658d0374cd555799fa3a843',blockHash: '0x9ec619f890cdd8e0ab6a3e0bae4846351f81f6b81125fddd444c8e7a2598d970',blockNumber: 7947792,address: '0xadD95f6bD6A0Fbd1423Bde9272dB999946A09369',id: 'log_a193869e',returnValues: Result { '0': '3', value: '3' },event: 'Increment',signature: '0x51af157c2eee40f68107a47a49c32fbbeb0a3c9e5cd37aa56e88e6be92368a81',raw: {data: '0x0000000000000000000000000000000000000000000000000000000000000003',topics: ['0x51af157c2eee40f68107a47a49c32fbbeb0a3c9e5cd37aa56e88e6be92368a81']}
}
{removed: false,logIndex: 248,transactionIndex: 169,transactionHash: '0x35163a22db0cffeeab3e2c4f6ca6f6a3f5e622982514ea98a6f99b3abc0e5d74',blockHash: '0xd8967836b9d85763611be4489042896b149b45b82f3404d530ad60a2cb8ca378',blockNumber: 7947793,address: '0xadD95f6bD6A0Fbd1423Bde9272dB999946A09369',id: 'log_97159c2a',returnValues: Result { '0': '3', value: '3' },event: 'Increment',signature: '0x51af157c2eee40f68107a47a49c32fbbeb0a3c9e5cd37aa56e88e6be92368a81',raw: {data: '0x0000000000000000000000000000000000000000000000000000000000000003',topics: ['0x51af157c2eee40f68107a47a49c32fbbeb0a3c9e5cd37aa56e88e6be92368a81']}
}============================ 7. Check the transaction error
Error: Transaction has been reverted by the EVM:
{"blockHash": "0x676c1930d40386e4011ae277099d0b0113fc9cddaff445c1ea529445f1a15d5f","blockNumber": 7947794,"contractAddress": null,"cumulativeGasUsed": 20244362,"effectiveGasPrice": 7643386,"from": "0x953baac08cad29a4e354f0833c404ed528775b68","gasUsed": 21875,"logs": [],"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","status": false,"to": "0xadd95f6bd6a0fbd1423bde9272db999946a09369","transactionHash": "0x655d2b7ce84608cec8bbc09b6092bf1aa1cf9199496152e953517e51775be7ca","transactionIndex": 143,"type": "0x0"
}at Object.TransactionError (C:\Users\26643\Downloads\Dapp-Learning-main\Dapp-Learning-main\basic\02-web3js-transaction\node_modules\web3-core-helpers\lib\errors.js:90:21)  at Object.TransactionRevertedWithoutReasonError (C:\Users\26643\Downloads\Dapp-Learning-main\Dapp-Learning-main\basic\02-web3js-transaction\node_modules\web3-core-helpers\lib\errors.js:101:21)at C:\Users\26643\Downloads\Dapp-Learning-main\Dapp-Learning-main\basic\02-web3js-transaction\node_modules\web3-core-method\lib\index.js:396:57at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {receipt: {blockHash: '0x676c1930d40386e4011ae277099d0b0113fc9cddaff445c1ea529445f1a15d5f',blockNumber: 7947794,contractAddress: null,cumulativeGasUsed: 20244362,effectiveGasPrice: 7643386,
============================ 7. Check the transaction error
Error: Transaction has been reverted by the EVM:
{"blockHash": "0x676c1930d40386e4011ae277099d0b0113fc9cddaff445c1ea529445f1a15d5f","blockNumber": 7947794,"contractAddress": null,"cumulativeGasUsed": 20244362,"effectiveGasPrice": 7643386,"from": "0x953baac08cad29a4e354f0833c404ed528775b68","gasUsed": 21875,"logs": [],"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","status": false,"to": "0xadd95f6bd6a0fbd1423bde9272db999946a09369","transactionHash": "0x655d2b7ce84608cec8bbc09b6092bf1aa1cf9199496152e953517e51775be7ca","transactionIndex": 143,"type": "0x0"
}at Object.TransactionError (C:\Users\26643\Downloads\Dapp-Learning-main\Dapp-Learning-main\basic\02-web3js-transaction\node_modules\web3-core-helpers\lib\errors.js:90:21)  at Object.TransactionRevertedWithoutReasonError (C:\Users\26643\Downloads\Dapp-Learning-main\Dapp-Learning-main\basic\02-web3js-transaction\node_modules\web3-core-helpers\lib\errors.js:101:21)at C:\Users\26643\Downloads\Dapp-Learning-main\Dapp-Learning-main\basic\02-web3js-transaction\node_modules\web3-core-method\lib\index.js:396:57at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {receipt: {blockHash: '0x676c1930d40386e4011ae277099d0b0113fc9cddaff445c1ea529445f1a15d5f',blockNumber: 7947794,contractAddress: null,cumulativeGasUsed: 20244362,effectiveGasPrice: 7643386,"from": "0x953baac08cad29a4e354f0833c404ed528775b68","gasUsed": 21875,"logs": [],"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","status": false,"to": "0xadd95f6bd6a0fbd1423bde9272db999946a09369","transactionHash": "0x655d2b7ce84608cec8bbc09b6092bf1aa1cf9199496152e953517e51775be7ca","transactionIndex": 143,"type": "0x0"
}at Object.TransactionError (C:\Users\26643\Downloads\Dapp-Learning-main\Dapp-Learning-main\basic\02-web3js-transaction\node_modules\web3-core-helpers\lib\errors.js:90:21)  at Object.TransactionRevertedWithoutReasonError (C:\Users\26643\Downloads\Dapp-Learning-main\Dapp-Learning-main\basic\02-web3js-transaction\node_modules\web3-core-helpers\lib\errors.js:101:21)at C:\Users\26643\Downloads\Dapp-Learning-main\Dapp-Learning-main\basic\02-web3js-transaction\node_modules\web3-core-method\lib\index.js:396:57at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {receipt: {blockHash: '0x676c1930d40386e4011ae277099d0b0113fc9cddaff445c1ea529445f1a15d5f',blockNumber: 7947794,contractAddress: null,cumulativeGasUsed: 20244362,effectiveGasPrice: 7643386,"type": "0x0"
}at Object.TransactionError (C:\Users\26643\Downloads\Dapp-Learning-main\Dapp-Learning-main\basic\02-web3js-transaction\node_modules\web3-core-helpers\lib\errors.js:90:21)  at Object.TransactionRevertedWithoutReasonError (C:\Users\26643\Downloads\Dapp-Learning-main\Dapp-Learning-main\basic\02-web3js-transaction\node_modules\web3-core-helpers\lib\errors.js:101:21)at C:\Users\26643\Downloads\Dapp-Learning-main\Dapp-Learning-main\basic\02-web3js-transaction\node_modules\web3-core-method\lib\index.js:396:57at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {receipt: {blockHash: '0x676c1930d40386e4011ae277099d0b0113fc9cddaff445c1ea529445f1a15d5f',blockNumber: 7947794,contractAddress: null,cumulativeGasUsed: 20244362,effectiveGasPrice: 7643386,at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {receipt: {blockHash: '0x676c1930d40386e4011ae277099d0b0113fc9cddaff445c1ea529445f1a15d5f',blockNumber: 7947794,contractAddress: null,cumulativeGasUsed: 20244362,effectiveGasPrice: 7643386,blockNumber: 7947794,contractAddress: null,cumulativeGasUsed: 20244362,effectiveGasPrice: 7643386,cumulativeGasUsed: 20244362,effectiveGasPrice: 7643386,effectiveGasPrice: 7643386,from: '0x953baac08cad29a4e354f0833c404ed528775b68',gasUsed: 21875,logs: [],logs: [],logsBloom: '0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000    logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
00',status: false,status: false,to: '0xadd95f6bd6a0fbd1423bde9272db999946a09369',transactionHash: '0x655d2b7ce84608cec8bbc09b6092bf1aa1cf9199496152e953517e51775be7ca',transactionIndex: 143,type: '0x0'}
}

相关文章:

区块链交易

文章目录 交易准备合约和代码逻辑合约compile.jsindex.js 运行 交易 项目来自https://github.com/Dapp-Learning-DAO/Dapp-Learning/blob/main/basic/02-web3js-transaction/README-cn.md 本项目包含对交易进行签名&#xff0c;发送&#xff0c;接收交易回执&#xff0c;验证…...

LeetCode 160 Intersection Of Two Linked Lists 相交链表 Java

题目&#xff1a;找到两个相交列表的起始点&#xff0c;如图c1开始为A和B两个链表的相交点 举例1&#xff1a;8为两个链表的相交点。 注意&#xff1a;相交不止是数值上的相同。 举例2&#xff1a;2为相交点 举例3&#xff1a;没有相交点 解题思路&#xff1a; 相交证明最后一…...

体育直播模板nba英超直播欧洲杯直播模板手机自适应

源码名称&#xff1a;体育直播模板nba英超直播欧洲杯直播模板手机自适应帝国cms 7.5模板 开发环境&#xff1a;帝国cms7.5 空间支持&#xff1a;phpmysql 带软件采集&#xff0c;可以挂着自动采集发布&#xff0c;无需人工操作&#xff01; 模板特点&#xff1a; 程序伪静态…...

Android Compose 图标按钮深度剖析:从源码到实践(五)

Android Compose 图标按钮深度剖析&#xff1a;从源码到实践 一、引言 在现代 Android 应用开发中&#xff0c;用户界面的交互性和美观性至关重要。图标按钮作为一种常见的 UI 元素&#xff0c;以其简洁直观的特点&#xff0c;在提升用户体验方面发挥着重要作用。Android Com…...

【Dive Into Stable Diffusion v3.5】2:Stable Diffusion v3.5原理介绍

【Dive Into Stable Diffusion v3.5】系列博文&#xff1a; 第1篇&#xff1a;开源项目正式发布——深入探索SDv3.5模型全参/LoRA/RLHF训练第2篇&#xff1a;Stable Diffusion v3.5原理介绍 目录 1 前言1.1 扩散模型的原理1.2 损失函数1.3 加噪流程1.4 推理流程1.5 negative pr…...

WPF 布局舍入(WPF 边框模糊 或 像素错位 的问题)

1. 什么是 WPF 布局舍入&#xff1f; 在 WPF 开发过程中&#xff0c;可能会遇到界面模糊、边框错位、文本渲染不清晰等问题。这些现象通常是由于 WPF 采用 设备无关像素&#xff08;DIP, Device Independent Pixels&#xff09;&#xff0c;在不同 DPI 设置下&#xff0c;UI 元…...

前端-选中pdf中的文字并使用,显示一个悬浮的翻译按钮(本地pdfjs+iframe)不适用textlayer

使用pdfjs移步– vue2使用pdfjs-dist实现pdf预览&#xff08;iframe形式&#xff0c;不修改pdfjs原来的ui和控件&#xff0c;dom层可以用display去掉一部分组件&#xff09; 方案1&#xff1a;获取选择文本内容的最前面的字符坐标的位置&#xff08;这种写法会导致如果选择超出…...

Mongodb分片模式部署

MongoDB 分片集群部署教程 1. 概述 MongoDB 分片是一种用于处理大规模数据集的集群技术。通过分片&#xff0c;MongoDB 可以将数据分布在多个服务器上&#xff0c;从而提高存储容量和读写性能。本教程将详细介绍如何从零开始部署 MongoDB 分片集群。 介绍 分片集群中主要由三…...

「一起学后端」Nest.js + MySQL 查询方法教学文档

Nest.js MySQL 查询方法教学文档 文章目录 Nest.js MySQL 查询方法教学文档1. 基础 CRUD 操作1.1 创建记录1.2 查询记录1.3 更新记录1.4 删除记录 2. 复杂查询2.1 分页与排序2.2 关联查询&#xff08;JOIN&#xff09;2.3 聚合查询2.4 子查询 3. 高级操作3.1 事务处理3.2 Typ…...

基于Spring Boot的企业内管信息化系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

【学习笔记】LLM推理与部署

文章目录 1 [LLMs inference] quantization 量化整体介绍&#xff08;bitsandbytes、GPTQ、GGUF、AWQ&#xff09;2 [LLMs inference] quantization 量化整体介绍&#xff08;bitsandbytes、GPTQ、GGUF、AWQ&#xff09;3 [LLMs serving] openrouter & vllm host LLM 推理服…...

leetcode-134.加油站

油箱容积无限&#xff0c;要求能环岛&#xff0c;说明总共加起来的油是不少于消耗量的&#xff0c;这是唯一一个决定能否环岛的变量&#xff0c;只要油量够&#xff0c;那么必定有一段路是攒油的路&#xff0c;它供给后续的消耗&#xff0c;使得油箱总是不空。 如果油量足够&am…...

companion object和object 从kotlin转java分析

说明 companion object 中 companion类中的方法是普通的方法 在外部类中生成静态变量&#xff0c;静态companion 对象 object MyClass2 中 类中方法是普通方法 在MyClass2中生成静态变量&#xff0c;静态MyClass2对象&#xff0c; 一 companion object 使用 kotlin转java pa…...

检索增强生成(2)本地PDF 本地嵌入模型

from langchain_community.document_loaders import PyPDFLoader from pathlib import Pathdef load_local_pdf(file_path):if not Path(file_path).exists():raise FileNotFoundError(f"文件 {file_path} 不存在&#xff01;")loader PyPDFLoader(file_path)try:do…...

关于TVS管漏电流的问题?

问题描述&#xff1a; 在量产的带电池故事机生产中&#xff0c;工厂产线测试电流时&#xff0c;有1台机器电流比正常机器大10mA左右。 原因分析&#xff1a; 1、分析电路原理图&#xff0c;去除可能出现问题的电压或器件&#xff08;不影响系统&#xff09;&#xff0c;发现…...

2025前端面试题记录

vue项目目录的执行顺序是怎么样的&#xff1f; 1、package.json   在执行npm run dev时&#xff0c;会在当前目录寻找package.json文件&#xff0c;此文件包含了项目的名称版本、项目依赖等相关信息。 2、webpack.config.js(会被vue-cli脚手架隐藏) 3、vue.config.js   对…...

Linux系统docker部署Ollama本地大模型及部署Hugging Face开源模型,ollama相关注意点,非ollama模型创建,模型量化,显存建议

本文主要描述在Linux系统使用docker部署ollama自有模型以及Hugging Face开源模型&#xff0c;也涉及到一些相关注意点&#xff0c;欢迎沟通讨论~ 拉取镜像 拉取ollama最新镜像&#xff1a;docker pull ollama/ollama:latest 运行ollama 执行&#xff1a;docker run -d --res…...

.NET 9 彻底改变了 API 文档:从 Swashbuckle(Swagger) 到 Scalar

示例代码下载&#xff1a;https://download.csdn.net/download/hefeng_aspnet/90404652 摘要 API 文档是现代软件开发的支柱。随着 .NET 9 从 Swashbuckle 转向 Microsoft.AspNetCore.OpenApi&#xff0c;开发人员需要新的策略来保持高效。本文探讨了这些变化&#xff0c;并介…...

C++——权限初识

权限初识 C中的访问权限主要分为三种&#xff1a; public 、 private 和 protected 。这些权限决定了类成员&#xff08;包括数据成员和成员函数&#xff09;的可访问性。以下是一个总结表格&#xff0c;说明了在不同情况下这些权限如何应用&#xff1a; 使用权限&#xff08;…...

如何让自动驾驶汽车“看清”世界?坐标映射与数据融合概述

在自动驾驶领域,多传感器融合技术是实现车辆环境感知和决策控制的关键。其中,坐标系映射和对应是多传感器融合的重要环节,它涉及到不同传感器数据在统一坐标系下的转换和匹配,以实现对车辆周围环境的准确感知。本文将介绍多传感器融合中坐标系映射和对应的数学基础和实际应…...

如何在 Linux 系统中部署 FTP 服务器:从基础配置到安全优化

一、为什么选择 Linux 部署 FTP 服务器&#xff1f; FTP&#xff08;文件传输协议&#xff09;作为互联网最早的文件传输标准&#xff0c;至今仍在企业内部文件共享、镜像站点同步等场景中广泛应用。Linux 系统凭借其稳定性、开源特性及丰富的工具链&#xff0c;成为搭建 FTP 服…...

C++——引用

目录 举个例子&#xff1a; 引用的基本特性 引用的定义语法如下&#xff1a; 1. 引用必须初始化&#xff1a; 2. 引用是别名&#xff1a; 3. 引用不能为空&#xff1a; 4. 引用不能重新绑定&#xff1a; 引用的使用场景 函数参数传递&#xff1a; 函数返回值&#xf…...

unity开发效率提升笔记

本文将记录提升Unity开发效率的若干细节&#xff0c;持续更新 一.VSCode文件标签多行显示 1.File->Preference->Settings (快捷键Ctrl 逗号) 2.搜索workbench.editor.wrapTabs 3.勾选上这个单选开关 若依然不是多行 4.搜索workbench.editor.tabSizing,选择fi…...

VScode页面错误,可以编译C++20版本,但页面显示有错误的解决方案

问题回顾 学习信号量时使用到了C20版本的一些变量&#xff0c;可以正常编译和运行&#xff0c;但在编辑器上显示存在错误&#xff0c;如图所示 显示结果&#xff0c;提示命名空间std没有成员变量counting_semaphore&#xff0c;如图所示 解决办法 1、确保自己安装了C/C插件…...

[WEB开发] JDBC

一. JDBC基础 JDBC (Java DataBase Connectivity): 就是使用 java 语言操作数据库的一套API. JDBC本质: 一套标准接口, 规范各个数据库厂商实现这套接口, 提供驱动使用接口, 真正执行的是实现类 二. 实战 2.1 非预编译sql // 1. 注册数据库驱动Class.forName("com.my…...

Linux shell脚本2-test条件测试语句:文件类型、字符串是否相等、数字大小比较、多重条件判断,测试语句验证

目录 1.条件测试语句 2.文件表达式测试 2.1测试文件状态的条件表达式 2.2程序验证 2.2.1 单个文件验证 2.2.3.两个文件验证 3.字符串表达式测试 4.数字表达式测试 5.复合表达式测试 1.条件测试语句 在写shell脚本时&#xff0c;经常遇到的问题就是判断字符串是否相等&…...

linux_git使用

1. git的历史 git是开源的 2. git的理解 版本控制 只进行管理源文件 3. git的使用 3.1. git命令安装 sudo yum install git sudo apt install -y git 查看是否安装成功 $git --version 3.2. git使用注意事项 首次使用git需要输入用户名和邮件 gitignore&#xff1…...

Linux网络相关概念和重要知识(2)(UDP套接字编程、聊天室的实现、观察者模式)

目录 1.UDP套接字编程 &#xff08;1&#xff09;socket编程 &#xff08;2&#xff09;UDP的使用 ①socket ②bind ③recvfrom ④sendto 2.聊天室的实现 &#xff08;1&#xff09;整体逻辑 &#xff08;2&#xff09;对sockaddr_in的封装 &#xff08;3&#xff09…...

2025年03月18日柯莱特(外包宁德)一面前端面试

目录 自我介绍你怎么从0到1搭建项目的webpack 的构建流程手写webpack插件你有什么想问我的吗 2. 你怎么从 0 到 1 搭建项目的 在面试中回答从 0 到 1 搭建前端项目&#xff0c;可按以下详细步骤阐述&#xff1a; 1. 项目前期准备 需求理解与分析 和产品经理、客户等相关人…...

汇川EASY系列之以太网通讯(MODBUS_TCP做主站)

汇川Easy系列以太网通讯中(MODBUSTCP,plc做主站),终于可以不用使用指令就可以完成了,全程通过简单的配置就可通讯。本文将通过EASY系列PLC与调试助手之间完成此操作。具体演示如下; 关于主站和从站的介绍 A/请求:即主动方 向被动方发送的一个要求的信息。 B/主站:发…...

uni-app jyf-parser将字符串转化为html 和 rich-text

uni-app jyf-parser将字符串转化为html-CSDN博客 方法二&#xff1a; rich-text | uni-app...

PyTorch中Batch Normalization1d的实现与手动验证

PyTorch中Batch Normalization1d的实现与手动验证 一、介绍 Batch Normalization&#xff08;批归一化&#xff09;是深度学习中常用的技术&#xff0c;用于加速训练并减少对初始化的敏感性。本文将通过PyTorch内置函数和手动实现两种方式&#xff0c;展示如何对三维输入张量…...

LoRA中黑塞矩阵、Fisher信息矩阵是什么

LoRA中黑塞矩阵、Fisher信息矩阵是什么 1. 三者的核心概念 黑塞矩阵(Hessian) 二阶导数矩阵,用于优化问题中判断函数的凸性(如牛顿法),或计算参数更新方向(如拟牛顿法)。 Fisher信息矩阵(Fisher Information Matrix, FIM) 统计学中衡量参数估计的不确定性,反映数据…...

Transformer中,Fisher矩阵与权重之间关系

Transformer中,Fisher矩阵与权重之间关系 目录 Transformer中,Fisher矩阵与权重之间关系一、Fisher矩阵与Transformer权重的关系二、Fisher矩阵的更新方式三、举例说明给出案例:Transformer权重矩阵,Fisher矩阵,说明对应关系和怎么更新二阶导数计算需要大量算力有什么方法…...

本地安装deepseek大模型,并使用 python 调用

首先进入 ollama 官网 https://ollama.com/点击下载 下载完成后所有都是下一步&#xff0c;就可以 点击搜索 Models &#xff1a; https://ollama.com/search然后点击下载&#xff1a; 选择后复制: ollama run deepseek-r1:32b例如&#xff1a; 让它安装完成后&#xff1…...

asp.net mvc 向前端响应json数据。用到jquery

最近在给客户开发提醒软件时&#xff0c;用asp.net mvc 开发。该框架已经集成了bootstrap,直接贴asp.net mvc 端代码&#xff1a; {Layout null; }<!DOCTYPE html><html> <head><meta name"viewport" content"widthdevice-width" /…...

《基于深度学习的指纹识别智能门禁系统》开题报告

个人主页&#xff1a;大数据蟒行探索者 1研究背景 1.1开发目的和意义 指纹识别作为生物特征识别领域的一项重要技术&#xff0c;在安全认证、犯罪侦查和个人身份验证等方面具有广泛应用前景。随着深度学习技术的迅猛发展&#xff0c;基于深度学习的指纹识别系统成为了当前研究…...

数据预处理流程与关键步骤解析

数据预处理流程图&#xff08;Markdown格式&#xff09;&#xff1a; #mermaid-svg-b3mhJcpFWaJ9qMZ8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-b3mhJcpFWaJ9qMZ8 .error-icon{fill:#552222;}#mermaid-svg-b3m…...

单片机开发资源分析实战——以STM32F103ZET6为例子,分析我们的单片机

目录 第一件事情&#xff1a;为什么叫STM32F103ZET6 分析我们的资源手册 第二件事情&#xff0c;关心我们的GPIO引脚输出 第三件事情&#xff1a;去找对应外设的说明部分 本文章隶属于项目&#xff1a; Charliechen114514/BetterATK: This is a repo that helps rewrite ST…...

uv命令介绍(高性能Python包管理工具,旨在替代pip、pip-tools和virtualenv等传统工具)

文章目录 **主要功能**1. **快速安装和管理 Python 包**2. **生成和管理锁文件 (requirements.lock)**3. **创建虚拟环境**4. **与 poetry 兼容** **核心优势**1. **极快的速度**&#xff1a;基于 Rust 实现&#xff0c;利用多线程和缓存大幅加速依赖解析。2. **轻量且独立**&a…...

React Native进阶(六十):webview实现屏蔽所嵌套web页面异常弹窗

文章目录 一、前言二、解决方案三、注意事项四、拓展阅读 一、前言 在React Native项目集成web页面时&#xff0c;webview嵌套方式是常用方式。如果所嵌套的web页面由于某种不可控因素导致出现错误弹窗信息&#xff0c;webview作为web嵌套方式应该对其行为可控。 React Nativ…...

IS-IS原理与配置

一、IS-IS概述 IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是ISO&#xff08;International Organization for Standardization&#xff0c;国际标准化组织&#xff09;为它的CLNP&#xff08;ConnectionLessNet…...

响应式CMS架构优化SEO与用户体验

内容概要 在数字化内容生态中&#xff0c;响应式CMS架构已成为平衡搜索引擎可见性与终端用户体验的核心载体。该系统通过多终端适配技术&#xff0c;确保PC、移动端及平板等设备的内容渲染一致性&#xff0c;直接降低页面跳出率并延长用户停留时长。与此同时&#xff0c;智能S…...

mysql 主从配置

核心概念&#xff1a; 主服务器&#xff08;Master&#xff09;&#xff1a;负责处理客户端的写操作&#xff0c;并将数据更改记录到二进制日志&#xff08;binlog&#xff09;中。从服务器&#xff08;Slave&#xff09;&#xff1a;负责读取主服务器的二进制日志&#xff0c;…...

Windows下编译安装Qt5.15.0指南

1. 系统要求 操作系统: Windows 7 或更高版本&#xff08;推荐 Windows 10/11&#xff09;。 磁盘空间: 至少 20-30 GB&#xff08;编译过程会生成大量中间文件&#xff09;。 内存: 建议 8GB 或更高。 编译器: 需要安装 Visual Studio&#xff08;推荐 MSVC 2017 或 MSVC 2…...

001-JMeter的安装与配置

1.前期准备 下载好JMeter : https://jmeter.apache.org/download_jmeter.cgi 下载好JDK : :Java Downloads | Oracle 中国 下载图中圈蓝的JMeter和JDK就行&#xff0c;让它边下载&#xff0c;我们边往下看 2.为什么要下载并安装JDK ? JMeter 是基于 Java 开发的工具&#…...

kube-score K8S Yaml静态代码分析工具详解

kube-score 是一款专注于 Kubernetes 配置文件的静态代码分析工具&#xff0c;旨在通过自动化检查帮助用户识别资源配置中的潜在问题&#xff0c;并遵循最佳实践以提升集群的安全性、稳定性和性能。以下是其核心功能、使用方法和应用场景的详细解析&#xff1a; 一、核心功能与…...

【Go】Go语言结构体笔记

整体介绍 虽然 Go 语言不是传统意义上的面向对象语言&#xff0c;但它提供了结构体&#xff08;struct&#xff09;来组织数据&#xff0c;并且可以为结构体绑定方法&#xff0c;从而达到面向对象的部分效果。 关键知识点包括&#xff1a; 结构体定义与实例化 定义结构体时使用…...

Oracle数据库性能优化全攻略:十大关键方向深度解析与实践指南

文章目录 一、SQL查询优化二、索引优化三、内存管理四、I/O优化五、分区表与分区索引六、并行处理七、统计信息管理八、锁与并发控制九、数据库参数调优十、应用设计优化结论 在当今数据驱动的时代&#xff0c;数据库的性能优化成为了确保企业应用高效运行的关键。Oracle作为业…...

Modern C++面试题及参考答案

目录 解释右值引用的定义及其与左值引用的核心区别 std::move 的实现原理是什么?为什么它本身不执行移动操作? 移动构造函数与拷贝构造函数的调用场景有何不同? 实现一个支持移动语义的类需要遵循哪些原则? 完美转发(Perfect Forwarding)的实现原理及 std::forward 的…...