比特币智能合约入门(4)- sCrypt 合约实战篇 - P2PKH 合约化
上一篇文章主要介绍了 sCrypt 语言开发利器 sCrypt Visual Studio Code 插件 的相关功能。现在我们就要实操起来,体验一下 sCrypt 合约完整的设计、开发、测试、部署、及调用全流程。
设计
构建任何一个智能合约的第一步都是从想法出发完成一个设计,这里我们选择将一种比特币网络中常见的交易类型(P2PKH)进行 sCrypt 合约化。把这个过程作为示例的主要原因有两个:
- P2PKH 是目前比特币网络中最主要的一种交易类型,对于初学者来说很有必要了解;
- 通过将这个经典交易类型合约化,可以让大家更直观地了解 sCrypt 的能力及使用方法;
P2PKH 是什么?
P2PKH 的全称是 Pay To Public Key Hash,是比特币网络中最常见的交易类型,用于实现转账功能。
它的锁定脚本为:
OP_DUP OP_HASH160 <Public Key Hash> OP_EQUALVERIFY OP_CHECKSIG
它的解锁脚本为:
<Signature> <Public Key>
咱们还是拿本系列第一篇文章中讲的那个例子来说说它的原理和实现。
P2PKH - 接收
如果有人要给我转比特币,首先我需要把自己的公钥哈希值(即通常说的比特币地址,相当于我的银行卡号)告诉他,然后对方使用这个值构造 P2PKH 锁定脚本(这里记为 LS-1)并将交易发送给矿工,矿工验证无误后将交易记录到链上。
P2PKH - 花费
现在,当我想花费这个比特币的时候,需要提供两个信息才能构造解锁脚本:
- 原始公钥信息(上述公钥哈希值是由它计算出来的1);
- 使用原始公钥所对应的私钥计算出的交易签名2信息;
构造出解锁脚本后,再使用收款人的公钥哈希值构建新的锁定脚本,最后把交易广播出去。
P2PKH - 验证
当矿工收到我这笔新交易时,需要验证其合法性,主要涉及两个步骤:
-
将解锁脚本与 UTXO 中的锁定脚本(即前述 LS-1)连接起来形成完整的验证脚本:
<Signature> <Public Key> OP_DUP OP_HASH160 <Public Key Hash> OP_EQUALVERIFY OP_CHECKSIG
-
使用虚拟机执行这个验证脚本,检查执行结果是否有效。实际上,验证过程中最关键的检查也有两个:
2.1. 验证解锁脚本中提供的公钥信息能否计算出锁定脚本中的公钥哈希值。如果通过则说明这个公钥确实是之前交易的接收方地址(相当于验证了之前转账的接收地址是我的银行卡号);
2.2. 验证解锁脚本中提供的签名与公钥信息是否吻合。如果通过则说明我确实掌握与这个公钥所对应的私钥控制权(相当于验证了我有这个银行卡号的密码);
合法性验证通过,证明我确实拥有并可以支配这个比特币,那么矿工就会把这笔新的花费交易记录到链上。这就是 P2PKH 类型交易的主要过程和原理。
综上,我们进行合约设计的目标也非常明确:实现一个和 P2PKH 功能完全等价的 sCrypt 合约。
开发
有了设计思路和目标我们就可以搞起来,首先当然是在 VS Code 里装上 sCrypt 插件(如上篇文章所述)。
sCrypt 提供了一个样板项目方便大家快速学习开发测试合约。这是一个不错的起点,我们也从这里开始,首先克隆项目到本地,使用命令:
git clone git@github.com:scrypt-sv/boilerplate.git
实际上该项目中已经包含了我们想要的 P2PKH 合约,所以直接来看代码(文件为 contracts/p2pkh.scrypt
):
contract DemoP2PKH {Ripemd160 pubKeyHash;constructor(Ripemd160 pubKeyHash) {this.pubKeyHash = pubKeyHash;}public function unlock(Sig sig, PubKey pubKey) {require(hash160(pubKey) == this.pubKeyHash);require(checkSig(sig, pubKey));}
}
合约也很简单,主体包括:
- 一个类型为
Ripemd160
的属性变量pubKeyHash
。对应于之前 P2PKH 锁定脚本中的<Public Key Hash>
; - 构造函数
constructor
。用于完成属性变量的初始化; - 一个自定义名为
unlock
的公共函数。参数类型分别为Sig
及PubKey
,对应于之前 P2PKH 解锁脚本中的<Signature>
及<Public Key>
;实现逻辑也对应着前面讲的 P2PKH 验证。
对比之前 Script 形式的验证脚本,相信大部分朋友都会认同 sCrypt 的代码更容易学习和编写。而且合约逻辑功能越复杂,sCrypt 的优势就能体现的越明显。
单元测试
有了代码接下来就要验证其功能实现是否正确,这时候常规的方法是增加一些单元测试。针对上述合约的测试文件为 tests/js/p2pkh.scrypttest.js
,代码如下:
const path = require('path');
const { expect } = require('chai');
const { buildContractClass, bsv } = require('scrypttest');/*** an example test for contract containing signature verification*/
const { inputIndex, inputSatoshis, tx, signTx, toHex } = require('../testHelper');const privateKey = new bsv.PrivateKey.fromRandom('testnet')
const publicKey = privateKey.publicKey
const pkh = bsv.crypto.Hash.sha256ripemd160(publicKey.toBuffer())
const privateKey2 = new bsv.PrivateKey.fromRandom('testnet')describe('Test sCrypt contract DemoP2PKH In Javascript', () => {let demolet sigbefore(() => {const DemoP2PKH = buildContractClass(path.join(__dirname, '../../contracts/p2pkh.scrypt'), tx, inputIndex, inputSatoshis)demo = new DemoP2PKH(toHex(pkh))});it('signature check should succeed when right private key signs', () => {sig = signTx(tx, privateKey, demo.getLockingScript())expect(demo.unlock(toHex(sig), toHex(publicKey))).to.equal(true);/** print out parameters used in debugger, see ""../.vscode/launch.json" for an exampleconsole.log(toHex(pkh))console.log(toHex(sig))console.log(toHex(publicKey))console.log(tx.uncheckedSerialize())*/});it('signature check should fail when wrong private key signs', () => {sig = signTx(tx, privateKey2, demo.getLockingScript())expect(demo.unlock(toHex(sig), toHex(publicKey))).to.equal(false);});
});
熟悉 Javascript 的朋友可能一下就辨识出这是一个基于 mocha + chai
框架的纯 JS 测试文件。让我们再进一步看看这个测试用例。
首先导入 sCrypt 的 Javascript / Typescript 测试库 scrypttest 函数:
const { buildContractClass, bsv } = require('scrypttest');
使用工具函数 buildContractClass
得到合约 DemoP2PKH
在 Javascript 中反射的类对象:
const DemoP2PKH = buildContractClass(path.join(__dirname, '../../contracts/p2pkh.scrypt'), tx, inputIndex, inputSatoshis)
使用初始化参数(即公钥哈希的 hex 格式)实例化合约类:
demo = new DemoP2PKH(toHex(pkh))
测试合约实例的公共方法,其应当成功时:
sig = signTx(tx, privateKey, demo.getLockingScript())
expect(demo.unlock(toHex(sig), toHex(publicKey))).to.equal(true);
或其应当失败时(因为使用错误的私钥导致签名无法通过验证):
sig = signTx(tx, privateKey2, demo.getLockingScript())
expect(demo.unlock(toHex(sig), toHex(publicKey))).to.equal(false);
在运行测试之前,我们需要在项目的根目录中运行 npm install
确保测试依赖都已成功安装;之后在 VS Code 的编辑器中右键这个测试文件,选择 “Run sCrypt Test”;运行结果在 “OUTPUT” 视图中查看。
Debug
仅有上述单元测试也还是不够的,因为当单测出错时我们只能得到最终结果,而没有其内部更多信息帮助我们解决合约本身的代码问题。这个时候就需要使用 sCrypt 插件的 Debug 功能了。
在 .vscode/launch.json
文件中我们可以找到针对 DemoP2PKH 合约的 Debug 配置项:
{"type": "scrypt","request": "launch","name": "Debug P2PKH","program": "${workspaceFolder}/contracts/p2pkh.scrypt","constructorParams": "Ripemd160(b'2bc7163e0085b0bcd4e0efd1c537537053aa13f2')","entryMethod": "unlock","entryMethodParams": "Sig(b'30440220729d3935d496e5a708a6a1d4c61dcdd1bebae6f0e0b63b9b9eb1b7616cdbbc2b02203b58cdde0133a6e90d921ecee6ecafca7000a13a3e38673810b4c6badd8d952041'), PubKey(b'03613fa845ad3fe1ef4fe9bbf0b50a1cb5219dd30a0c4e3e4e46fb218313af9220')","txContext": {"hex": "01000000015884e5db9de218238671572340b207ee85b628074e7e467096c267266baf77a40000000000ffffffff0000000000","inputIndex": 0,"inputSatoshis": 100000}
}
我们来解释下其中的关键参数:
program
: 指定该配置具体执行的合约文件;constructorParams
: 指定合约的构造函数参数列表,如果有多个时使用逗号连接;另外,如果合约没有显示的构造函数时,编译器会自动生成一个默认构造函数,所以也需要将其属性按顺序当做构造函数参数列表传入。entryMethod
:指定要调试的公共函数名;entryMethodParams
:指定要调试公共函数的实参列表,同样如果有多个需用逗号连接;txContext
:指定调试时当前交易的相关上下文信息,其中:hex
:交易的 HEX 格式表示,可以是签名过的(signed transaction),也可以是未签名的(unsigned transaction);inputIndex
:要花费的、被合约锁定的 UTXO 所对应的 input 序号;inputSatoshis
: 要花费的、被合约锁定的 UTXO 中比特币数量,单位 satoshis;
注意: constructorParams
和 entryMethodParams
中的参数都必须与合约中对应的参数保持(子)类型一致,且必须为 sCrypt 语法。否则,启动调试时会报错提示参数问题。
那么上述关键参数是如何得到的呢?我们再回看一下之前的测试文件,发现其中有一段注释其实是可以打开运行的:
/** print out parameters used in debugger, see ""../.vscode/launch.json" for an exampleconsole.log(toHex(pkh))console.log(toHex(sig))console.log(toHex(publicKey))console.log(tx.uncheckedSerialize())
*/
这些输出也正是 Debug 配置时需要的参数,同理其他的合约也可以用类似的方法得到所需。
配置妥当之后,就可以使用 “F5” 快捷键启动代码调试了。调试器的具体功能和使用方法也可以参见上一篇文章 和 VS Code 官方文档。
测试网上部署和调用
在生产环境中使用合约之前,开发者应当在测试网(Testnet )上进行必要的测试以保证合约代码符合预期。针对本文的例子,可以在项目根目录中使用命令 node tests/testnet/p2pkh.js
来运行。
准备工作
当我们首次运行该文件时,会看到类似这样的输出结果:
New privKey generated for testnet: cMtFUvwk43MwBoWs15fU15jWmQEk27yJJjEkWotmPjHHRuXU9qGq
With address: moJnB7AND5TW8suRmdHPbY6knpfE1uJ15n
You could fund the address on testnet & use the privKey to complete the test
因为正常运行代码有两个前提条件:
- 需要一个测试网上的私钥;
- 该私钥对应地址中已经有足够测试用的 BSV(至少 10000+ satoshis);
如果你已经有这样的私钥,可以找到并修改下面这行代码(使用 WIF 格式的私钥替代空字符):
const privKey = ''
当然,你也可以直接使用上面输出中的私钥,但需要先为输出中的地址获取测试币(比如在这个网站上领取)。
运行结果
做好前述准备工作后,就可以再次运行这个用例了。正常情况下可以看到以下输出:
Contract Deployed Successfully! TxId: bc929f1dddc6652896c7c162314e2651fbcd26495bd1ccf9568219e22fea2fb8
Contract Method Called Successfully! TxId: ce2dba497065d33c1e07bf710ad94e9600c6413e053b4abec2bd8562aea3dc20
上述结果显示合约部署和调用都已经成功,可以去这个BSV 区块链浏览器中查看对应的交易详情。
代码说明
在 tests/testnet/p2pkh.js
文件中可以查看完整的代码:
const path = require('path')
const { exit } = require('process')const {buildContractClass,showError,bsv
} = require('scrypttest')const {toHex,createLockingTx,createUnlockingTx,signTx,sendTx
} = require('../testHelper')function getUnlockingScript(method, sig, publicKey) {if (method === 'unlock') {return toHex(sig) + ' ' + toHex(publicKey)}
}async function main() {try {// private key on testnet in WIFconst privKey = 'cVWvTt4tVqCHgSchQpUHch7EHcDbfXeYZnYbuqXYxpPbXQWPtrxV'if (!privKey) {const newPrivKey = new bsv.PrivateKey.fromRandom('testnet')console.log('New privKey generated for testnet: ' + newPrivKey.toWIF())console.log('With address: ' + newPrivKey.toAddress())console.log('You could fund the address on testnet & use the privKey to complete the test') // for example get bsv from: https://faucet.bitcoincloud.net/exit(1)}const privateKey = new bsv.PrivateKey.fromWIF(privKey)const publicKey = privateKey.publicKey// Initialize contractconst P2PKH = buildContractClass(path.join(__dirname, '../../contracts/p2pkh.scrypt'))const publicKeyHash = bsv.crypto.Hash.sha256ripemd160(publicKey.toBuffer())const p2pkh = new P2PKH(toHex(publicKeyHash))// deploy contract on testnetconst amountInContract = 10000const deployTx = await createLockingTx(privateKey.toAddress(), amountInContract)const lockingScript = p2pkh.getLockingScript()deployTx.outputs[0].setScript(bsv.Script.fromASM(lockingScript))deployTx.sign(privateKey)const deployTxId = await sendTx(deployTx)console.log('Contract Deployed Successfully! TxId: ', deployTxId)// call contract method on testnetconst spendAmount = amountInContract / 10const methodCallTx = createUnlockingTx(deployTxId, amountInContract, lockingScript, spendAmount, privateKey.toAddress())const sig = signTx(methodCallTx, privateKey, lockingScript, amountInContract)const unlockingScript = getUnlockingScript('unlock', sig, publicKey)methodCallTx.inputs[0].setScript(bsv.Script.fromASM(unlockingScript))const methodCallTxId = await sendTx(methodCallTx)console.log('Contract Method Called Successfully! TxId: ', methodCallTxId)} catch (error) {console.log('Failed on testnet')showError(error)}
}main()
为了方便大家理解,我们一起来看看合约部署和调用的具体实现。
- 合约部署:
-
创建一个新的锁定交易:
const deployTx = await createLockingTx(privateKey.toAddress(), amountInContract)
-
获取合约对应的锁定脚本:
const lockingScript = p2pkh.getLockingScript()
-
设置对应 output 的脚本为上述锁定脚本:
deployTx.outputs[0].setScript(bsv.Script.fromASM(lockingScript))
-
交易签名:
deployTx.sign(privateKey)
-
发送交易到服务节点:
const deployTxId = await sendTx(deployTx)
- 合约调用:
-
创建新的解锁交易:
const methodCallTx = createUnlockingTx(deployTxId, amountInContract, lockingScript, spendAmount, privateKey.toAddress())
-
获取对此交易的签名:
const sig = signTx(methodCallTx, privateKey, lockingScript, amountInContract)
-
获取合约方法调用所对应的解锁脚本:
const unlockingScript = getUnlockingScript('unlock', sig, publicKey)
-
设置对应 input 的脚本为上述解锁脚本;
methodCallTx.inputs[0].setScript(bsv.Script.fromASM(unlockingScript))
-
发送交易到服务节点:
const methodCallTxId = await sendTx(methodCallTx)
注意:不同合约的部署和调用实现会有差异,但大致流程与此例类似。
结束语
说到这里,比特币智能合约入门这个系列也结束了。我期望能够通过这样的方式,让感兴趣的朋友更多地了解和参与到智能合约的开发中,用区块链的技术创造更多的可能性。也请大家继续保持关注,谢谢:)
附录
公钥哈希计算方式:先计算公钥的 SHA256 哈希值,再计算前述结果的 RIPEMD160 哈希值, 得到 20字节的公钥哈希值。 ↩︎
交易签名(Signature)更为详细的介绍可参考这个文档。 ↩︎
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- java读取键盘输入字符
package ddong;import java.io.*;public class Helloworld {public static void main(String[] args) throws IOException {char i;BufferedReader br = new BufferedReader(new InputStreamReader(System.in));System.out.println("输入字符, 按下 b 键退出。");do …...
2024/5/8 17:17:43 - 射频电路的原理,发展及应用
一.什么是射频电路? 射频简称RF,射频就是射频电流,它是一种高频交流变化电磁波的简称。每秒变化小于1000次的交流电称为低频电流,大于1000次的称为高频电流,而射频就是这样一种高频电流。 射频电路指处理信号的电磁波长与电路或器件尺寸处于同一数量级的电路。此时由于器…...
2024/5/9 5:04:32 - MySQL配置
环境变量 cd ~ vim ./.bash_profileexport PATH=$PATH:/usr/local/mysql/bin export PATH=$PATH:/usr/local/mysql/support-files第四步 :在终端界面下输入以下命令,让配置文件的修改生效,并查看环境变量是否设置成功 source ~/.bash_profile echo $PATH停止MySQL服务 sudo…...
2024/5/8 18:08:00 - request是全局的,任何地方都能获取到
from flask import Flask from flask import request # 这个request是全局的,任何地方都能获取到 from flask import render_template from flask import redirect from flask import make_response from flask import jsonify # 返回json格式数据 app = Flask(name) @app.r…...
2024/4/18 23:40:00 - plt.hist绘制直方图参数density 为True和False分别代表是否归一化 参数orientation决定了是采用纵轴代表频率还是横轴代表频率的展现形式
plt.hist绘制直方图参数density 为True和False分别代表是否归一化 参数orientation决定了是采用纵轴代表频率还是横轴代表频率的展现形式plt.figure() plt.figure(figsize=(12,12), dpi=80) plt.subplot(231) #plt.plot([i for i in range(len(fresh))],fresh) plt.hist(fresh…...
2024/4/17 9:38:16 - 哔哩哔哩也要赴港二次上市了?B站回应:不予置评
哔哩哔哩也要赴港二次上市了?B站回应:不予置评转载自: https://www.sohu.com/a/406676888_115708?scm=1002.590044.0.274d-a7&spm=smpc.ch30.content1-n-5.4.1594291429863fNyOxAS7月9日,据外媒报道,据两位知情人士透露,视频网站哔哩哔哩正考虑加入其他在美上市中国公…...
2024/4/16 3:49:28 - 面向汽车应用的硬件推理芯片
面向汽车应用的硬件推理芯片 Hardware inference chip targets automotive applications 总部位于匈牙利的AImotive是一家基于软件和硬件的自动驾驶技术的开发商,该公司已开始向其主要客户发货其aiWare3神经网络(NN)硬件推理引擎知识产权(IP)。 aiWare3P IP核去年发布,为…...
2024/4/4 20:17:54 - Linux 源代码编译详解与应用程序基础.
Linux目录结构: 普通执行程序文件:/usr/bin 服务器执行程序文件和管理程序文件: /usr/sbin 应用程序配置文件: /etc 日志文件:/var/log 应用程序参考文档文件: /usr/share/doc 应用程序手册页文件: /usr/share/man 常见的软件包封装类型 RPM软件包: 扩展名为“.rpm” D…...
2024/4/16 3:49:43 - 高性能MySQL第三版-第一章(笔记)
高性能MySQL第三版-第一章 [提前声明] 大数据代码案例地址: https://github.com/Mydreamandreality/sparkResearchMySQL逻辑架构第一层:连接处理,授权认证,安全等 第二层:MySQL核心服务,查询解析,分析,优化,缓存,内置函数,视图(跨存储引擎的功能)等都在这一层 第三…...
2024/5/8 15:40:13 - 学习表达自己
每次和小伙伴出去吃饭,买东西都成了世纪战争。 赢了就像赢了战斗,心里暗自高兴。 我偶尔被朋友抢走,感到很不安和罪疚感。 每次付这么多钱,你觉得不公平吗? 可能会说“我的表现是笨拙,很多行动是大丈夫,还很大方呢”,但为什么会有人不买东西就喜欢呢? 你怎么样?下次再…...
2024/4/17 1:42:46 - [C++复健日常] for_each
就因为很习惯性的写for each, for in 就想看看c艹有没有类似的 嗯还真有这个templatesfor_each 它的作用就是一个迭代器 随便拿今天写的当例子来说明 #include <bits/stdc++.h> using namespace std;void myfunc(string str){cout << str << "\n";…...
2024/4/8 7:19:14 - 前端之路由篇
一. 路由的前世今生 前端开发的同学们,在日常工作中或多或少的会使用到页面的路由。尤其是今年来前端路由框架层出不群,React, Vue 等主流前端框架也都有各自标配。更多的是在单页面应用中,通过路由实现局部刷新,按需加载等都可以通过其关联来实现。那么路由的基本原理怎样…...
2024/4/16 3:48:22 - Android Telegram 编译运行(第一次搞安卓项目)
对于一个非Android 开发者来说,遇到几个问题,从网上找了些资料,大概汇总下环境 Windows 10JDK1.8NDK 21.1.6352462SDK 29BuildTools 29.0.3 源码下载 GIT地址:https://github.com/DrKLO/Telegram.git下面开始我们的编译之路报错1FAILURE: Build failed with an exception.*…...
2024/4/16 3:49:33 - Invalid handler for event “click“: got undefined (错误详解)
下面是控制台报的错:vue.js:657 [Vue warn]: 错误:Invalid handler for event “click”: got undefined (found in )解决:不要忘记写methods哦!!!!!...
2024/4/16 3:49:33 - Django 一文看懂urls.py与views.py的联系
URL路由的机制 Created with Raphal 2.2.0url定义、转换、传参、命名等操作views 1 Django的URL路由配置路由是关联URL及其处理函数关系的过程。 创建的settings.py中通过ROOT_URLCONF变量指定全局路由文件名称,一般路由名称与工程名称相同。 Django使用urlpatterns变量名来添…...
2024/4/20 7:43:11 - 利用CSS和HTML制作京东左侧导航条
继续加油努力! 如何让父元素中的文字垂直居中 <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>…...
2024/4/20 0:42:17 - Raect的创建项目
由于今天被嘲笑!特地复习一遍 安装脚手架npm i create-react-app -g// 全局安装脚手架 2 使用脚手架 // 创建项目create-react-app [项目名]//注意:项目名不能含有大写字母,会报错 3 脚手架常用命令 //运行项目 npm run start/npm start//反编译(暴露项目的webpack配置) n…...
2024/4/16 3:49:33 - Java面试必知:Java中 String和Integer内存存储问题
String和Integer的内存存储String的内存存储Integer的内存存储 String的内存存储String a=“a” 可能创建一个对象或者不创建对象, 如果"a"这个字符串在java String池里不存在,会在java String池创建这个一个String对象(“a”).如果已经存在,a直接reference to 这个…...
2024/5/1 9:52:16 - Java关键字理解
Java关键字理解引导语Java 中的关键字很多,大约有 50+,在命名上我们不能和这些关键字冲突的,编译会报错,每个关键字都代表着不同场景下的不同含义,接下来我们挑选 6 个比较重要的关键字,深入学习一下。1 static意思是静态的、全局的,一旦被修饰,说明被修饰的东西在一定…...
2024/5/3 9:20:26 - 我的世界MC个人服务器搭建(阿里云ECS)
我的世界MC个人服务器搭建(阿里云ECS) MC服务器搭建较容易,亲身搭建,整合网上其他各处安装教程资源,将过程细致解释,不过还是需要大家不要光复制指令操作,还是要理解指令作用,懂得变通,不然在没有图形化界面的linux系统里安装文件,操作文件一些路径和进程操作还是很麻…...
2024/5/3 2:07:15
最新文章
- 设计模式——装饰者模式(Decorator)
装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式相比生成子类更为灵活。在装饰者模式中,一个装饰类会包装一个对象(…...
2024/5/9 6:44:34 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/7 10:36:02 - ARM FVP平台的terminal窗口大小如何设置
当启动ARM FVP平台时,terminal窗口太小怎么办?看起来非常累眼睛,本博客来解决这个问题。 首先看下ARM FVP平台对Host主机的需求: 通过上图可知,UART默认使用的是xterm。因此,我们需要修改xterm的默认字体设…...
2024/5/8 11:56:07 - 9:00面试,9:06就出来了,问的问题有点变态。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到8月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...
2024/5/6 8:45:21 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/8 6:01:22 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/7 9:45:25 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/9 4:20:59 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/7 11:36:39 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/6 1:40:42 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/8 20:48:49 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/7 9:26:26 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/8 19:33:07 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/8 20:38:49 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/6 21:42:42 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/4 23:54:56 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57