区块链之智能合约 solidity踩坑 --上篇

概述

最近在写合约时遇到一些坑,做一下总结;

介绍主要分一下三个方面:

  • 对区块链的简单描述
  • 结合业务场景,编写简单智能合约,时遇到的坑(上篇)
  • assembly 的使用说明(下篇)

正文

进入正题之前,我稍微简单介绍一下什么是区块链,区块链干嘛用的(特点),智能合约是做什么的,为什么要写只能合约(一下是个人理解仅供参考)

什么是区块链

A blockchain is a globally shared, transactional database.

译文:区块链是一个全局共享的事物数据库;(就是个数据库)

区块链特点

既然当前区块链这么火,那么总要有火的理由吧,它到底用来干什么的呢?而体现区块链本身的商业价值,说白了就是能靠它的独有的特点赚钱;

  • 分布式结构
  • 信任机制
  • 公开透明
  • 时序不可篡改

区块链工作原理

  1. 客户端将发起一笔交易,经数字签名后广播给网络上的其他节点并等待确认
  2. 网络中的节点对收到的数据记录信息进行校验,通过校验后,数据记录到一个区块中
  3. 全网所有接受节点对区块执行共识算法,区块通过共识算法过程后正式纳入区块链中存储,全网节点均表示接受该区块。表示接受的方法,是将该区块的随机哈希值视为最新的去区块哈希值,新去块将提供永久和透明的交易记录并以该区块链为基础进行延长,实现资金转移。

什么是智能合约

A contract in the sense of Solidity is a collection of code (its functions) and data (its state) that resides at a specific address on the Ethereum blockchain.

译文:Solidity意义上的合约是代码(其功能)和数据(其状态)的集合,它位于以太坊区块链的特定地址。

关键字:code (its functions) 、 data (its state)、address

踩坑

在写合约时遇到一下几个问题; 其实这些问题google上都能查到,但也是需要大量时间,有些还不一定对,小编对下述问题做一个总结与归纳;以后也给自己方便;

  1. 合约方法能返回struct结构吗? 能要怎么做?

答:Yes, but only in internal function calls.

使用 internal 时,与平时的 function 写法一样即可

  1. 合约方法能对string进行字符串拼接操作吗?

答:You have to do it manually for now.

说白了就是没有,要自己实现; 方案1:https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol

方案2:这是小编根据google查得做了一些小改的,仅供参考

   /// 内部访问函数,internal
   /// 实现将string _a, _b1,_b2,_c拼接成一个string
   function strConcat(string _a, bytes1  _b1,bytes1 _b2, string _c) internal pure returns (string){
       bytes memory _ba = bytes(_a);
      bytes memory _bc = bytes(_c);
       string memory abcde = new string(_ba.length + _b1.length + _b2.length + _bc.length);
       bytes memory babcde = bytes(abcde);
       uint k = 0;
       for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i];
       for (i = 0; i < _b1.length; i++) babcde[k++] = _b1[i];
       for (i = 0; i < _b2.length; i++) babcde[k++] = _b2[i];
       for (i = 0; i < _bc.length; i++) babcde[k++] = _bc[i];
       return string(babcde);
   }
  1. 合约方法能返回数组类型吗?

答:可以,但不能返回动态数组; 什么意思呢,就是说可以 int[] uint[] 等等,如果是string[] 则需要给string []定length长度,否则编译失败; 那么业务上就需要 returns(string[])怎么办? 小编的解决方案是return string来代替,将每一个string拼接起来,拼接符可以用ASCII码中不可见字符如:0x01,0x02等等,千万别用常见字符;(之前做hyperledger fabric的java sdk解析时发现也用到了)

说明编码这里顺带说一句,

All identifiers(contract names,function names and variable names) are
restricted to the ASCII character set. It is possible to store UTF-8
encoded data in string variables.
  1. 能对address 类型进行算术操作吗?

答:The address type is a 160-bit value that does not allow any arithmetic operations.

  1. solidity 的版本会影响 evm的编译吗?

答:据我所知,没有影响,因为对evm来说它只是执行了,solidity通过solc编译之后产生的bin、abi文件,进行编译;

solidity的版本若高于solc编译环境的版本则会无法编译

本文篇幅没啥干货,就随意聊聊浅谈一下;

原文地址:https://www.cnblogs.com/chenshouchang/p/9860919.html

时间: 2024-10-31 05:27:34

区块链之智能合约 solidity踩坑 --上篇的相关文章

解读区块链智能合约!

解读区块链智能合约! 区块链和智能合约技术的广泛适用性使得该领域参与者按照各自所在学科来解读它,因此现在还缺乏统一的术语定义,对于一个发展如此快速的技术领域来说是一大缺憾.本文作者Josh Stark是律师和区块链咨询开发公司Ledger Labs的运营和法律主管,总结了现在智能合约定义的分类,以及各自的缺陷,呼吁两类参与者互相学习,达成一个合理的定义. 智能合约没有清晰确定的定义. 这个创意以下一代区块链平台核心的地位出现在公众视野,同时被视为企业实际应用的关键特性. 还有人把它描述为“自主机

