概述

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

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

  • 对区块链的简单描述
  • 结合业务场景,编写简单智能合约,时遇到的坑(上篇)
  • 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编译环境的版本则会无法编译

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

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

  1. 基于Fisco-Bcos的区块链智能合约-简单案例实践

    一.智能合约介绍 智能合约是指把合同/协议条款以代码的形式电子化地放到区块链网络上.FISCO BCOS平台支持两种智能合约类型:Solidity智能合约与预编译智能合约 Solidity与Java类 ...

  2. 以太坊智能合约 Solidity 的常用数据类型介绍

    目录 目录 1.数组 1.1.对数组的增删改查操作. 2.String.Bytes.Mapping的使用 3.Enums 和 Structs 的简单应用 4.Ether 单位和 Time 单位 5.A ...

  3. 记录智能合约solidity编译的坑

    在Linux环境下入门写一段solidity编译遇到error和warning,经过一番研究后才得其缘由,下面以一段demo总结一下. pragma solidity ^; // 指定所需的编译器版本 ...

  4. 智能合约 solidity 开发的环境基本搭建

    以太坊Dapp开发快速入门 以太坊为开源社区,虽然设计东西都很优秀,但是组件十分的杂乱,因此下面首先简单介绍下以太坊的一些常用组件以及各种工具介绍 Geth Geth是由以太坊基金会提供的官方客户端软 ...

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

    编写第一个 Java 链代码程序 在上一节中,您已经熟悉了如何构建.运行.部署和调用链代码,但尚未编写任何 Java 代码. 在本节中,将会使用 Eclipse IDE.一个用于 Eclipse 的 ...

  6. 基于Fisco-Bcos的区块链智能合约-业务数据上链SDK实现

    合约的编写 基于springboot : https://github.com/FISCO-BCOS/spring-boot-starter pragma solidity ^0.4.24; cont ...

  7. 用Java为Hyperledger Fabric(超级账本)开发区块链智能合约链代码之部署与运行示例代码

    部署并运行 Java 链代码示例 您已经定义并启动了本地区块链网络,而且已构建 Java shim 客户端 JAR 并安装到本地 Maven 存储库中,现在已准备好在之前下载的 Hyperledger ...

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

    智能合约是以太坊的核心之一,用户可以利用智能合约实现更灵活的代币以及其他DApp.不过在深入讲解如何开发智能合约之前,需要先介绍一下以太坊中用于开发智能合约的Solidity语言,以及相关的开发和测试 ...

  9. 区块链学习5:智能合约Smart contract原理及发展历程科普知识

    ☞ ░ 前往老猿Python博文目录 ░ 一.智能合约的定义 通俗来说,智能合约就是一种在计算机系统上,当一定条件满足的情况下可被自动执行的合约,智能合约体现为一段代码及其运行环境.例如银行信用卡的自 ...

随机推荐

  1. simpledet 的配置

    simpledet 的配置 1. 通过 docker 配置 simpledet 1.1 系统要求 ubuntu16.04 python >=3.5 1.2 下载 docker 镜像 匹配的版本为 ...

  2. 将WTL应用向导添加到VS2019

    WTL 简介 WTL 全称是 Windows Template Library,像 MFC 一样使用 C++ 的面向对象技术对 Win32 接口进行了封装,使之便于开发 Windows 程序.相对于 ...

  3. vue 中 assets 和 static 的区别

    Vue中的静态资源管理(src下的assets和static文件夹的区别)

  4. iframe 高度自适应

    <iframe id="InputDetail" src style="width:100%"></iframe> <script ...

  5. LinkedHashMap基本原理和用法&使用实现简单缓存(转)

    一. 基本用法LinkedHashMap是HashMap的子类,但是内部还有一个双向链表维护键值对的顺序,每个键值对既位于哈希表中,也位于双向链表中.LinkedHashMap支持两种顺序插入顺序 . ...

  6. JS学习笔记:(三)JS执行机制

    首先我们先明确一点:JavaScript是一门单线程语言.单线程也就是说同一时间只能执行一个任务,所有的任务都必须排队顺序执行.那么如果一个任务耗时很长,阻塞了其它任务的执行,就会给用户造成不友好的体 ...

  7. python 字典用法

    d = {key1 : value1, key2 : value2 } 1.创建 dict1 = { 'abc': 456 } 2.访问/修改 dict['Name'] 3.删除 del dict[' ...

  8. win10的MySQL客户端连接centos7虚拟机的mysql服务端连接不上解决办法

    分别在win10和Centos虚拟机上装有MYSQL,但用电脑的mysql客户端连接centos7的服务端报错如下: 解决办法: 如果可以从虚拟机连接到电脑的MYSQL服务端, 那就是CentOS7的 ...

  9. GWAS基因芯片数据预处理:质量控制(quality control)

    一.数据为什么要做质量控制 比起表观学研究,GWAS研究很少有引起偏差的来源,一般来说,一个人的基因型终其一生几乎不会改变的,因此很少存在同时影响表型又影响基因型的变异.但即便这样,我们在做GWAS时 ...

  10. mysql 数据库学习笔记一

    一.navicat的引入: (第三方可视化的客户端,方便MySQL数据库的管理和维护)安装网址:https://www.navicat.com.cn/ NavicatTM是一套快速.可靠并价格相宜的数 ...