Solidity

分享实录|以太坊开发需知

ε祈祈猫儿з 提交于 2021-02-12 09:07:11
1 以太坊开发与传统应用开发的差异 相比起传统应用而言,以太坊开发引入了新的基础设施,由此必不可少的带来了部署和运维的复杂度,比如作为系统设计者,我们需要做出选择: 自建节点,还是信任第三方节点? 公有链、联盟链、私有链? 由于加入了新的设计单元:智能合约,我们将面对 设计的复杂度 合约的升级问题:因为智能合约一旦发布就无法更改,万一需要更新合约错误或规则,怎么办? 合约的组织问题。 与一般代码不同,合约的好坏直接与金钱挂钩 不安全的合约会造成客户的金钱损失,立竿见影。 合约的每一步都需要消耗gas,不讲究的合约会造成执行成本高居不下。 并且,以太坊本身的限制同样也会影响到整个应用系统的设计和选型: 交易确认需要时间:20笔/秒 交易易受外界影响 交易费的高低 流行应用会造成网络拥堵,从影响交易的确认 相比起传统CS编程,与以太坊进行交互要复杂得多: 需要有钱包账户 发出去的交易需要签名 由于整个过程是异步为主,因此交易需要验证 对于区块链本身的定位,同样也会影响设计: 仅仅用作数据共享和防篡改的基础设施? 围绕区块链打造价值网络? Token设计模式 Token引入对于业务本身带来的影响 这一点尤其差异巨大,不单单像传统开发那样仅仅只需要了解用户的业务就可以开足马力前进。Token设计本身需要一定的经济常识,虽说这部分可以由专业背景的人来设计,但对于开发者和架构师而言

在以太坊私有链上部署智能合约

