分类 技术前沿 下的文章 - 六币之门
首页
视频教程
网站导航
活动日历
关于我们
用户投稿
推荐
新闻动态
搜 索
1
融资周报 | 公开融资事件11起;加密技术公司Toposware完成500万美元融资,Polygon联创参投
107 阅读
2
六币日报 | 九只比特币ETF在6天内积累了9.5万枚BTC;贝莱德决定停止推出XRP现货ETF计划
74 阅读
3
六币日报 | 美国SEC再次推迟对灰度以太坊期货ETF做出决定;Do Kwon已出黑山监狱等待引渡
69 阅读
4
融资周报 | 公开融资事件27起;L1区块链Monad Labs完成2.25亿美元融资,Paradigm领投
68 阅读
5
【ETH钱包开发06】查询某个地址的交易记录
43 阅读
新闻动态
每日快报
一周精选
融资情况
项目投研
自治组织
数字藏品
去中心化应用
去中心化游戏
去中心化社交
去中心化金融
区块链交易所
科普知识
小白入门
用户手册
开发文档
行业报告
技术前沿
登录
搜 索
标签搜索
新闻
日报
元歌Eden
累计撰写
1,087
篇文章
累计收到
0
条评论
首页
栏目
新闻动态
每日快报
一周精选
融资情况
项目投研
自治组织
数字藏品
去中心化应用
去中心化游戏
去中心化社交
去中心化金融
区块链交易所
科普知识
小白入门
用户手册
开发文档
行业报告
技术前沿
页面
视频教程
网站导航
活动日历
关于我们
用户投稿
推荐
新闻动态
用户登录
登录
找到
109
篇与
技术前沿
相关的结果
2023-03-24
Remix IDE 使用与 VSCode 搭建 Solidity 开发环境
Remix IDE 基本使用智能合约的默认编辑器是 Remix,它默认是运行在浏览器中的。我们打开 remix.ethereum.org 就可以看到 Remix 编辑器了。需要注意这个域名是 Remix 的唯一域名。它的功能比较简单,和 VSCode 有些像,我简单介绍一下它的主要功能。左侧四个菜单栏是它的主要功能。第一个是文件夹。 第二个是搜索栏。 第三个是编译。 第四个是部署。 文件夹我们通常不会直接在这里进行开发,而是在 VSCode 中进行开发,然后将本地的代码连接到浏览器的 Remix 中。但是可以在这里写一些测试或者 Demo。搜索栏搜索栏和 VSCode 的搜索栏基本上没有什么区别,通常就是全局搜索一些关键字,或者全局替换之类的。编译编译是比较重要的一部分,这里我要多讲一下。compiler:首先是选择 solidity 的版本,编译版本要和代码版本相对应。 solidity 的版本是可以有区间的,不过建议锁定一个版本,因为如果要在区块链浏览器中公开智能合约代码的话,必须填写编译和部署的参数。如果设置成区间,很容易忘记编译时所选择的版本,导致无法公开智能合约代码。include nightly builds:是夜间编译,通常是指每晚编译,也就是指每天晚上程序员下班后进行的编译,这时进行编译的代码是没有完成的。我们不需要勾选。 auto compile:自动编译,当文件的内容发生变化时会自动编译,如果项目比较小,可以打开,但是如果项目比较大,那么不建议打开。因为会让浏览器卡顿。而且我们可以按 ctrl+s 的快捷键来编译,不需要这个功能。 hide warnings:隐藏警告。这个选项建议始终打开,显示警告可以帮助我们避免很多问题。 Advanced Configurations 是编译的高级选项。language:是编程语言,默认 solidity,不需要修改。 EVM Version:这个是 EVM 的版本,暂时也不需要修改。 Enable Optimization:这个选项是代码优化。代码编译是有上限的,如果项目提及非常大,超过了这个限制,就无法编译成功。开启代码优化后,可以减小代码的体积,让智能合约容易通过。并且还可以减少合约部署的 gas 费和外部调用的 gas 费,所以我们最好打开这个选项。代码优化的级别是数字,选择默认 200 就可以了。 Use configuration file:我们也可以自己编写编译配置文件。等后面再说这个,现在不开启。 选择完配置参数,就可以点击 Compile 按钮进行编译了。编译完成后编译图标会出现一个绿色的对勾,表示编译成功。同时还会输出 ABI 和 Bytecode,这两个东西我会在后面的文章中讲到。部署部署也非常重要,我也对这部分进行详细的介绍。Eevironment:虚拟机环境。虚拟机有很多,默认的是 Remix VM,也就是浏览器虚拟机,在之前的版本中也叫做 JavaScript VM。当浏览器刷新时,旧链会被清除。我们做一些简单的测试可以使用它。如果合约中有一些买币卖币的逻辑需要测试,那么就需要选择 Injected Provider-Metamask。这样就可以连接到 Metamask 钱包,在真实网络的测试链中进行测试。 Account 是一些和当前环境关联的账户列表,里面会包含一些 Ether,可以用来测试。 Gas limit:智能合约可以从用户手中最大的 gas 费用限制,默认是 3000000,目的是为了防止智能合约程序出错,收取过高的 gas 费用。通常不建议修改。 Value:发送到合约或调用函数所需要支付的 ETH、WEI、GWEI 等,默认是 0,不需要修改。 Contract:就是我们需要选择的合约。如果有多个合约,就去选择要部署的那个合约。 Publish to IPFS:发布到星际网络,不需要开启。 配置好之后就可以点击 Deploy 进行部署了。部署成功后 Deployed Contracts 这部分会有部署好的智能合约地址。它会有一些蓝色的按钮和黄色的按钮。蓝色按钮表示获取链上数据,黄色按钮表示修改链上数据。修改链上数据需要支付 gas 费。使用 VSCode 编写 Solidity 代码Solidity 的官方默认编辑器是 Remix,但它是运行在浏览器中的,浏览器并不是非常稳定,比如莫名其妙的崩溃导致代码丢失。虽然 Remix 也有桌面版本,在这里下载:github.com/ethereum/re…,但是使用的人并不多,可能是因为 Remix 并不是专业做代码编辑器的,编码体验和生态系统都不够完善。如果能够使用传统的、具有更加成熟生态的编辑器,那么在开发体验和开发效率上都会有更好的体验。下面这部分内容将会介绍如何使用本地的 VSCode 编辑器进行 Solidity 智能合约的开发。插件安装在 VSCode 中编写 Solidity 代码,并且导入到 Remix,需要安装 Solidity 和 Ethereum Remix 这两个插件。Soliditysolidity 是一门编程语言,那么一样需要代码高亮、代码提示这些功能。这个插件提供了一门编程语言所需要的基本功能,以及编译合约等功能。F5 编译当前合约,Cmd+F5 编译所有合约。安装地址:marketplace.visualstudio.com/items?itemN…安装完成后,可以编写一个 sol 文件,代码高亮就代表着安装成功。Ethereum Remix我们在本地写完智能合约后,需要将本地的项目导入到 Remix 中进行部署。这在大型项目中比较有用,因为大型项目的目录结构会比较复杂,比如会包含很多文件夹和一些库。安装地址:marketplace.visualstudio.com/items?itemN…安装完成后,左侧会有一个 Remix 的图标。点进去,可以看到以下内容。选择最下面的 Start remixd client,就可以连接到浏览器的 Remix。回到浏览器的 Remix,在 Workspaces 中选择 connect to localhost。选择之后会弹出一个弹窗,警告我们 remix 的版本必须是最新版本。我们点击 connect,就连接成功了。连接成功后,Strat remixd client 前面的图标也会变成绿色。
2023年03月24日
7 阅读
0 评论
0 点赞
2023-03-24
Java Web3J 使用指南
Web3J 是一个轻量级、高度模块化、反应式、类型安全的 Java 和 Android 库,用于处理智能合约并与以太坊网络上的客户端(节点)集成。这使您可以使用以太坊区块链,而无需为平台编写自己的集成代码的额外开销。提供的功能基于 HTTP 和 IPC 的以太坊 JSON-RPC 客户端 API 的完整实现 以太坊钱包支持 自动生成 Java 智能合约包装器,以从本机 Java 代码创建、部署、交易和调用智能合约(支持 Solidity 和 Truffle 定义格式) 以太坊名称服务 (ENS) 支持 支持 Alchemy 和 Infura,因此您不必自己运行以太坊客户端 安卓兼容 命令行工具 如何使用<dependency> <groupId>org.web3j</groupId> <artifactId>core</artifactId> <version>4.8.7</version> </dependency> 复制代码public class Main { public static void main(String[] args) throws ExecutionException, InterruptedException { Web3j client = Web3j.build(new HttpService("https://ropsten.infura.io/v3/You Infura Project Id")); Web3ClientVersion clientVersion = client.web3ClientVersion().sendAsync().get(); System.out.println(clientVersion.getWeb3ClientVersion()); // => Geth/v1.10.15-omnibus-hotfix-f4decf48/linux-amd64/go1.17.6 } } 复制代码使用 Web3J 获取以太坊账户余额public class Main { public static void main(String[] args) throws ExecutionException, InterruptedException { Web3j client = Web3j.build(new HttpService("https://ropsten.infura.io/v3/You Infura Project Id")); EthGetBalance ethGetBalance = client.ethGetBalance( "0x64f44b31ad0ed4537f94a5c084cfba8945463345", DefaultBlockParameterName.fromString(DefaultBlockParameterName.LATEST.name()) ).sendAsync().get(); System.out.println(ethGetBalance.getBalance()); // => 741270235881990866 } } 复制代码使用 Web3J 获取当前的 Gas 价格public class Main { public static void main(String[] args) throws ExecutionException, InterruptedException { Web3j client = Web3j.build(new HttpService("https://ropsten.infura.io/v3/You Infura Project Id")); EthGasPrice ethGasPrice = client.ethGasPrice().sendAsync().get(); System.out.println(ethGasPrice.getGasPrice()); // => 41493167936 } } 复制代码使用 Web3J 通过交易哈希获取交易详情public class Main { public static void main(String[] args) throws ExecutionException, InterruptedException { Web3j client = Web3j.build(new HttpService("https://ropsten.infura.io/v3/You Infura Project Id")); String transactionHash = "0x9030edd43f8ae6c4ed49bcbc11dd7d6f6ce2798e8bb1c5ea4f1e130780fec74a"; EthGetTransactionReceipt ethGetTransactionReceipt = client.ethGetTransactionReceipt(transactionHash).sendAsync().get(); TransactionReceipt transactionReceipt = ethGetTransactionReceipt.getTransactionReceipt().orElseThrow(RuntimeException::new); System.out.println(transactionReceipt); // => TransactionReceipt], logsBloom='0x80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000008000000000000000000000000000000000000000000000000020000000000000000000800000000000000000000000010000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000002000000000000000200000000000000000000000000000000000020000000000200000000000000000000000000000000000000000000000000000000', revertReason='null', type='0x2', effectiveGasPrice='0x15fb4c0517'} } } 复制代码使用 Web3J 订阅新的区块Web3J 的函数式编程的特性让我们设置观察者很容易,我们可以设置订阅者,监听链上发生的一些事情,如出块,交易,日志等。public class Main { public static void main(String[] args) throws ExecutionException, InterruptedException, ConnectException { WebSocketService webSocketService = new WebSocketService("wss://ropsten.infura.io/ws/v3/You Infura Project Id", true); webSocketService.connect(); Web3j client = Web3j.build(webSocketService); Disposable subscribe = client.replayPastBlocksFlowable(DefaultBlockParameterName.fromString("earliest"), true).subscribe(ethBlock -> { System.out.println(ethBlock.getBlock()); // => org.web3j.protocol.core.methods.response.EthBlock$Block@39fcf950 }); } } 复制代码使用 Web3J 订阅新的交易public class Main { public static void main(String[] args) throws ExecutionException, InterruptedException, ConnectException { WebSocketService webSocketService = new WebSocketService("wss://ropsten.infura.io/ws/v3/You Infura Project Id", true); webSocketService.connect(); Web3j client = Web3j.build(webSocketService); Disposable subscribe = client.replayPastTransactionsFlowable(DefaultBlockParameterName.fromString("earliest")).subscribe(transaction -> { System.out.println(transaction); // => org.web3j.protocol.core.methods.response.EthBlock$TransactionObject@47b0a71a }); } } 复制代码使用 Web3J 订阅新的合约事件public class Main { public static void main(String[] args) throws ExecutionException, InterruptedException, ConnectException { WebSocketService webSocketService = new WebSocketService("wss://ropsten.infura.io/ws/v3/You Infura Project Id", true); webSocketService.connect(); Web3j client = Web3j.build(webSocketService); Disposable subscribe = client.ethLogFlowable( new EthFilter( DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST, // 合约地址 "0x7b52aae43e962ce6a9a1b7e79f549582ae8bcff9" ) ).subscribe(event -> { System.out.println(event); // => Log }, Throwable::printStackTrace); } } 复制代码使用 Web3J 签名并发送交易public class Main { public static void main(String[] args) throws ExecutionException, InterruptedException, ConnectException { Web3j client = Web3j.build(new HttpService("https://ropsten.infura.io/v3/You Infura Project Id")); // 获取 nonce 值 EthGetTransactionCount ethGetTransactionCount = client .ethGetTransactionCount("0x64f44b31ad0ed4537f94a5c084cfba8945463345", DefaultBlockParameterName.PENDING) .sendAsync().get(); BigInteger nonce = ethGetTransactionCount.getTransactionCount(); System.out.println(nonce); // 构建交易 RawTransaction etherTransaction = RawTransaction.createEtherTransaction( nonce, client.ethGasPrice().sendAsync().get().getGasPrice(), DefaultGasProvider.GAS_LIMIT, "0x64f44b31ad0ed4537f94a5c084cfba8945463345", Convert.toWei("0.001", Convert.Unit.ETHER).toBigInteger() ); System.out.println(etherTransaction); // 加载私钥 Credentials credentials = Credentials.create("You Private Key"); // 使用私钥签名交易并发送 byte[] signature = TransactionEncoder.signMessage(etherTransaction, credentials); String signatureHexValue = Numeric.toHexString(signature); EthSendTransaction ethSendTransaction = client.ethSendRawTransaction(signatureHexValue).sendAsync().get(); System.out.println(ethSendTransaction.getResult()); } } 复制代码使用 Web3J 生成合约包装类Web3J 可以生成智能合约的包装类,方便使用纯 Java 代码与合约进行交互。$web3j generate solidity -a ./contract.abi -o ./ -p com.contract.proxy _ _____ _ | | |____ (_) __ _____| |__ / /_ \ \ /\ / / _ \ '_ \ \ \ | \ V V / __/ |_) |.___/ / | \_/\_/ \___|_.__/ \____/| | _/ | |__/ by Web3Labs Generating com.contract.proxy.Contract ... Warning: Duplicate field(s) found: [FUNC_SAFETRANSFERFROM]. Please don't use names which will be the same in uppercase. File written to . $tree com com └── contract └── proxy └── Contract.java # 包装类 2 directories, 1 file 复制代码使用 Web3J 与合约进行交互public class Main { public static void main(String[] args) throws ExecutionException, InterruptedException { Web3j client = Web3j.build(new HttpService("https://ropsten.infura.io/v3/You Infura Project Id")); Credentials credentials = Credentials.create("You Private Key"); BigInteger currentGasPrice = client.ethGasPrice().sendAsync().get().getGasPrice(); Contract foundersKeyContract = Contract.load("0x7b52aae43e962ce6a9a1b7e79f549582ae8bcff9", client, credentials, new DefaultGasProvider() { /** * 使用动态获取的 Gas Price * @return */ @Override public BigInteger getGasPrice() { return currentGasPrice; } }); BigInteger balance = foundersKeyContract.balanceOf("0x64f44b31ad0ed4537f94a5c084cfba8945463345").send(); System.out.println(balance); // => 41493167936 } } 复制代码
2023年03月24日
36 阅读
0 评论
0 点赞
2023-03-24
JavaScript开发区块链只需200行代码
JavaScript开发一个简单的区块链只需200行代码。通过JavaScript的开发实现过程,你将理解区块链是什么:区块链就是一个分布式数据库,存储结构是一个不断增长的链表,链表中包含着许多有序的记录。然而,在通常情况下,当我们谈到区块链的时候也会谈起使用区块链来解决的问题,这两者很容易混淆。像流行的比特币和以太坊这样基于区块链的项目就是这样。“区块链”这个术语通常和像交易、智能合约、加密货币这样的概念紧紧联系在一起。这就令理解区块链变得不必要得复杂起来,特别是当你想理解源码的时候。下面我将通过 200 行 JS 实现的超级简单的区块链来帮助大家理解它,我给这段代码起名为 NaiveChain。你可以在Github 查看更多的技术细节。区块链块结构第一个逻辑步骤是决定块结构。为了保证事情尽可能的简单,我们只选择最必要的部分:index(下标)、timestamp(时间戳)、data(数据)、hash(哈希值)和 previous hash(前置哈希值)。这个块中必须能找到前一个块的哈希值,以此来保证整条链的完整性,JavaScript代码如下:class Block { constructor(index, previousHash, timestamp, data, hash) { this.index = index; this.previousHash = previousHash.toString(); this.timestamp = timestamp; this.data = data; this.hash = hash.toString(); } } 复制代码区块链块哈希为了保存完整的数据,必须哈希区块。SHA-256会对块的内容进行加密,记录这个值应该和“挖矿”毫无关系,因为这里不需要解决工作量证明的问题。JavaScript代码如下:var calculateHash = (index, previousHash, timestamp, data) => { return CryptoJS.SHA256(index + previousHash + timestamp + data).toString(); }; 复制代码区块链块的生成要生成一个块,必须知道前一个块的哈希值,然后创造其余所需的内容(= index, hash, data and timestamp)。块的data部分是由终端用户所提供的。JavaScript代码如下:var generateNextBlock = (blockData) => { var previousBlock = getLatestBlock(); var nextIndex = previousBlock.index + 1; var nextTimestamp = new Date().getTime() / 1000; var nextHash = calculateHash(nextIndex, previousBlock.hash, nextTimestamp, blockData); return new Block(nextIndex, previousBlock.hash, nextTimestamp, blockData, nextHash); }; 复制代码区块链块的存储内存中的Javascript数组被用于存储区块链。区块链的第一个块通常被称为“起源块”,是硬编码的。JavaScript代码如下:var getGenesisBlock = () => { return new Block(0, "0", 1465154705, "my genesis block!!", "816534932c2b7154836da6afc367695e6337db8a921823784c14378abed4f7d7"); }; var blockchain = [getGenesisBlock()]; 复制代码确认块的完整性在任何时候都必须能确认一个区块或者一整条链的区块是否完整。在我们从其他节点接收到新的区块,并需要决定接受或拒绝它们时,这一点尤为重要。JavaScript代码如下:var isValidNewBlock = (newBlock, previousBlock) => { if (previousBlock.index + 1 !== newBlock.index) { console.log('invalid index'); return false; } else if (previousBlock.hash !== newBlock.previousHash) { console.log('invalid previoushash'); return false; } else if (calculateHashForBlock(newBlock) !== newBlock.hash) { console.log('invalid hash: ' + calculateHashForBlock(newBlock) + ' ' + newBlock.hash); return false; } return true; }; 复制代码选择最长的区块链任何时候在链中都应该只有一组明确的块。万一冲突了(例如:两个结点都生成了72号块时),会选择有最大数目的块的链。JavaScript代码如下:var replaceChain = (newBlocks) => { if (isValidChain(newBlocks) && newBlocks.length > blockchain.length) { console.log('Received blockchain is valid. Replacing current blockchain with received blockchain'); blockchain = newBlocks; broadcast(responseLatestMsg()); } else { console.log('Received blockchain invalid'); } }; 复制代码与其他结点的通信结点的本质是和其他结点共享和同步区块链,下面的规则能保证网络同步。当一个结点生成一个新块时,它会在网络上散布这个块。 当一个节点连接新peer时,它会查询最新的block。 当一个结点遇到一个块,其index大于当前所有块的index时,它会添加这个块到它当前的链中, 或者到整个区块链中查询这个块。 我没有采用自动发现peer的工具。peers的位置(URL)必须是手动添加的。节点控制在某种程度上用户必须能够控制节点。这一点通过搭建一个HTTP服务器可以实现。JavaScript代码如下:var initHttpServer = () => { var app = express(); app.use(bodyParser.json()); app.get('/blocks', (req, res) => res.send(JSON.stringify(blockchain))); app.post('/mineBlock', (req, res) => { var newBlock = generateNextBlock(req.body.data); addBlock(newBlock); broadcast(responseLatestMsg()); console.log('block added: ' + JSON.stringify(newBlock)); res.send(); }); app.get('/peers', (req, res) => { res.send(sockets.map(s => s._socket.remoteAddress + ':' + s._socket.remotePort)); }); app.post('/addPeer', (req, res) => { connectToPeers([req.body.peer]); res.send(); }); app.listen(http_port, () => console.log('Listening http on port: ' + http_port)); }; 复制代码用户可以用下面的方法和节点互动:列出所有的块 用用户提供的内容创建一个新的块 列出或者新增peers 下面这个Curl的例子就是最直接的控制节点的方法:#get all blocks from the node curl http://localhost:3001/blocks 复制代码系统架构需要指出的是,节点实际上展现了两个web服务器:一个(HTTP服务器)是让用户控制节点,另一个(Websocket HTTP服务器)。总结创造 NaiveChain 的目的是为了示范和学习,因为它并没有“挖矿”算法(PoS或PoW),不能被用于公用网络,但是它实现了区块链运作的基本特性。其他更多内容也可以访问这个以太坊博客。如果你希望马上开始学习以太坊DApp开发,可以访问汇智网提供的快速有效在线互动教程:区块链新手以太坊DApp实战开发入门 区块链进阶去中心化电商平台实战开发
2023年03月24日
4 阅读
0 评论
0 点赞
2023-03-24
iOS 部署智能合约
废话因为项目业务原因,需要在新的项目中部署以太坊的智能合约,关于这方面安卓方面貌似走在了前面。 web3j 的存在实在是喜人,而 iOS版本也是有的,功能貌似没有那么强大,对付平常的区块链交互是足够的了。但是iOS这个他没有仔细的说明,我研究了一下其实部署起来挺简单. 年纪大了搞过的东西很容易忘记,于是在这里记录一下.一来自己以后也可以回顾,二来为有需要的人略尽绵薄之力语歌博客使用 web3swift 部署以太坊智能合约1.配置服务a. IP地址配置以太坊的服务器地址: 我这里是本地IP地址struct Api { static let host = "http://192.168.6.66:6666" static func map(path: String) -> String { return host + path } static var chainUrl: String { return map(path: "") } } 复制代码b. abiString部署合约会需要public let abiString = "[],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},],\"name\":\"setFlagData\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" 复制代码c. byteCode这个是一串很长的东西,合约生产的。没有的记得找写合约的要.我这里的例子:public let BINARY = "606060409081526003805460a060020a61ffff021916905560006004558051908101604052600981527f4c696e67546f6b656e0000000000000000000000000000000000000000000000602082015260059080516100619291602001906100cf565b5060408051908101604052600481527f4c494e4700000000000000000000000000000000000000000000000000000000602082015260069080516100a99291602001906100cf565b50601260075560038054600160a060020a03191633600160a060020a031617905561016a565b82805460018160011615610100020316600290049若干省略号复制代码d. 集成 podpod 'web3swift', '~> 0.8.0' 复制代码2.部署前奏a. 创建账户,web3swift 的示例中有,同学可以仔细研究研究,我这里就简单过。上代码:class YYGKey { var key_password = "BANKEXFOUNDATION" var storeManager: KeystoreManager? { return keyStoreManager() } var keyAddress: EthereumKeystoreV3? { return addressManage() } convenience init(password: String) { self.init() self.key_password = password } func addressManage() -> EthereumKeystoreV3? { guard let userDir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first else let storeManager = KeystoreManager.managerForPath(userDir + "/keystore") if let manage = storeManager, let address = manage.addresses { return address.isEmpty ? creatAddress(dir: userDir) : getAddress(manage: manage) } return nil } func creatAddress(dir: String) -> EthereumKeystoreV3? { let ks = try! EthereumKeystoreV3(password: "BANKEXFOUNDATION") if let ks_ = ks { let keydata = try! JSONEncoder().encode(ks_.keystoreParams) FileManager.default.createFile(atPath: dir + "/keystore"+"/key.json", contents: keydata, attributes: nil) } return ks } func getAddress(manage: KeystoreManager) -> EthereumKeystoreV3? { if let address = manage.addresses, let first = address.first { return manage.walletForAddress(first) as? EthereumKeystoreV3 } return nil } func keyStoreManager() -> KeystoreManager? { guard let userDir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first else return KeystoreManager.managerForPath(userDir + "/keystore") } } 复制代码b. 连接到部署的服务器class YYG { var chain: web3? { guard let url = URL(string: Api.chainUrl), let web = Web3.new(url) else return web } static let yyg = YYG() private init() } 复制代码3.开始部署需要的数据EthereumKeystoreV3 EthereumAddress web3 byteCode web3contract Web3Options TransactionIntermediate KeystoreManager 上代码:struct YYGOperate { typealias result = Result<[String : String], Web3Error> typealias res = [String : String] func contractsResult(message: @escaping (Bool,res?) -> Void) { if let resul = smartContracts() { switch resul { case .success(let res): DispatchQueue.main.async { message(true, res) } case .failure(let error): message(false, nil) print(error) } } else { message(false, nil) } } private func smartContracts() -> result? { guard let manage = YYGKey().addressManage(),let addresss = manage.addresses,let address = addresss.first, let chain = YYG.yyg.chain else chain.provider.network = nil chain.addKeystoreManager(YYGKey().keyStoreManager()) guard let contract = chain.contract(abiString, at: nil, abiVersion: 2), let byteCode = Data.fromHex(BINARY) else var options = Web3Options.defaultOptions() options.from = address options.gasLimit = BigUInt(3000000) let inter = contract.deploy(bytecode: byteCode, options: options) guard let intermediate = inter else return intermediate.send(password: "BANKEXFOUNDATION", options: options) } } 复制代码3.执行YYGOperate().contractsResult { state, res in if state } 复制代码结果:Transaction Nonce: 10 Gas price: 5000000000 Gas limit: 1111340 To: 0x Value: 0 Data: 0x606060409081526003805460a060020a61ffff02191690556090810183818151815260200191508051906020019080838360005b8381101561017657808201518382015260200161015e565b50、5260200160405180910390a35050505050565b6000828201610acc82fd76404b5c55184a2e555312d3353bcb43e75666dd36d0af562b0c220029a165627a7a72305820f3efa245dad6ee48cc6d771a54067fb6e3b17b0caba5ecd4eed13aca2b1c00960029 v: 28 r: 79879464740714101996923170089344479265591202785750775462035438111705924396692 s: 39143622105442894879914151031821436277241889279036648521816051027427579390397 Intrinsic chainID: nil Infered chainID: nil sender: Optional("0x9E40Fb081777c232aBafc256165772572c057F95") hash: Optional("0xcc16c3a245e4fd27b85e53b8cb6d0ac64028b60e61ca3de938e896e95202bde3") 复制代码授人以鱼不如授人以渔学习资料以太坊智能合约 web3swift 以太坊 以太坊官方文档 安卓web3j 学习区块链全部资料
2023年03月24日
5 阅读
0 评论
0 点赞
2023-03-24
区块链上编程:DApp 开发简介
当你开始探索区块链开发,需要了解到这些。一、DApp介绍什么是 DApp?DApp 是 Decentralized Application 的简称,及去中心化应用。在某种程度上,比特币可以说是出现的第一个 DAPP,因为它是完全开源的,为贡献者提供奖励回报,不受一个中央机构的控制,并使用区块链作为支撑技术。 区块链,作为一个基础设施,提供了分布式的去中心化可信数据库,人们可以基于此,可以开发各种应用,适用于不同的场景。 简单来说,DAPP 和普通的 App 原理一样,除了他们是完全去中心化的,由类似以太坊网络本身自己的节点来运作的 DAPP,不依赖于任何中心化的服务器,DAPP 是去中心化的,可以完全自动地运行。 目前 DApp 通常指代基于以太坊或者 EOS 上的智能合约开发的相关应用。DApp 运行原理DApp 底层区块链开发平台就好比手机的 iOS 和 Android 系统,是各种 DApp 的底层生态环境,DApp 就是底层区块链平台生态上衍生的各种分布式应用,也是区块链世界中的基础服务提供方,DApp 于区块链,就好比 APP 之于 iOS 和 Android。什么是智能合约?如果把区块链看做是一个数据库,数据源, 智能合约基本上就是一段数据库操作脚本, 它决定了你如何在区块链上存储数据,修改数据。DApp应用案例前往这里可查看 DApp 的行业最新动态:www.stateofthedapps.com/cryptokitties 加密猫Fomo3D智能合约开发简介智能合约是代码(它的功能)和数据(它的状态)的集合,存在于以太坊区块链的特定地址。 智能合约账户能够在彼此之间传递信息,进行图灵完备的运算。智能合约依靠被称作以太坊虚拟机(EVM) 字节代码(以太坊特有的二进制格式)上的区块链运行。智能合约使用诸如 Solidity 等高级语言写成,然后编译成字节代码上传到区块链上。智能合约开发流程大概有以下步骤:编写智能合约(如基于 solidity) 测试智能合约,在测试网络或者私有链进行合约的功能测试 编译和发布合约,将合约部署到链上 操作合约,利用诸如 web3.js 等接口,通过访问智能合约的地址,来调用和操作智能合约。 结构示意图:智能合约的开发流程图:SoliditySolidity 是一种语法类似 JavaScript 的高级语言。它被设计成以编译的方式生成以太坊虚拟机代码。代码片段:pragma solidity ^0.4.22; contract helloWorld { function renderHelloWorld () public pure returns (string) { return 'helloWorld'; } } 复制代码ERC-20最著名的智能合约,想必大家都听过,那就是 ERC20。 ERC-20 是一种代币的标准协议,简单地说,任何 ERC-20 代币都能立即兼容以太坊钱包(几乎所有支持以太币的钱包,包括 MIST、imToken 等),由于交易所已经知道这些代币是如何操作的,它们可以很容易地整合这些代币。这就意味着,在很多情况下,这些代币都是可以立即进行交易的。一个基于 ERC-20 的代币包含以下接口:contract ERC20Interface { function totalSupply() public constant returns (uint); function balanceOf(address tokenOwner) public constant returns (uint balance); function allowance(address tokenOwner, address spender) public constant returns (uint remaining); function transfer(address to, uint tokens) public returns (bool success); function approve(address spender, uint tokens) public returns (bool success); function transferFrom(address from, address to, uint tokens) public returns (bool success); event Transfer(address indexed from, address indexed to, uint tokens); event Approval(address indexed tokenOwner, address indexed spender, uint tokens); } 复制代码Solidity开发环境介绍下面我会粗略的引入介绍一下 Solidity 智能合约相关开发环境跟工具,这些都是目前智能合约开发中常用的工具集合。IDE开发基于Solidity的智能合约,可以使用以下开发环境VSCode + Solidity Plugin Remix Solidity IDE (remix.ethereum.org) TruffleTruffle 是针对基于以太坊的 Solidity 语言的一套开发框架。本身基于 Javascript。内置的智能合约编译,链接,部署和二进制文件的管理。 快速开发下的自动合约测试。 脚本化的,可扩展的部署与发布框架。 部署到不管多少的公网或私网的网络环境管理功能 使用 EthPM&NPM 提供的包管理,使用 ERC190 标准。 与合约直接通信的直接交互控制台(写完合约就可以命令行里验证了)。 可配的构建流程,支持紧密集成。 在 Truffle 环境里支持执行外部的脚本。 安装 Trufflenpm install -g truffle 复制代码mkdir myproject && cd myproject && truffle init 复制代码GanacheGanache 是一个带有图形界面的本地运行的以太坊区块链浏览器/模拟器,它在本地运行了一个 RPC Server,通过连接这个 Ganache,我们可以完成智能合约的本地测试,而不需要真正的接入以太坊的公网或测试网络。通过使用 Ganache,你可以快速的看到你的应用是如何影响区块链的。其中细节:如你的账户、余额、合约及 Gas 成本。Gethgeth 的全称是 go-ethereum,是以太坊的官方钱包客户端。Geth 是基于命令行的。 通过使用 Geth 和相关参数,我们可以接入以太坊的公网,测试网以及私有网络。 以太坊除了主网络,还有各种各样的测试网络。使用 geth 前要先解决要进入哪一个网络。 Geth 相当于在本机启动一个以太坊网络节点,但是通过参数控制,可以让节点选择成为全节点或者轻节点。Geth 控制台提供 admin、debug、eth、miner、net、personal、rpc、txpool、web3 等服务及命令。比如有这些常用的操作:eth.blockNumber 可以查看当前的区块高度,总共有多少区块 eth.getBlock(xxx) 可以查看指定区块的信息 eth.accounts 查看当前钱包的账户地址,当第一次运行私有链网络的时候,没有账户,需要新建 eth.coinbase 矿工账户,当网络进行挖矿操作挖到新的区块后,奖励会到这个账户里 personal.newAccount() 新建账户,会提示输入密码,之后账户会以加密好的私钥文件存到data/keystore目录下 miner.start(threas_number) 开始挖矿,前提是当前钱包已经有coinbase矿工账户 miner.stop() 停止挖矿 图示在 geth 命令行下新建账户及获取余额操作:MistMist 是以太坊的官方图形钱包,通过该钱包,用户可以很方便的管理账户,查看余额,以及发送和接收交易。Mist 还有一个非常实用的功能就是,编译和部署 Solidity 智能合约。web3.jsweb3.js 提供了 web3 对象,封装了一组可以用来操作智能合约的方法。底层实现上,它通过 RPC 调用与本地节点 geth 进行通信。geth 本身就可以与合约进行交互,通过 web3.js 再封装了一层,这样我们可以使用 js 程序与合约交互,方便开发。引入npm install web3 复制代码以太坊通过 web3 的交互流程大致如下:总结随着区块链近些年的大红大紫,DApp 被推上了风口浪尖,本文从技术的角度大致介绍了一下 DApp 所涉及的技术要点。后续的文章,可以更加详细的分享一些 DApp 开发的具体案例,引入跟介绍一些 DApp Demo 跟具体开发流程等。文 / 李工普通程序猿,长期混迹移动互联网 曾供职 91 与百度,现任区块链开发工程师 资深韭菜,在韭菜经历中学习到扎实的区块链知识本文已由作者授权发布,版权属于创宇前端。欢迎注明出处转载本文。本文链接:knownsec-fed.com/2018-08-10-…想要看到更多来自知道创宇开发一线的分享,请搜索关注我们的微信公众号:创宇前端(KnownsecFED)。欢迎留言讨论,我们会尽可能回复。感谢您的阅读。
2023年03月24日
4 阅读
0 评论
0 点赞
2023-03-24
以太坊智能合约 + DApp 从入门到上线:来自前端工程师的实战指南 - 王仕军 | Jeth 第一期
编者按:本文系 以太坊布道师 王仕军讲师,在由掘金技术社区主办,以太坊社区基金会、以太坊爱好者与 ConsenSys 协办的《开发者的以太坊入门指南 | Jeth 第一期 - 北京场》 活动上的分享整理。Jeth 围绕以太坊技术开发主题的系列线下活动。每期 Jeth 会邀请以太坊开发领域的优秀技术团队和工程师在线下分享技术干货。旨在为开发者提供线下技术交流互动机会,帮助开发者成长。王仕军老师本次分享视频回放(B站)分享整理传送门智能合约全栈介绍 - Howard | Jeth 第一期详解 ERC20 代币及众筹 - 熊丽兵 | Jeth 第一期王仕军 是掘金专栏和掘金小册作者,他著作的《区块链开发入门:从 0 到 1 构建基于以太坊智能合约的 ICO DApp》销量近千本;他创办和维护的微信公众号“前端周刊”目前有2600+订阅数;此外他还是 async/await、styled-components 高质量技术视频教程的作者。先跟大家介绍下我的背景,我是从去年五月开始学习区块链的,在场的同学可能学习区块链时间有比我还长的,所以我跟大家是在同一条起跑线上。我是做前端出身,对 JavaScript 非常熟悉,今天这个分享里的代码除了 Solidity 其他的都是 JS 写的。如果做这开发时间比较长,会了解到语言间的差别其实没有那么大,外界有说 Solidity 跟 JS 很像,但实际上 Solidity 语言创造的时候借鉴了 Golang、 Python 和 Javascript。我所要介绍的内容就是在我接触以太坊开发的这一段时间内,所积累出来的,怎么把所有区块链有关的点串起来做成一个可以用的应用,在座的可能看了不少资料,但是真正动手做东西的可能很少,接下来我就正式开始我的分享。在讲具体的事情之前我们站在软件开发这的角度来看一下区块链在计算机科学里面,或者说区块链的技术栈构成到底是什么样的,区块链最底层依赖于 OS,接下来算是基础设施层,这里面有 TCP/IP 协议和密码学。2017年 - 2018年期间爆发的是区块链协议这一层,包括分布式、共识算法,其中共识算法现在搞的人非常多,但是实际上在分布式里面已经有很成熟的研究。在应用这一层现在最成功的应该当属于以太坊,它引入是智能合约的概念以及DApp。最上面的是表现层,这个是现在所有的互联网产品都具有的东西,比如说你做了一个网站,一个H5页面,甚至是做了一个APP,甚至是给开发者提供一些API或者是命令行的接口。凭我自己对这个行业的观察,我觉得不光是前端工程师,所有做应用的工程师可以介入的点就是应用层和表现层,只不过对前端工程师来说做表现层有天然的优势。接下来是具体我要分享的内容:要做出一个完整的区块链 DApp 你需要掌握的最少必要知识; 怎么准备开发环境,开发环境需要有什么必要的条件; 如何在我们熟悉的开发环境里面把智能合约集成进来; 怎么做一个简单的DApp并且让他上线给人们去使用。 最少必要知识相信大家都听过账户、钱包、区块、区块链等没名词,但是怎么把这些东西串在一起,真正去琢磨、研究的人可能不多。首先回顾一下Howard 老师分享的区块、和区块链的结构。每个区块链平台里面都会有帐户的机制,最成功的区块链应用大家应该都知道,叫做比特币,比特币可以认为是去中心化的银行,那不同的帐户之间会有转帐交易,一段时间之内所有的转帐交易汇集在一起形成一个区块,区块的数据结构上面也有介绍,我就不展开讲了。随着时间的推移多个不同的区块通过一些特定的方式连起来,就形成了区块链,区块链上每一个区块可以认为是编号,这个编号就是块高,那不同的链产生一个区块所需要的时间是不一样的,那这个时间是出块时间,现在比特币大概在10分钟左右,而以太坊需要10多秒。至于以太坊,它本质是个分布式网络,所有的消息包括转帐、合约部署、以及合约接口调用都要通过一个节点,节点接收到消息然后把他广播给网络中的所有节点,然后当交易被打包之后出来的区块同样也会被广播给网络的所有节点。那怎么跟以太坊的网络交互呢?拿现在我们比较熟悉的微信小程序举例,开发者可以通过微信小程序提供的特定框架、小程序的管理后台去创造小程序,普通用户可以在微信 APP 里面使用小程序。腾讯的服务器他本身是中心化的,只有腾讯自己去维护;对应到以太坊的网络里面,社区给开发者提供的工具很多,可以用 web3.js、web3j、web3.swift,也可用 etherscan,这些工具或者语言包通过某一个节点作为入口与以太坊网络交互,用户通过浏览 DApp 或者钱包来和网络交互。以太坊的帐户和比特币的帐户最本质的结构是很类似的,包含了三个要素:私钥、公钥和地址。以太坊除了主网之外然后还有三个测试网,它的主网我们可以理解为传统软件开发环境里面的线上环境,Rinkeby、Kovan 和 Ropsten 是三个测试网络,这是三个测试环境是大家都可以公用的,后面的实战案例会用到。说完帐户,另外一个大家很熟悉的概念是区块链钱包,那比如说是像 imToken 或者是 Bitpie,还有后面我们要介绍的 Metamask,钱包和帐户之间有什么关系呢。我们用这个我们现在所熟知的金融系统里面的钱包和帐户来类比一下,就比如说是我在招商银行和建设银行开了两三个帐户,那我有一个钱包装在我兜里面的,我实际上持有5张银行卡,对于区块链里面我安装了一个比特派钱包,这个钱包里面有以太坊的帐户和比特币的帐户,以太坊的帐户我可以有很多个,比特币的帐户也可以有很多个。智能合约本质上是一个被代码控制的帐户,这个帐户本身和你在钱包里面所拥有的帐户是相同的,不同的是你所拥有的帐户的私钥掌握在你的手里,智能合约的则是掌握在合约部署者的手里。关于智能合约,可以用我们非常熟悉的面向对象的概念做个类比:我写了一个类 Class,那我可以生成很多的实例,然后在区块链世界里面我有一份智能合约源代码,可以部署到上面介绍的几个以太坊网络上面,每部署一次产生的合约实例都是不一样的,是完全不同的帐户,这个应该是很多做 DApp 开发的工程师迷惑的地方,也是智能合约不能升级的原因。现在也有一些比较 “Trick” 的方法可以完成合约的热更新,刚兴趣的同学可以自己去搜。智能合约的源代码大多数情况下是用 Solidity 编写的,合约帐户和普通帐户之间的关系用上面这张图说明一下,开发者通过向以太坊网络发送一个交易创建合约实例,拿到合约实例地址,有了合约实例地址之后普通用户可以和合约交互。比如说是 EOS 众筹时,实际上是在以太坊上发布了一个智能合约,每天都有人参与进去,参与时把代币取回来的时候就是在调对应的合约。合约和合约之间也是可以交互的,合约帐户是被称为内部帐户,而普通用户帐户通常被称为外部帐户。开发环境准备接下来是第二个主题 —— 开发环境的准备。需要在以太坊这个区块链上做开发,要有什么条件才可以开始呢?只有两个关键点:因为它是P2P网络,交易、合约部署都需要节点,就是说你需要有一个节点,然后任何活动都需要有帐户,即使说你调一个不花钱的合约方法也是需要帐户的。具体点来说,第一个必要条件是测试网络节点。有好多种方法,第一个自己跑一个节点,称其为私链可能不够准确,那这个方法实施或者是理解的成本对于不做底层的同学稍微高一点,不建议做应用层的同学采用;如果说想把控制权掌握在自己手里的话,那还是非常建议做这个事情。本地开发调试可以使用 Ganache,方便地在本地起一个节点来处理交易,还有 Remix,它提供在浏览器内部的 JavaScript 测试网络。成本非常低,打开就可以用,本地测试非常的方便,Ganache 和 Remix Javascript VM 内置了已经解锁的帐户,不需要去关心帐户的私钥或助记词。还可以使用共享测试网络,就是前面提到的 Rinkeby、Ropsten 和 Kovan,使用这几个作为网络入口的节点,我们不需要自己跑节点。infura.io 则是为广大开发者提供区块链接入的服务,不过使用他需要我们有自己注册、自己管理钱包和帐户。这二个必要条件是帐户和余额,因为以太坊上的任何操作都需要帐户才能够发起,所以我们需要创建钱包和帐户。我们开发的 DApp 是运行在浏览器里面的,对于 PC 端来说钱包最好是能和浏览器无缝集成的。目前社区中有个很好的选择是 Metamask,它实际上是一个浏览器插件,但是 Metamask 历史上出了一个安全事故,有人发了个假的 Metamask,有一部分的用户上当了,因此大家安装的时候一定要认准狐狸图标。另外一点以太坊上的很多交易都是要收费的,这个也是它现在最大的痛点,部分区块链项目在解决这个问题,目前我们开发还没有办法绕过他。在做DApp 测试的时候我们不需要去花费真金白银,可以使用不同的测试网提供的 faucet 给测试网的帐户充值,即把 ETH 充到 Metamask 钱包里面。以上就是准备开发环境的两个必要的条件,需要动手做的就是 Metamask、充值还有注册 infura.io。智能合约工作流接下来是如何做一个完整的应用。对应到传统的应用开发,先要有一个后端然后有一个前端,我们先介绍后端部分。后端在以太坊上面可以粗暴的用智能合约代替,复杂应用中所有的数据应该不是全部存储在以太坊区块链上,有一部分数据是存在传统的数据库里面,这里我们简化设定所有数据都存在链上。做智能合约开发有两种方式,第一种是通过 Remix 在线 IDE ,这个 IDE 还算好用。另一种方式,对于前端来说,就是用你熟悉的编辑器加上你熟悉的语言去做。Remix 适合做我们快速的验证概念和原型,在 Remix中可以快速写合约代码,然后调用它的合约接口,测试它的行为,此外还可以测试已有的合约实例,我们可以从以太坊的线上环境和测试环境把合约实例加载到 Remix 里面然后测试,也可以通过 Remix 把合约部署到任何以太坊网络上面。Remix 还可用来做单步调试,当你发现合约某一些接口有奇怪问题的时候可以用 Remix 做单步调试。但是 Remix 有个明显的缺点,在传统的软件开发工作流里面,通常会有版本管理,在 Remix 里是做不了的,但在我们自己的工作流里面是可以的,我们可以用 Git 做版本管理,然后保存合约编译部署的结果,最重要的一点就是能把可以自动化的都自动化了,因为自动化之后出错的可能性会小很多。通常在实际的工作当中或者是说学习过程当中这 Remix 和自动化工作流会结合使用,来回切换使用。接下来就是实战 DApp 里面用到的非常简单的智能合约,可以认为这是一个以博彩原型,代码非常简单,合约有两个属性,合约的管理员,以及谁参与了博彩活动。构造函数作用是设定合约管理员,然后参与抽奖/下注接口,再然后是随机数函数,在以太坊区块链里面没有非常好的随机数的方法,合约部署到以太坊上之后随机数的代码别人是可以看到的,它能够知道你种子是怎么来的,然后很容易被操控。pickWinner 是开奖接口,里面调用了随机数的函数,然后把整个奖池里面的钱都转给赢家。合约本身是不收任何手续费的,只不过是在调用接口的时候收手续费。modifier 是做了安全的限制,开奖的接口只能是合约的管理员才可以调用。安全、权限也是智能合约要重点考虑的问题,最近两个月爆发出来的合约的漏洞非常多,有一部分安全限制,还有一部分是溢出,值得大家关注。合约在 Remix 里面的工作流,简单给大家演示下,在 Remix 里选 JavaScript VM,它是 Remix 提供的跑在浏览器内存里的一个测试网络,它的响应速度非常快,选择 JavaScript VM 之后默认这有几个帐户,里面的余额是 100 ETH,点击 Deploy 把合约部署一下,可以看到很快合约实例就有了,实例界面中红色的是合约接口,蓝色是合约属性。然后我们怎么去下注呢?可以看到下注并不需要提供参数,下注金额需要在发起交易的地方填写,用合约管理员下注一次,现在玩家有一个人,下面换一个帐户,再下一次注,就是模拟两个人,这里就变成了两个人。用第二个帐户去调开奖接口时候直接报错了,那是因为我们的合约代码里面强制了必须是管理员才可以调用,失败的例证就是没有人拿到奖池里面的钱,把帐户切回去重新调开奖接口,可以看到第一个人拿到了奖池里面所有的钱,这个是非常简单的 Remix 合约工作流演示。那怎么把这个 Remix 里面做的事情自动化?接下来我介绍一下怎么在 Node.js 里面做智能合约的工作流。我先介绍两个工具,第一个是把智能合约的源代码编译,编译会产生字节码 ByteCode,这个是部署到测试网络时用的;以及接口声明 ABI,通过 ABI 实际业务代码就能知道这个合约到底暴露了哪些接口,每个接口接收参数的类型和数量。接下来工作流里做的事情就是围绕这个图展开的,可以看到这里面用到了 web3.js,可以把 web3.js 理解为应用层的代码通向以太坊网络的一个桥梁。它作为桥梁的方式是可以使用很多不同的插件,在 web3 里面叫 Provider,我在浏览器当中运行时,Metamask也提供了一个插件;在本地的话,Ganache-cli 提供了一个插件;如果只想调用 infura.io 提供的入口节点,那可以通过 HTTP Provider。我们要做的第一步把智能合约的源代码变成可以部署到以太坊网络上的 ByteCode 以及我们应用层代码可以使用的 ABI。编译脚本的代码也很简单,我们可以把文件读出来,准备一个结果保存目录,然后调用 solc 的 compile,接下来会处理编译结构里面的错误,最后把编译结果写到文件系统里面。合约构建完之后怎么通过 web3 测试它?直接使用 Ganache-cli 就行了,我们在测试合约代码之前,要初始化 web3 的实例,直接使用 Ganache的 Provider 插件。测试里面我们会先创建一个隔离的测试环境,即跑每个测试的时候我们会重新部署合约,然后调用这个新合约上的方法,或者是尝试修改他的状态,最后对他的状态做断言。接下来是部署合约,在创建 Contract 的时候我们要把 ABI 传进去,在 Deploy 里把它的 ByteCode 传进去,可以看到我们做任何事情都需要有帐户,gas 是我们愿意为这个操作最多支付多少的手续费。关于 gas 有两个参数调节,一个是 gas limited,另一个是 gas pressed,感兴趣的同学可以自行去研究。再来看一个抽奖合约完整的流程测试,先调用下注接口,用得还是解锁出来帐户里面第一个,然后取出来合约的玩家,确认玩家是我们下注过的人,接下来检查帐户 initialBalance 和账户抽奖完成之后的余额状态。在这个地方调用了开奖接口,开奖之后对于部署合约的帐户的余额做了一个断言,最后是我们断言中每次开奖之后这个合约里面的玩家要被清空。合约部署所需要做的事情跟合约自动化测试时做的事情有很多相似的地方,不过部署的网络不是 Ganache-cli 提供的本地网络,而是 Rinkaby 测试网络,这里用到了一个插件,我们可以提供一个钱包的助记词,以及一个网络入口的节点,它通过 HTTP 的方式给节点发送消息进行交易。接下来做的事情跟每次隔离测试环境类似,先解锁帐户,然后部署合约。因为我们是部署在真实的测试网络上,这个过程通常花费的时间比较长。每次部署完之后我们会有一个合约帐户的地址,我们可以通过这个地址跟合约交互。最后是把整个流程串起来的过程,部署之前必须要重新编译,并且确保所有单元测试在最新的合约上是可以完全通过的。DAPP构建和部署合约部署完之后,我们在以太坊的区块链上已经有一个我们可以直接与他交互的后端了,那接下来我们需要写的就是做这个应用层的代码和后端的交互,以及给DApp加上界面。从技术视角来看这个DApp的本质,我们这没有讨论商业和其他方面的东西,就是 DApp 可以理解为就是小白用户可以使用的,可以和前端数据交互、读取的界面。它的形态可以是很多种,可以是 Web、App,也可以是桌面软件。如果是非常简单的 DApp 你可以做成以区块链为后端的单页应用。接下来我们做一个非常简单的抽奖或者是博彩的 DApp,可以使用 create-react-app,使得我们的技术栈变得非常简单。还有一个是 web3.js,合约工作流里面用的比较多,在 DApp 里面用 web3.js 是跟 ABI 打交道。如果开发完,整个合约加上 DApp 的目录结构如同上图的,编译部署脚本和测试脚本分别放在对应的目录下面。抽奖 Dapp 可以说是相当简单,甚至相当简陋,我们可以把界面对应到合约的源代码上面,现在奖池的金额有 1 个 ETH ,有 1 人参与,但这个 Balance 属性在之前的合约代码中没有提到,实际上合约实例是一个帐户,那在任何的一个帐户上面都是有余额的,共有 1 个人参与抽奖,有两个按钮,一个是下注,调用的的合约接口是 participate;还有就是开奖,对应的接口是 pickWinner。下面我们来看一下大概的关键代码实现。第一个就是使用 web3 把我们的桥梁建起来,这里面我们假设使用这个 DApp 的用户安装了 Metamask,第二个关键的地方是我们新建这个合约的时候不像部署和编译脚本,传入了一个地址,这个不是完全新建的合约实例,而是从这个地址把这个合约加载进来。DApp 和智能合约关键的交互就是两点,一个是读取合约数据,还有一个就是提交数据。那可以看到这里面我们在界面上显示三个属性,一个是管理员,一个是玩家的数量还有一个是合约里面奖池的金额,也就是合约实例他的帐户余额,这里面调的三个接口都是异步的。渲染合约数据因为是 React 语法也比较简单,DApp 开发的同学一定要注意单位之间的相互转换,我们展示给用户的是ETH。修改合约数据有一个是触发点在下方,给这个按钮绑 onClick,里面做的事情实际上是调取了合约的方法然后把组件状态做了一些变更。在提交交易的时候那我们在组件上设置 loading 状态,loading 状态下按钮是不能重新点击的,然后调 participate,如果安装了 Metamask,传给合约的值要填写进去,等我们这个操作完成后,我们会把这个页面刷新一下,合约数据状态会被重新加载。真正要做出用户友好的 DApp,需要在这个基础上做很多的事情,比如说点击按钮并安装了这个 Metamask 的之后,用户的屏幕上马上就弹出了一个 Metamask 交易确认界面,会使用户疑惑,我明明在用你这个网站怎么出来了一个我没有见过的东西,弹出 Metamask 交易确认框过程当中需要给用户一些提示,让用户不会感觉到意外。抽奖 DAPP DEMO抽奖 DApp 流程我已经部署到我在阿里云上的一台机器上面,部署的过程跟传统的 WEB 应用的部署类似,部署前需要对代码做构建,构建使用 create-react-app 内置的构建脚本就可以了,构建产生的是纯静态文件,然后我们用 express 来启动极简的 http 服务,管理服务进程使用 pm2,部署和构建的过程也可以使用 npm script 串起来。结束语到这里我要分享的内容就结束了,区块链领域虽然已经存在了 9 年,但是开发者大量涌入是在最近这一两年的时间,这个领域里面有很多的概念的同时,也有比较好的实践,欢迎大家在微信群里跟我多多交流,谢谢。
2023年03月24日
3 阅读
0 评论
0 点赞
2023-03-24
技术形态与成交量分析
人生没有如果,命运不相信假设。曾经的拥有,感恩就好;错过的美丽,回味就好;爱过的人,记得就好,无须苦苦纠结,无须时时懊恼,轻装上阵,才能有一个轻松快乐的旅程。 复制代码一、顶部形态1. 特征一轮上涨趋势已经持续较长时间,或币价已经有较大的上涨幅度 趋势即将反转的第一个信号,经常是重要的趋势线被突破 大盘币开始向下破位是整个市场的危险信号 各项指标走坏(均线、MACD 等) 顶部形态波动性较强 顶部形态形成的时间越长,形态越大,转势后的下跌幅度也越大 顶部形态形成的时间要比底部形态形成的时间短 顶部形态的出现往往表现为放量特征 2. 单峰顶 - V 字顶,V 形反转经过长期的上涨,市场处于失控的状态 成交量常常放量,也有一部分呈现量价背离,越往后越缩量 见顶时常常是经典的 K 线反转组合 结合岛形反转意义更强烈(岛形反转币圈较少见) 3. 单峰顶 - 圆弧顶经长期上涨之后滞涨,走出一个圆弧形转而下跌 先放量上涨后圆弧顶逐步缩量,之后放量下跌,放量的圆弧也有,但是较少 中间的小 K 线常常会有较长的上影线 圆弧顶往往时间较长,反转后破坏性较大 出现概率较小 4. 双峰顶 - M 形顶最常见的顶部形态之一,多数右峰高度小于左峰少数高于左峰 交易量往往第一个峰较重,第二个峰较轻 跌破 D 点后常常会出现反扑,反扑常回向 D 点附近 跌破 D 点时交易量放的越大,反扑的余地便大为减小,同时反扑应伴随较轻的交易量 5. 延伸 V 形 - 单头顶左延 V(左头肩)、右延 V(右头肩) V 形顶变体,具备 V 形顶的特征 左肩、右肩一般向下或者横盘(逆着原趋势) 在左肩、右肩时成交量往往会有所下降,恢复趋势后成交量再次回升 6. 头肩顶、三重顶三个山峰,中峰最高,非常常见可靠的顶部形态之一 多数右峰高度小于左峰,少数高于左峰,单低于中峰 头肩顶每一轮上涨的交易量逐渐减轻为好 跌破 F 点后常出现反扑,反扑常回向 F 点附近,跌破 F 点放量越大反扑的余地越小,同时反扑应伴随较轻的交易量 note一定要杜绝追高:风险第一、利润第二 二、底部形态1. 特征一轮下跌已经持续较长时间,并且有较大的下跌幅度 长期下跌趋势线被突破 大盘币企稳是整个市场企稳的信号 各项指标走好(均线、MACD 等) 底部形态波动性较小 底部形态形成的时间越长,形态越大,转势后的上涨幅度也越大 底部形态形成的时间要比顶部形态形成的时间长 底部形态的出现常常表现为缩量的特征 2. V 形底常见的底部形态,行情波动剧烈能快速获利 前期快速下跌持续缩量之后快速放量反弹 回调一般只有几根 K 线,且快速放量反弹 入场点为缩到地量的 K 线(比前边 K 线一倍左右)或者突破缩量整理的一组 K 线入场 3. 圆弧底经长期下跌后走出一个圆弧形转而上涨 下跌过程逐渐由放量到缩量,之后再次放量向上盘升 圆弧底持续时间越长,反弹后涨幅也会越大 出现概率较小,大周期更容易看到 4. W 底(双重底,双谷底)多数右侧底高于左侧,成交量左侧底偏大,右侧底偏小 双重底之间的时间越长越好,双重底突破时若形态紧凑是第一个买点 双重底突破后多数会有缩量回踩确认,此时也是一个较好的买点 5. 右延 V(右头肩底)V 形底变体,比 V 形底形态更大,可靠性更高 入场点为右肩缩量整理阶段或放量突破右肩 6. 头肩底、三重底头肩底向上过程放量回调缩量为好,右肩向上突破时放量为好 右肩高于左肩最好,但不宜太高,持续时间越长底部越夯实越稳定 头肩底突破时若形态紧凑是第一个买点 头肩底突破时多数会有一个回踩确认,同时也是一个较好的买点 三、中继、持续形态1. 特征处于涨势或跌势中间的整理形态,出现在涨势中后市看涨,出现在跌势中后市看跌 成交量呈现缩量的状态,时间周期通常要短于反转形态 再次放量突破形态为主要入场点 2. 三角形币圈三浪结构居多,股市五浪结构居多,后面每一浪都小于前面浪的高度 上边线向下倾斜,下边线向上倾斜,上下边线延中线对称 突破位置在三角形横向和宽度的 1/2 到 3/4 位置处 三角形整理时逐渐缩量,突破时放量,有时在突破后会有回踩确认 3. 矩形/箱体币圈三浪结构居多,股市五浪结构居多,上下边线水平在一个箱体中震荡 矩形整理时逐渐缩量,突破时放量,有时在突破后会有回踩确认,同时也是一个入场点 4. 旗形、楔形币圈三浪结构居多,股市五浪结构居多,边线沿逆势方向 整理时逐渐缩量,突破时放量,有时在突破后会有回踩确认,同时也是一个入场点 5. 末端楔形币圈三浪结构居多,股市五浪结构居多,一般出现在极速上涨或极速下跌之后,边线上下收敛沿顺势方向 整理时逐渐缩量,呈现量价背离 反转的形态极易出现反转
2023年03月24日
5 阅读
0 评论
0 点赞
2023-03-24
虚拟币背后的区块链技术能给金融行业带来哪些变革
区块链起源于比特币,是在创建比特币时设计的一套分布式数据库技术。区块链具有去中心化、信息高度透明、不易被恶意篡改、数据可追溯等特点。而这些方面恰恰是金融领域多年来容易出问题、或者需要高成本投入解决的问题。区块链技术是互联网金融领域内的重大技术创新,他对现有金融基础设施产生颠覆性破坏的同时又有神奇的创造。信任是金融业的基础,为维护信任,传统的金融业的发展催生了大量的高成本、低效率、单点故障的中介机构,包括托管机构、第三方支付平台、公证人、银行、交易所等。 区块链技术使用全新的加密认证技术和去中心化共识机制去维护一个完整的、分布式的、不可篡改的账本,让参与者在无需相互认知和建立信任关系的前提下,通过一个统一的账本系统确保资金和信息安全。区块链接的分布式记账、P2P网络架构、基于机器算法的协商一致的自治协议、安全的数据储存传输使用规则、可持续运行的激励机制、开放式的系统来最大程度的去中心化,确保这个系统对任何用户都是“中性”和“可信”的, 从而为交易各方的经济活动建立信任环境,这对金融机构来说具有重大的意义。区块链技术的嵌入则可能会将互联网金融的意义深化,其中一个重要方面是,可通过程序化记录、储存、传递、核实、分析信息数据,从而形成信用。相较于传统的信用形成方式,区块链可省去大量人力成本、中介成本,所记录的信用信息更为完整、难以造假。除了上述提到的特性外,区块链能够被称为颠覆性技术的主要原因是智能合约。智能合约意味着区块链交易远不止买卖货币这些交易,将会有更广泛的指令嵌入到区块链中。传统合约是指双方或者多方协议做或不做某事来换取某些东西,每一方必须信任彼此会履行义务。而智能合约具备三个特点:自治、自足、去中心化,智能合约无须彼此信任,因为智能合约不仅是由代码进行定义的,也是由代码强制执行的,完全自动且无法干预。在区块链2.0中,重要特性是的是智能合约和智能资产,这些是可编程金融经济的技术基础,会给金融服务业带来最具颠覆性的改变。目前已有多家金融机构通过各种方式布局区块链领域,区块链技术在金融的应用越来越广泛和深入,下面列举一些比较主流区块链的金融应用场景。1.证券登记发行与交易利用区块链技术的安全透明可靠性,可以大大减少交易所操作成本,提高操作速度。通过区块链来发行的数字股票证券,将证券的登记、交易、结算和信息完全记录在去中心化账本中。其中,纳斯达克已经推出其基于区块链技术而建立的新平台 Linq ,该平台将促进其私人证券市场的股份以一种全新的方式进行转让和出售。Linq的客户们将会有一个让人容易看懂的历史发行记录,并且能转让他们的证券,让他们的记录更容易的进行审核,在发行治理和所有权转让方面赋予他们更多的权限。2.投票系统代理投票就是由一家上市交易所使用一项重要而又费时的操作,在整个股票市场里,股东投票不仅非常频繁,也是很重要的程序。如果能通过区块链的方式,可以以非常低成本进行使用区块链技术管理代理投票系统可以让股东们不必出席公司周年大会就能参与在大会上的投票。基于区块链的投票,节省成本的同时,也避免舞弊或其他无效投票,将更侧重于透明性、安全性和可跟踪性,另外配合智能合约,更可以推动投票后的相关合约和流程的自动执行。交易清算 传统的金融交易清算周期长和成本高昂,引入区块链技术,能够加快传统金融交易中心化的交易缓慢和低效的后端运作,并且重塑交易和结算流程。区块链的分布式账本和智能合约技术特性,能够为金融市场带来庞大的低成本计算能力和实时清算能力,它能够让数字资产在交易的对手方之间进行高效移动,而不需要任何中央机构来负责记录交易。一个共享的数字公开账本能够持续被维护,确认所有参与链上的交易,防止欺诈,对全球金融交易、清算和结算带来了一个重大的变革机会。澳大利亚股票交易所正在选择使用区块链技术,作为其清算和结算系统的替代品,他同一家名为Digital Asset的美国公司合作,来为自己搭建新的交易系统,因为区块链能够降低清算和结算交易的成本和复杂性,并能节省时间。4.权益证明与股权众筹区块链每个参与维护节点都能获得一份完整的数据记录,利用区块链可靠和集体维护的特点,可对权益的所有者确权。对于存储永久性记录的需求,区块链是理想解决方案,适用于土地所有权、股权交易等场景。区块链股权登记,将充分利用区块链账本的安全透明、不可篡改、易于跟踪等特点,记录公司股权及其变更历史。股权所有者凭借私钥,可证明对该股权的所有权,股权转让时通过区块链系统转让给下家,产权明晰,记录明确。整个过程无需第三方的参与。股权众筹基于这个体系,可以进一步促进股权流通和资源共享,股权转让和登记更安全便捷,众筹平台之间投资人和项目可共享。而区块链的智能合约可以跟踪募资过程,设定达到众筹目标自动从投资者账户划款到创业者账户,创业者以后的预算、开销可以被跟踪和审计,增加透明度,更好的保障投资者权益。征信 金融经营的核心价值在于信用,可以说没有信用就没有金融。区块链技术天然适合征信系统,区块链的特性如:数据不可逆、无法篡改,数据由全体参与者共同维护等特性,如果大量的信用和交易数据存在区块链里面,基于这个数据的分析和挖掘会大量再次进一步降低我们征信成本。传统的征信主要采用的模式是中心记录,中心查询模式,存在信息不完整、维护成本高、数据滞后等问题。而征信数据的查询也存在不完整、数据不准确、使用效率低、使用成本高等问题。在征信这一领域,区块链的优势在于依靠程序算法自动记录海量信息,并存储在区块链网络的每一台计算机上,并存储在每个节点上,信息透明,防止篡改,使用和维护成本低。6.数字票据数字票据是结合区块链技术和票据属性、法规、市场,开发出的一种全新的票据展现形式,与现有的电子票据体系的技术架构完全不同。数字票据既具备电子票据的所有功能和优点,又融合了区块链技术的优势,成为了一种更安全、更智能、更便捷、更具前景的票据形态。应用了区块链技术的票据交易,所能彻底解决许多违法违规的问题。一张票据从申请、发行、交易、承兑,这整个流程的关键信息,都会记录在区块链上,无法篡改数据。数字票据一旦交易,将不会存在赖账现象,同时也便于监管部门审计和查询,实现监管政策全覆盖和硬控制。另一方面,数字票据里面的数字货币转移路径明确,也是无法被第三方经手的。外汇转账和结汇 高昂的手续费和漫长的转账周期一直是跨境支付和结汇的痛点。而基于区块链或分布式网络技术的跨境汇款和结汇可以在去中心化的机制下使用户以更低的费用和更快的速度完成跨境转账和结汇。基于区块链的全球转账和结汇系统一方面通过引入网关系统来解决非熟人之间转账汇款的信任问题,用户与网关之间的关系在整个系统中反映为一种债权债务关系,这种债权债务关系会通过分布式网络储存在若干个服务器上,服务器之间以P2P的方式进行通信以避免单一、集中式服务器所带来的各种风险,系统通过一定的加密技术确保数据安全。;另一方面根据共识,设置多个可选择结算加密数字货币来在每个交易过程中起到一个类似保证金和交易费的作用,由此来提高恶意攻击者的攻击成本以保证运行安全。8.支付当前的支付模式,不论是银行体系的支付,还是第三方支付公司的支付,都是中心维护模式。交易记录,账户余额,账户安全管理都是以中心支付系统为核心来构建的,现行的支付存储体系由很多机构以及庞大的基础设施系统组成,在互联网化的今天,这一体系实际上牺牲了技术性的效率,使用成本非常高。这样的支付体系存在着安全风险和单点故障、基础设施上投入太多、维护成本高、垄断和集体欺诈等诸多问题。区块链技术改变移动支付的几种方式:更安全:以区块链技术为支持的交易是基于一个防篡改的账本,想要闯入用户账户会非常的困难。即时支付:通过使用区块链的分布技术,支付就能够真正地达到即时。P2P借贷:通过使用区块链技术,借款人可以直接获得贷款而不需要传统银行或金融机构的介入。跨境支付:区块链可以允许移动用户向世界上任何人进行转账而不需要支付高额的服务和交易费用。可追溯支付:所有的交易都记录在一个公开的账本上,所有商家可以监视支付交易,可以衍生配合更多的联合营销手段。物联网支付:物联网和区块链技术集合,简化你所有的设备之间的连接,随时随地通过智能物联设备进行消费和支付而不用担心诈骗。数字货币 从2009年比特币诞生以来,在全世界掀起了很大浪潮,当然也有引起了不小的争议和对比特币的抵制。但是从最近一两年开始,国家和金融机构都开始关注比特币背后的区块技术,他能够在现在的金融体系里面起到什么作用,是不是可以提升效率降低成本。各国央行探索电子货币领域(现在简称为区块链金融或互联网金融),不再是探索禁止其进入市场,而是希望开发出完全替代现金的数字货币。央行们目前正积极和开发数字货币,未来数字货币不仅前景明朗甚至已经上升到国家战略层面,数字货币的发行不仅仅会重塑存款人的行为方式,也会重构整个经济的运行模式。基于区块链等技术的数字货币,将可以有效降低传统纸币发行、流通的高昂成本,提升经济交易活动的便利性和透明度,同时有助于建设全新的金融基础设施,进一步完善支付体系,提升支付清算效率,推动经济提质增效升级。除了这些,区块链正在更广泛的金融领域在做出更大范围的探索,如公共养老金登记注册、债券、联合贷款、互惠信贷、回购交易、抵押品管理、期货和期权等等应用。区块链技术,正为金融走向全面数字化、去中心化、智能化等方面提供了全新的思路,他将重新定义现代金融和创造更多新的商业和经济模式。
2023年03月24日
8 阅读
0 评论
0 点赞
2023-03-24
Showtime 网站正利用浏览者的 CPU 挖门罗币
原文链接:www.solidot.org
2023年03月24日
6 阅读
0 评论
0 点赞
2023-03-24
两张趣图理解http状态码的含义
原文链接:mp.weixin.qq.com
2023年03月24日
7 阅读
0 评论
0 点赞
1
...
4
5
6
...
11