Задать вопрос
Контакты
Местоположение
Россия

Достижения

Все достижения (1)

Наибольший вклад в теги

Все теги (16)

Лучшие ответы пользователя

Все ответы (12)
  • Как telegra.ph понимает, что я - это я?

    @psy667
    Node.js backend developer
    Там используются HttpOnly cookie. То есть сами cookie есть, но в браузере не видны, также к ним нельзя получить доступ из клиентского кода.
    В запросе /check можно увидеть, что в response headers они устанавливаются.
    Set-Cookie: tph_uuid=<token>; expires=Wed, 08 Feb 2023 05:42:55 GMT; path=/; secure; HttpOnly
    Ответ написан
    1 комментарий
  • Как запустить телеграм бота из-за прокси?

    @psy667
    Node.js backend developer
    Установите последние версии библиотек gunicorn, PySocks, pyTelegramBotAPI, requests и urllib3

    Затем попробуйте использовать другой прокси, например этот
    ip = '195.201.137.246'
    port = '1080'
    
    apihelper.proxy = {
      'https': 'socks5://{}:{}'.format(ip,port)
    }
    Ответ написан
    2 комментария
  • Как уменьшить крайние цвета градиента?

    @psy667
    Node.js backend developer
    Можно указать конкретное положение цвета процентами
    background: linear-gradient(90deg, #333 0%, #f00 20%, #f00 80%, #333 100%);

    В этом примере от начала до 20% фона будет переход от #333 к #f00, затем сплошной #f00 от 20% до 80%, от 80% и до конца займет переход с #f00 до #333.

    Альтернативный способ сделать такой же градиент:
    background: linear-gradient(90deg, #333, #f00, #f00, #f00, #333);
    Ответ написан
    Комментировать
  • Можете подсказать почему не запускается?

    @psy667
    Node.js backend developer
    Пофиксил ошибки в коде, теперь работает
    const crypto = await import("crypto");
    
    const SHA256 = message => crypto.createHash("sha256").update(message).digest("hex");
    const elliptic = await import("elliptic");
    const EC = elliptic.default.ec;
    const ec = new EC("secp256k1");
    const MINT_KEY_PAIR = ec.genKeyPair();
    const MINT_PUBLIC_ADDRESS = MINT_KEY_PAIR.getPublic("hex");
    const holderKeyPair = ec.genKeyPair();
    
    // const keyPair = ec.genKeyPair();
    // public key: key.Pair.getPublic("hex");
    // private key: key.Pair.get.Private("hex");
    
    class Block {
        constructor(timestamp = "", data = []) {
            this.timestamp = timestamp;
            this.data = data;
            this.hash = this.getHash();
            this.prevHash = "";
            this.nonce = 0;
        }
        
        getHash() {
            return SHA256(JSON.stringify(this.data) + this.timestamp + this.prevHash + this.nonce);
        }
    
        mine(difficulty) {
            while(!this.hash.startsWith(Array(difficulty + 1).join("0"))){
                this.nonce++;
                this.hash = this.getHash();
            }
        }
    
        hasValidTransactions(chain) {
            return this.data.every(transaction => transaction.isValid(transaction, chain));
        }
    }
    
    class Blockchain {
        constructor() {
            const initialCoinRelease = new Transaction(MINT_PUBLIC_ADDRESS, holderKeyPair.getPublic("hex"), 100000)
            this.chain = [new Block(Date.now().toString(), [initialCoinRelease])];
            this.difficulty = 1;
            this.blockTime = 30000;
            this.transactions = [];
            this.reward = 297;
        }
    
        getLastBlock() {
            return this.chain[this.chain.length - 1]
        }
    
        getBalance(address) {
            let balance = 0;
    
            this.chain.forEach(block => {
                block.data.forEach(transaction => {
                    if(transaction.from === address) {
                        balance -= transaction.amount;
                        balance -= transaction.gas;
                    }
    
                    if(transaction.to === address) {
                        balance += transaction.amount;
                    }
                })
            })
    
            return balance;
        }
    
        addBlock(block) {
            block.prevHash = this.getLastBlock().hash;
            block.hash = block.getHash();
    
            block.mine(this.difficulty);
    
            this.chain.push(block);
    
            this.difficulty += Date.now() - parseInt(this.getLastBlock().timestamp) < this.blockTime ? 1 : -1;
        }
    
        addTransaction(transaction) {
            if (transaction.isValid(transaction, this)) {
                this.transactions.push(transaction);
            }
            
        }
    
        mineTransactions(rewardAddress) {
            let gas = 0;
    
            this.transactions.forEach(transaction => {
                gas += transaction.gas;
            })
    
            const rewardTransaction = new Transaction(MINT_PUBLIC_ADDRESS, rewardAddress, this.reward + gas);
            rewardTransaction.sign(MINT_KEY_PAIR);
    
            if (this.transactions.length !==0) this.addBlock(new Block(Date.now().toString(), [rewardTransaction, ...this.transactions]));
    
            this.transactions = [];
        }
    
        isValid(blockchain = this) {
            for (let i = 1; i < blockchain.chain.length; i++) {
                const currentBlock = blockchain.chain[i];
                const prevBlock = blockchain.chain[i-1];
    
                if (
                    currentBlock.hash !== currentBlock.getHash() || 
                    currentBlock.prevHash !== prevBlock.hash ||
                    currentBlock.hasValidTransactions(blockchain)
                    ) {
                    return false;
                }
            }
            return true;
        }
    }
    
    class Transaction {
        constructor(from, to, amount, gas = 0) {
            this.from = from;
            this.to = to;
            this.amount = amount;
            this.gas = gas;
        }
    
        sign(keyPair) {
            if (keyPair.getPublic("hex") === this.from) {
                this.signature = keyPair.sign(SHA256(this.from + this.to + this.amount + this.gas), "base64").toDER("hex");
            }
        }
    
        isValid(tx, chain) {
            return (
                tx.from &&
                tx.to &&
                tx.amount &&
                (chain.getBalance(tx.from) >= tx.amount + tx.gas || tx.from === MINT_PUBLIC_ADDRESS && tx.amount === this.reward) &&
                ec.keyFromPublic(tx.from, "hex").verify(SHA256(tx.from + tx.to + tx.amount + tx.gas), tx.signature)
            )
        }
    }
    
    const Palihchain = new Blockchain();
    
    // Your original balance is 100000
    
    const girlfriendWallet = ec.genKeyPair();
    
    const transaction = new Transaction(holderKeyPair.getPublic("hex"), girlfriendWallet.getPublic("hex"), 333, 10);
    
    transaction.sign(holderKeyPair);
    
    Palihchain.addTransaction(transaction);
    
    Palihchain.mineTransactions(girlfriendWallet.getPublic("hex"));
    
    console.log("Your balance:", Palihchain.getBalance(holderKeyPair.getPublic("hex")));
    console.log("Her balance:", Palihchain.getBalance(girlfriendWallet.getPublic("hex")));
    Ответ написан
    8 комментариев
  • Почему поля класса не проинициализированы?

    @psy667
    Node.js backend developer
    this в обработчике ссылается на класс Client, а не на ServiceFactory. Чтобы исправить можно сделать так
    this.#client.on('qr', this.#onQr.bind(this));
    либо сделать метод #onQr стрелочной функцией
    Ответ написан
    1 комментарий