用Java为Hyperledger Fabric(超级账本)编写区块链智能合约链代码

编写第一个 Java 链代码程序 在上一节中,您已经熟悉了如何构建.运行.部署和调用链代码,但尚未编写任何 Java 代码. 在本节中,将会使用 Eclipse IDE.一个用于 Eclipse 的 Gradle 插件,以及一个名为 ChaincodeTutorial 的 Java 链代码框架项目,编写第一个 Java 链代码程序.您将从我为此教程创建的 GitHub 存储库中获取框架代码,将该代码导入 Eclipse 中,添加代码来让链代码智慧合同按要求生效,然后在 Eclipse IDE 内

第一行代码:以太坊(2)-使用Solidity语言开发和测试智能合约

智能合约是以太坊的核心之一,用户可以利用智能合约实现更灵活的代币以及其他DApp.不过在深入讲解如何开发智能合约之前,需要先介绍一下以太坊中用于开发智能合约的Solidity语言,以及相关的开发和测试环境. 智能合约就是运行在以太坊上的程序.客户端可以通过Web3.js API调用智能合约,而智能合约本身又可以直接访问以太坊网络,也就是说,智能合约前面连接着客户端,后面连接着以太坊网络,起到了承前启后的作用,而且通过智能合约,可以让整个以太坊网络更灵活,可控性更强.其实智能合约的作用相当于微软O

以太坊Crypto Countries加密国家火爆,区块链游戏成智能合约应用探索突破口

继加密猫(CryptoKitties)之后,以太坊上又出现了几款火爆的区块链游戏,它们是CryptoCountries,Crypto-All Stars,CryptoCelebrities和EtherBots. 这几款游戏目前的知名度还不如CryptoKitties,不过相信用不了多久,它们中的某一款肯定会比CryptoKitties更有名. 为什么这么说,因为它们是比CryptoKitties更好玩的区块链游戏,或者说是CryptoKitties的进化版.加密猫(CryptoKitties)是

第19讲 | 上手搭建一条自己的智能合约

上一篇我们聊到了区块链智能合约,我主要介绍了智能合约的概念,但是并没有给你提供智能合约的实际运行案例,那么今天,我们就自己动手写一个智能合约,并且介绍一下智能合约标准模板,供你参考学习, 并搭建起自己的智能合约. 本篇将以以太坊作为基础知识进行讲解,本篇面向没有任何智能合约基础的人群,所以配备了较多的插图和操作命令,如果你正在收听音频,可以点击文稿查看,希望读完这篇文章可以帮助你快速入门智能合约. 搭建一条智能合约 在实际操作智能合约之前,我们首先回顾一下以太坊,以太坊又称以太坊钱包.以太坊钱包

135.003 智能合约后端优化和产品化

@(135- Block Chain| 区块链) Introduction 如何通过数据结构优化降低合约执行成本 合约的继承 巧用modifier 以太坊函数库的使用和基本介绍 如何减少gas 消耗? (本质为节约计算资源,降低时间复杂度的问题) 数组越大,遍历所需资源越多 遍历数组 traverse array--> 映射 Mapping 1 Mapping in Solidity 类比map(c++),dict(python) Hash table Key - Value types of

第18讲 | 智能合约与以太坊

在前面的文章里,我们介绍了区块链的核心技术,也穿插介绍了一些项目.然而每个区块链都有自己的特色,接下来我们将针对每个项目进行详细讲解.今天我们就来讲讲智能合约和以太坊项目. 今天我们从智能合约这个概念入手,聊聊什么是以太坊项目以及它的发展历史.最后还会介绍几款钱包给你,希望通过今天文章的讲解,你也可以尝试在以太坊上编写简单的智能合约. 智能合约的概念 不同于法律意义上的合约概念,区块链领域的合约表达的是可以“自治自理”的 计算机协议,这套协议具有自我执行.自我验证的属性. 如果完全从技术角度来看

区块链入门(5)Truffle 项目实战,Solidity IDE, 智能合约部署

在上一张我们学习了Truffle项目的创建,部署等相关内容,今天我们就来实战一下. 今天我们要做3件事: 1) 学习搭建一个Solidity IDE(Remix). 2) 使用这个Solidity Ide编写一份智能合约. 3) 在我们前面第1,2,3章中部署的私有网络节点集群中部署这个合约,并能够在不同的节点中调用这个合约. Remix,是一个Solidity开发语言的Ide, 它是一款运行在浏览器端的solidity ide,也是官方推荐使用的ide. 另外还有其它的solidiy ide,

智能合约从入门到精通:Solidity汇编语言

简介:上一节,我们讲过在JUICE平台开发智能合约的开发规范,本节我们将继续就Solidity定义的汇编语言进行更加深入的讨论.Solidity定义的汇编语言可以达到下述的目标:1.使用它编写的代码要可读,即使代码是从Solidity编译得到的.2.从汇编语言转为字节码应该尽可能的少坑.3.控制流应该容易检测来帮助进行形式验证与优化.为了达到第一条和最后一条的目标,Solidity汇编语言提供了高层级的组件比如,for循环,switch语句和函数调用.这样的话,可以不直接使用SWAP,DUP,J