坚强是说给别人听的谎言 提交于 2021-02-12 05:30:10
上节简单介绍了基于以太坊搭建私有链以及挖矿和交易,在部署智能合约之前请确保私有链上的账户有余额,因为部署智能合约需要消耗 Gas ,而 Gas 需要 ether 币来兑换。 1. 智能合约 什么是智能合约 ?智能合约是 存储在以太坊网络特定地址的一组代码和数据集 。在以太坊网络中智能合约以以太坊虚拟机(EVM)字节码的形式存在,由以太坊虚拟机解释执行。用于编写智能合约常用的语言有 Solidity 、Serpent 以及 LLL ,其中最著名的就是 Solidity 。智能合约的部署和执行都需要燃料(Gas),一旦部署便不能修改。 2. 部署智能合约 部署智能合约可以使用以太坊命令行客户端(Geth Console)和 Mist 。 选用 Solidity 官网的例子 Coin 。 pragma solidity ^ 0.4 .0; contract Coin { // The keyword "public" makes those variables // easily readable from outside. address public minter; mapping (address => uint) public balances; // Events allow light clients to react to // changes efficiently.

Meetup回顾 | 16大技巧快速实现高水准智能合约

不羁的心 提交于 2021-02-11 19:21:37
4月20日,FISCO BCOS开源社区举办了《智能合约实战速成》线上直播Meetup,本次Meetup也是BSN第二次开发者大赛FISCO BCOS赛道的首场培训。FISCO BCOS核心开发者张龙现场传授智能合约开发技巧,助力参赛者更好地实现高水准智能合约。 直播间对智能合约的讨论十分热烈,我们整理了直播的精彩内容以及典型提问,供大家交流学习,演讲PPT也全文提供给大家对照进行开发演练。不方便观看视频的朋友,可以直接阅读后面的文字。 公众号对话框回复【 0420 】获取演讲PPT 什么是智能合约? 智能合约是指把合同/协议条款以代码的形式电子化地放到区块链网络上,通过调用相关条款的接口实现执行,也可以把它当成是一种可自动执行的程序片段。作为区块链的参与者,智能合约既可以接收和存储价值,也可以向外发送信息和价值。 在区块链中,智能合约非常重要,其贯穿了区块链应用开发全流程。 从另一个角度,我们再来看下智能合约在交易执行过程中的重要性。 首先,在交易构建中,我们会进行合约部署与函数调用,合约部署依赖于智能合约的二进制编码。函数调用则依赖智能合约的ABI,这里的ABI是在智能合约编译阶段产生。 交易签名是对构建好的交易进行签名,然后将其在网络上进行交易广播与交易打包。 在交易执行前,需要完成合约部署,把智能合约的二进制编码存放到区块链网络上。交易执行阶段

区块链开发与区块链应用开发

给你一囗甜甜゛ 提交于 2021-02-11 13:23:44
比特币区块链是用C++开发的没错,以太坊和超级账本使用Go开发的。但是以太坊区块链应用开发用的js(web3.js api方便调用),因为我们只是在公链或联盟链上开发Dapp,所以根本只需要会编写智能合约Solidity语言和能够方便调用web3.js api的JavaScrip语言,即可开发以太坊区块链应用。因为比特币区块链网络是写死的,不需要你开发,以太坊网络,超级账本网络也是,所以区块链开发本质上应该指创造区块链的开发,而直接运用现有链开发应用的应该叫做区块链应用开发,这类开发主要以Js为主,项目模板Truffle Boxs大多Js开发。以上Right? 不全对。有区块链开发,也有基于区块链的应用开发。对于区块链开发,用C++或Go开发;而对于区块链应用开发,通常来说是基于以太坊区块链应用开发,那么可以使用任何能发起http请求的语言开发,因为有请求区块链节点的以太坊rpc,调用rpc是通过http post请求进行的,而web3.js是在rpc的基础上封装起来的,因此如果要开发以太坊区块链应用,最快开发效率的应该是Go,因为Go是为Web后台开发而生,C++虽然也能,但是对于Web开发显得乏力,最好使用三方网络库配合,例如360的evpp框架。以上。 自问自答: https://www.oschina.net/question/3649283_2303218 来源:

encode three integers into single integer

非 Y 不嫁゛ 提交于 2021-02-10 09:40:07
问题 I have to encode 3 numbers into the same integer. I have these 3 measurements uint256 carLength; uint256 carWidth; uint256 carDepth; and i want to encode these 3 numbers into the same integer with the possibility to decode. My problem is that I'm not very experienced at this low level. i think about functions like this function encodeNumbers(uint256 a, uint256 b, uint256 c) public view returns(uint256); function decodeNumber(uint256) public view returns (uint256, uint256, uint256); advice on

以太坊智能合约Demo

巧了我就是萌 提交于 2021-02-09 09:50:30
智能合约开发用solidity编程语言部署在以太坊这个区块链平台,本文提供一个官方实战demo示例快速入门,用demo例子深入浅出智能合约开发,体会以太坊构建去中心化可信交易技术魅力。智能合约其实是“执行合约条款的计算机交易协议”。区块链上的所有用户都可以看到基于区块链的智能合约。 维基上说智能合约(英语:Smart contract )是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易。这些交易可追踪且不可逆转。智能合约概念于1994年由Nick Szabo首次提出。智能合同的目的是提供优于传统合同方法的安全,并减少与合同相关的其他交易成本。 由于区块链上的所有用户都可以看到基于区块链的智能合约。这也会导致包括安全漏洞在内的所有漏洞都可见,并且可能无法迅速修复。这样的攻击难以迅速解决。 插曲,2016年6月The DAOEther的漏洞造成损失5000万美元,而开发者试图达成共识的解决方案。DAO的程序在黑客删除资金之前有一段时间的延迟。以太坊软件的一个硬分叉在时限到期之前完成了攻击者的资金回收工作。以太坊智能合约中的问题包括合约编程Solidity、编译器错误、以太坊虚拟机错误、对区块链网络的攻击、程序错误的不变性以及其他尚无文档记录的攻击。 部署智能合约的经典案例有: 以太坊在其区块链上实施了一种近乎图灵完备的语言

solidity string 转成 uint

自古美人都是妖i 提交于 2021-02-03 18:01:12
// SPDX-License-Identifier: MIT pragma solidity >=0.6.12; contract Test { function stringToUint(string memory s) public pure returns(uint) { bytes memory b = bytes(s); uint result = 0; for(uint i = 0; i < b.length; i++) { if(uint8(b[i]) >= 48 && uint8(b[i]) <= 57) { result = result * 10 + (uint8(b[i]) - 48); } } return result; } } 来源: oschina 链接: https://my.oschina.net/Rhynie/blog/4943905

How to deposit ether to an account using solidity and web3?

孤人 提交于 2021-01-29 05:49:21
问题 I am building a sample smart contract . I am trying to deposit ether from 1 account to another but the issue is amount is deducted from the sender's account but not able to deposit to receiver's account. Here is my contract code : pragma solidity ^0.5.0; contract ApprovalContract{ address public sender; address public receiver; function deposit(address _receiver) external payable { require(msg.value > 0); sender = msg.sender; receiver = _receiver; address payable _rec = receiver.make_payable(

truffle+ganache-cli构建简单以太坊智能合约并编译部署

流过昼夜 提交于 2021-01-29 05:08:48
以前接触过以太坊工具链来做区块链练手项目,后来荒废了,如今再次捡起来,算是回忆和加深。 之前可能因为网络的原因,在truffle各种初始化编译合成智能合约都遇到了好多问题,如今再次尝试,发现可以很快入门。 下面来看看如何通过truffle与ganache-cli来构建以太坊合约。 以太坊工具链就不多介绍了,这里面水很深,内容很多,本文需要的主要的就是node环境,然后就是ganache服务,部署合约的时候需要这个服务。truffle是进行合约编译部署的工具,可以初始化项目,编译合约,合成合约,部署合约。 下面来看看如何做一个简单的智能合约。 1、磨刀不误砍柴工; 假定我们已经安装了node环境以及npm等工具。需要全局安装truffle,ganache-cli npm install truffle ganache-cli -g 安装好之后,我们可以看看版本信息: truffle自带solidity版本是0.5.16,web3版本是1.2.9 ganache-cli是ethereum-testrpc的替代,所以不用再安装testrpc了。 我们可以现在就启动ganache服务,它会监听localhost下的8545端口 2、牛刀小试 建立文件夹、初始化以太坊合约项目,编写智能合约。 contracts/HelloWorld.sol 合约文件需要放在contracts目录下

利用mocha进行以太坊智能合约编译部署测试

纵饮孤独 提交于 2021-01-28 09:22:40
使用智能合约编程语言solidity编写的智能合约,除了可以直接通过以太坊的工具链truffle,ganache-cli进行测试之外,还可以结合mocha进行单元测试。 mocha单元测试本质上,还是需要对合约进行编译、部署,只不过可以通过代码的形式进行直观的操作,而不是通过truffle命令来进行编译、部署、测试。 首先,构建工程,我们可以根据构建node项目的方式构建: 添加依赖:package.json "dependencies": { "ganache-cli": "^6.12.2", "mocha": "^8.2.1", "solc": "^0.4.26", "web3": "^1.3.3" } 项目结构这里简单遵循以太坊项目的结构建立一个contracts文件夹,用来保存合约。然后在contracts目录下新建HelloWorld.sol pragma solidity ^0.4.23; contract HelloWorld{ string public name; constructor(string _name) public{ name = _name; } function getName() public view returns(string){ return name; } function changeName(string _name)