批量打标签——在合约函数自动插入内容,使结果可编译

import random
import os
from solc import compile_files,compile_source,link_code
msg = [
       """
    	for (i = 0; i < size -1; i++)
    	{
    		for (uint j = size - 1; j > i ; j--)
    		{
    			if (a[j-1] > a[j])
    			{
    				uint temp = a[j-1];
    				a[j-1] = a[j];
    				a[j] = temp;
    			}
    		}
	    }
       """,
       """
    	bool bSwaped = true;
    	for (i= 0; i< size -1; i++)
    	{
    		bSwaped = false;
    		for (uint n = size - 1; n > i ; n--)
    		{
    			if (a[n-1] > a[n])
    			{
    				uint tem = a[n-1];
    				a[n-1] = a[n];
    				a[n] = tem;
    				bSwaped = true;
    			}
    		}
    		if (!bSwaped)
    			break;
	    } 
       """,
       """
        uint lastSwapPos = 0;
        uint lastSwapPosTemp = 0;
        for (i = 0; i < size - 1; i++)
        {
        	lastSwapPos = lastSwapPosTemp;
        	for (uint p = size - 1; p >lastSwapPos; p--)
        	{
        		if (a[p - 1] > a[p])
        		{
        			uint te = a[p - 1];
        			a[p - 1] = a[p];
        			a[p] = te;
        			lastSwapPosTemp = p;
        		}
        	}
        	if (lastSwapPos == lastSwapPosTemp)
        		break;
        }
       """]

# function 起始位置
newlist=[]
# contract 起始位置
Newlistbegin=[]
# contract 终止位置
Newlistend=[]
# txt内容暂存
Lines=[]


def insertcontent():
    if newlist!=[]:
        # 在function后插入变量
        lines.insert(newlist[0] + 1, """
        uint[] memory a = new uint[](8);
        uint size=a.length;
        for(uint i=0;i<size;i++){
        a[i]=7-i;
        }""" + "\n")
        # 追加冒泡内容
        # 随机生成插入内容的个数
        num1 = random.randint(1, 2)
        if num1 == 1:
            num2 = random.randint(0, 2)
            lines.insert(newlist[0] + 2, msg[num2])
        if num1 == 2:
            # 生成第一个随机函数数
            num2 = random.randint(0, 2)
            lines.insert(newlist[0] + 2, msg[num2])
            # 生成第二个随机函数数
            num3 = random.randint(0, 2)
            # 如果第二次生成的随机数和第一次不同,就再插入,否则当插入一个函数处理
            if num3 != num2:
                lines.insert(newlist[0] + 2, msg[num3])


# 获取文件内容

for i in os.listdir("D:/py代码/未完成"):
    # 打开文件读取文件
    dire = "D:/py代码/未完成/"+i
    file1 = open(dire, "r", encoding="utf-8")
    # 记录代码内容的列表
    lines = [dire for dire in file1]
    Lines.clear()
    # lines复制给Lines
    for p in range(len(lines)):
        Lines.append(lines[p])
    # 获取列表长度
    length = len(lines)
    # 关闭文件
    file1.close()

    # 栈长度初始化为0
    a = 0
    # 插入内容前对代码遍历,生成contract位置的数组Newlistbegin, Newlistend
    for j in range(length-1):
        # 去除内容左空格
        lines[j].lstrip()
        # 记录合约起始位置
        if lines[j][:8]=="contract"  and lines[j].find("{", 0, len(lines[j]))!=-1:
            Newlistbegin.append(j)
            # 通过括号来判断contract的结束位置并记录
            for pi in range(j,len(lines)):
                if lines[pi].find("{", 0, len(lines[pi]))!=-1:
                    a = a + 1
                if lines[pi].find("}", 0, len(lines[pi]))!=-1:
                    a = a - 1
                # contract 结束位置
                if a == 0:
                    Newlistend.append(pi)
                    break


    # 多个合约遍历
    for l in range(len(Newlistend)):
        # 根据contract的位置,生成function{ 的位置
        if (Newlistend[l] - Newlistbegin[l]) >= 2:
            # 一个合约的循环
            for q in range(Newlistbegin[l]+1,Newlistend[l]-1):
                # 有可插入函数
                if q< len(lines) and len(lines)!=0:
                    if lines[q].find('function') != -1 and lines[q].find(';') == -1:
                        # 直到找到"{"
                        while lines[q].find("{") == -1 and q < len(lines)-1:
                            q = q + 1
                        if q < len(lines):
                          newlist.append(q)

                    # 无可插入函数
                    else:
                        # 遍历完该合约
                        if q == len(Newlistbegin) - 1:
                            break
        # 遍历完全部合约
        if l==len(Newlistbegin)-1:
            break
    # 清空合约内容
    Newlistbegin.clear()
    Newlistend.clear()

    # 插入内容
    insertcontent()

    # 打开文件,将lines内容写入,关闭文件
    file1 = open(dire, "w", encoding="utf-8")
    file1.write("".join(lines))
    file1.close()

    # 打开文件获取文件内容,关闭文件
    file1 = open(dire, "r", encoding="utf-8")
    lines = [dire for dire in file1]
    file1.close()

    # 对文件内容进行编译,编译失败的文件被命名为error
    context = "".join(lines)
    try:
        test = compile_source(context)
        # 编译成功的话,清空存放contract和function的数据
        newlist.clear()
        Newlistbegin.clear()
        Newlistend.clear()
    except Exception as e:
        # 清空存放内容的数组
        lines.clear()
        # 代码复原
        for p in range(len(Lines)):
            lines.append(Lines[p])
        # 将不可以插入的function 位置删除
        if len(newlist)!=0:
            del newlist[0]
            insertcontent()
        else:
            # 全部插入失败后输出错误
            print("error==>", e)
            # 更改失败代码的文件名字
            new = "D:/py代码/未完成/" + 'error' + i
            os.rename(dire, new)
        continue
print("Finish!")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值